Структура,поля,физ память

Вопрос назрел ., может кто подскажет .
Есть структура , ее надо сохранить на флешке , структура большая, поэтому оптимально было ее сохранить , скопировав не поля по одному, а область памяти целиком…
Как бы все получилось хорошо , проблемы нет- записал блок, считал блок - структура как и была , ну естественно контрольная сумма после записи и она-же после чтения…Но всплыл единственный ньанс который вызывает , ну опасения ,что ли… Для того , чтоб выбрать нужную мне запись надо проверить поле структуры- индекс , но читать все структуры в буфер, а потом там искать , долго , нерационально т.к много места занимает и т.д .
самый простой способ считать одно поле… но вот вопрос , поля в структуре не всегда располагаются на одном и том-же месте , во первых если дополнить поле , то компилятор может в плане оптимизации расположить его в другом месте в памяти , (я иммею ввиду порядок следования ) ,а также если поле ну допустим 3 , не факт , что оно будет третьим в физической памяти из за выравнивания… а считать одно поле с флешки я могу только считав конкретный адрес… единственное поле, которое видимо не должно меняться по прихоти компилятора это первое… Вопрос ,это действительно так … Действительно оно всегда будет занимать 1 адрес в расположении структуры , если оно обьявленно первым, несмотря на добавление удаление и редактирование новых/ старых полей и не будет смещаться по воле компилятора?
Или это не факт и на это не надеется , а создать отдельно индексную таблицу …,??? Спасибо

Простите, но это бред. Поля всегда находятся там, где им положено.

1 лайк

Понял спасибо…

Начало поля может находиться не там, где ожидает программист, не учёвший выравнивание - это да. Но для этого есть packed атрибут.

Другое дело что в этом деле есть какие-то подводные камни и ЕП мне запретил то ли паковать float, то ли писать/читать его в составе структуры…

Я понимаю… меня интересует первое поле после многократных компиляций в процессе доработки проекта.Для первого поля (оно байт) выравнивание не нужно , а остальные поля мне не важно в каком порядке записаны…, .

Оно будет находится по адресу sizeof(struct)*N

ээээ… а разве не в начале ?

А это что, не начало записи (record) форматом, определенным структурой, и содержащей поля (fields), в числе которых и id / idx?

sizeof(my_profile) возращает 16384 … по кране мере в кубовском компиляторе…адрес структуры &my_profile использовал

Чего… Какой адрес?
Структуру описали? typedef-нули её? Вот этот тип и сайзофте.

я не совсем понял Вашу мысль…

 typedef volatile struct {
	 uint8_t kod;
	 uint8_t errors;
	 uint8_t round;
	 uint8_t mount;
	 uint16_t time;
	 uint16_t t_air;
	 uint16_t massa;
	 uint16_t time1;
	 uint16_t time2;
	 uint16_t time3;
	 uint16_t t_start;
	 uint16_t t_fire;
	 uint32_t adress;
	 uint8_t shksum;
     ProfileFIRE_t p[511];

 } MyPROFILE_t;

Если это имели ввиду uint32_t zz=sizeof(MyPROFILE_t ); то будет размер.

или я туплю ?

Да и собственно меня не место интересовало а неизменность положения этого места

Это и имел в виду.

Адрес экземпляра структуры не обязан быть константным при любой компиляции.

zz Размер структуры - 16384

Вообще - теперь непонятно, что имеете в виду. Последовательно сохраненные во флеш records должны быть ритмичны и начинаться с адреса sizeof()*N

я плохо видимо донес мысль … в памяти контроллера неважно где оно расположилось при комиляции , важно что оно всегда первое и когда я его запишу на флеш если оно было 0 на ФЛЕШИ , то и останется таким-же , даже если я потом проект сто раз переделаю и сто раз откомпилю , не тронув это поле в обьявлении структуры…и если я его потом опять на флешь запишу оно все равно будет 0 нулевой адрес

Вы там переотмечали что ли…

Во флеши оно будет записано куда скажете: put(address, variable). Адрес же не по рандомайзу фигачиие?

Вот тут бы код

1 лайк

пля… Карасик, вы с Садманом говорите обо одном и том же.
Он так вам и сказал, что первое поле структуры всегда будет на нулевом адресе:

В Си все индексы начинаются С НУЛЯ!
Поэтому выражение sizeof()*N для первой структуры даст НОЛЬ

Наверное пропустил слово «поля» (для первого поля структуры)? :slight_smile: