Вопрос назрел ., может кто подскажет .
Есть структура , ее надо сохранить на флешке , структура большая, поэтому оптимально было ее сохранить , скопировав не поля по одному, а область памяти целиком…
Как бы все получилось хорошо , проблемы нет- записал блок, считал блок - структура как и была , ну естественно контрольная сумма после записи и она-же после чтения…Но всплыл единственный ньанс который вызывает , ну опасения ,что ли… Для того , чтоб выбрать нужную мне запись надо проверить поле структуры- индекс , но читать все структуры в буфер, а потом там искать , долго , нерационально т.к много места занимает и т.д .
самый простой способ считать одно поле… но вот вопрос , поля в структуре не всегда располагаются на одном и том-же месте , во первых если дополнить поле , то компилятор может в плане оптимизации расположить его в другом месте в памяти , (я иммею ввиду порядок следования ) ,а также если поле ну допустим 3 , не факт , что оно будет третьим в физической памяти из за выравнивания… а считать одно поле с флешки я могу только считав конкретный адрес… единственное поле, которое видимо не должно меняться по прихоти компилятора это первое… Вопрос ,это действительно так … Действительно оно всегда будет занимать 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). Адрес же не по рандомайзу фигачиие?
Вот тут бы код
пля… Карасик, вы с Садманом говорите обо одном и том же.
Он так вам и сказал, что первое поле структуры всегда будет на нулевом адресе:

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

Поэтому выражение sizeof()*N для первой структуры даст НОЛЬ
Наверное пропустил слово «поля» (для первого поля структуры)?