|
|
  |
Как переписать данные из массива в структуру? |
|
|
|
Jul 22 2011, 07:13
|

Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544

|
Прошу помощи у специалистов в следующем. Часть кода выглядит так: Код typedef struct _SETTINGS_DATA { uint8_t theme; uint8_t volume; uint16_t timing; } settings_data_t;
typedef settings_data_t *psettings_data_t;
settings_data_t Settings_Data; uint8_t sFLASH_SPI_Buffer_Rx[512];
void read_settings(void) { ... здесь в буфер sFLASH_SPI_Buffer_Rx читаются данные (уже все работает)...
... ЗДЕСЬ НАДО ПЕРЕПИСАТЬ ДАННЫЕ ИЗ sFLASH_SPI_Buffer_Rx В Settings_Data ...
}
void main(void) { ... лишнее опущено ...
read_settings();
... лишнее опущено ... } Как это сделать правильно и компактно?
|
|
|
|
|
Jul 22 2011, 07:42
|

Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544

|
Цитата(Dog Pawlowa @ Jul 22 2011, 13:28)  ... поскольку нет никакой информации, как расположены данные в буфере приема. Если описать грубо то так: sFLASH_SPI_Buffer_Rx[0] соответствует theme, sFLASH_SPI_Buffer_Rx[1] соответствует volume, sFLASH_SPI_Buffer_Rx[2] соответствует мл. байт timing, sFLASH_SPI_Buffer_Rx[3] соответствует ст. байт timing.
|
|
|
|
|
Jul 22 2011, 07:54
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(011119xx @ Jul 22 2011, 10:13)  Как это сделать правильно и компактно? Начнем с того, что за это массив и как он получен? Если я Вас правильно понял, Вам нужно заполнить экземпляр структуры данными, хранящимися в массиве. Для этого изначально нужно этот массив получить, вычитав экземпляр. Размер массива должен быть как минимум sizeof(settings_data_t) в Вашем случае. Помните, что размер структуры не обязательно равен сумме типов данных в ней описанных. Так, копирование экземпляра структуры в массив и наоборот будет выглядеть так: Код typedef struct _SETTINGS_DATA { unsigned char theme; unsigned char volume; unsigned short timing; } settings_data_t;
settings_data_t Settings_Data;
unsigned char Data[4]; // Размер в байтах равен(кратен) sizeof(Settings_Data)
void f(void) { Settings_Data.theme = 8; Settings_Data.timing = 478; Settings_Data.volume = 45;
memcpy( &Data[0], &Settings_Data, sizeof(Settings_Data) ); // Из структуры в массив memcpy( &Settings_Data, &Data[0], sizeof(Settings_Data) ); // Из массива в структуру
}
--------------------
Magic Friend
|
|
|
|
|
Jul 22 2011, 07:58
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(011119xx @ Jul 22 2011, 10:42)  Если описать грубо то так: sFLASH_SPI_Buffer_Rx[0] соответствует theme, sFLASH_SPI_Buffer_Rx[1] соответствует volume, sFLASH_SPI_Buffer_Rx[2] соответствует мл. байт timing, sFLASH_SPI_Buffer_Rx[3] соответствует ст. байт timing. так не надо!
--------------------
Magic Friend
|
|
|
|
|
Jul 22 2011, 09:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(aaarrr @ Jul 22 2011, 13:16)  Тогда почему бы так и не написать прямо в коде вместо комментария? А то потом settings_data_t десять раз поменяется, а четверка будет благополучно забыта. Ну и объявить по простому: Код typedef struct _SETTINGS_DATA { unsigned char theme; unsigned char volume; unsigned short timing; } settings_data_t;
unsigned char Data[sizeof(settings_data_t)]; И memcpy совсем не нужно: Код settings_data_t abc = *(settings_data_t *)Data; Компилятор сам все скопирует.
|
|
|
|
|
Jul 22 2011, 09:58
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(aaarrr @ Jul 22 2011, 13:16)  а четверка будет благополучно забыта. Согласен с Вами, просто «разжевал» для ТС, чтоб синтаксисом не перегружать, сам бы вообще через new массив создал. Цитата(sergeeff @ Jul 22 2011, 13:38)  Код settings_data_t abc = *(settings_data_t *)Data; Компилятор сам все скопирует. ИМХО тут комментировать надо, что за звездочки и для чего, запутаете ТС. Раз такой вопрос поднялся, тут для ТС пояснять нужно, что есть приведение типов а, что разименование.
--------------------
Magic Friend
|
|
|
|
|
Jul 22 2011, 10:00
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Danis @ Jul 22 2011, 13:50)  Согласен с Вами, просто «разжевал» для ТС, чтоб синтаксисом не перегружать, сам бы вообще через new массив создал. Вот уж чего точно не следует делать, так это new() без всяких на то причин. Тем более что в си есть только аллоки. Любой локальный массив создаётся на стеке, а потом гарантированно уничтожается, причём без накладных расходов. К тому же непонятно, зачем вообще плодить эти массивы. Почему нельзя воспользоваться исходным буфером.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|