Представление структуры в памяти

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Дано: структура данных различных типов и вообще. 
Задача: представить вышеперечисленное в виде массива/просто разбить на куски по байту, чтобы запихнуть во флэш STM32.

Догадываюсь, что оно рядом, но туплю. Может, можно сделать union, но тогда надо точно посчитать в байтах размер структуры. Есть ещё варианты?

rkit
Онлайн
Зарегистрирован: 23.11.2016

Нет, придется писать код, который раскладывает "и вообще" в повторяемую последовательность байтов. Волшебного универсального средства нет в природе.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Спасибо. Жопа )))

b707
Онлайн
Зарегистрирован: 26.05.2017

Структуры - это те же классы. По сути вам надо написать метод класса, который сохраняет(извлекает) экземпляр класса в/из флеша

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Yarik.Yar пишет:

Дано: структура данных различных типов и вообще. 
Задача: представить вышеперечисленное в виде массива/просто разбить на куски по байту, чтобы запихнуть во флэш STM32.

Догадываюсь, что оно рядом, но туплю. Может, можно сделать union, но тогда надо точно посчитать в байтах размер структуры. Есть ещё варианты?

ничо не понял.  Вот структура "данных различных типов". 

   struct tm {
        int8_t          tm_sec; /**< seconds after the minute - [ 0 to 59 ] */
        int8_t          tm_min; /**< minutes after the hour - [ 0 to 59 ] */
        int8_t          tm_hour; /**< hours since midnight - [ 0 to 23 ] */
        int8_t          tm_mday; /**< day of the month - [ 1 to 31 ] */
        int8_t          tm_wday; /**< days since Sunday - [ 0 to 6 ] */
        int8_t          tm_mon; /**< months since January - [ 0 to 11 ] */
        int16_t         tm_year; /**< years since 1900 */
        int16_t         tm_yday; /**< days since January 1 - [ 0 to 365 ] */
        int16_t         tm_isdst; /**< Daylight Saving Time flag */
    };

Вот её размер

size_t tm_size = sizeof(tm);

вот она же байтами, "в виде массива", "кусками по байту"

tm myTime;
uint8_t *tm_bytes = (uint8_t *)(&myTime);

for (size_t i=0; i<tm_size; i++) Serial.println(tm_bytes[i]);

или я, какабычно, чота с похмелья не догоняю? 

nik182
Offline
Зарегистрирован: 04.05.2015

Дед. Ты всё правильно описал. Вот чего ТС не догоняет загадка. Проще уже ничего быть не может.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

nik182 пишет:

Вот чего ТС не догоняет загадка.

Ну, заслушаем, как появицца. 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Нет, не правильно. Потому что будет работать только в ограниченном частном случае, и нет никаких пояснений. Фактически подложил грабли.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

А ну-ка, метод деда в целом логичный, не очень безопасный но логичный. Обратно так собрать та ещё фигня буит....Так жи?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

хорошо. Перед struct забыл 

#pragma pack(push,1)

после

#pragma pack(pop)

надеюсь, так правильней? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Yarik.Yar пишет:

А ну-ка, метод деда в целом логичный, не очень безопасный но логичный. Обратно так собрать та ещё фигня буит....Так жи?

собирать так же. с учетом сообщения выше. Иначе, STM по умолчанию выравнивать начнёт хрен знает как. 

rkit
Онлайн
Зарегистрирован: 23.11.2016

DetSimen пишет:

хорошо. Перед struct забыл 

#pragma pack(push,1)

после

#pragma pack(pop)

надеюсь, так правильней? 

 Нет. Вообще не в тему. Положи String в структуру, например, и попробуй.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

rkit пишет:

 Нет. Вообще не в тему. Положи String в структуру, например, и попробуй.

Не, ну да, если структура хранит указатель хоть на чо, тогда естес-сно этот вариант не пойдёт.

Это будет работать только для не зависимых, непосредственных типов. 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Всем спасибо!

rkit
Онлайн
Зарегистрирован: 23.11.2016

Указатель это скалярный тип.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Согласен, с терминами я путаюсь. Проправил. 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Нет, не только. И еще осталось понять, что кроме механики языка есть еще логика приложения.