LINUX.ORG.RU

Заполнить массив переменными разных типов

 ,


0

3

Как реализовать такую задачу: имеется массив unsigned char *data и десяток переменных разных типов:

float32_t a1 ;
float32_t a2 ;
uint16_t a3 ;
int8_t a4 ;
uint8_t a5,a6,a7,a8 ;
uint8_t ant[3];
uint8_t lin[3];
embtime_t time ;
Необходимо сохранить эти переменные в массиве *data. Для последующего извлечения их оттуда. Но так, чтобы массив полностью был заполнен, то есть без «пустых» байт. Помогите, пожалуйста.



Последнее исправление: CYB3R (всего исправлений: 1)

typedef struct __attribute__((__packed__))  {
  float32_t a1;
  float32_t a2;
  uint16_t a3;
  int8_t a4;
  uint8_t a5, a6, a7, a8;
  uint8_t ant[3];
  uint8_t lin[3];
  embtime_t time;
} Foo;

int main(int argc, char const *argv[])
{
  unsigned char *data = malloc(sizeof(Foo));
  Foo *packed_data = (Foo *)data;
  packed_data->a1 = 42.0;
  return 0;
}
geks
()

К отличному ответу geks добавлю, что курить тебе надо не массивы, а сериализацию.

Miguel ★★★★★
()

Про сериализацию уже тут правильно сказали. Если нужно сохранять данные на диск/передавать по сети, заранее реши, какой порядок байт использовать.

А идиота с пакованными структурами не слушай.

anonymous
()

Но так, чтобы массив полностью был заполнен, то есть без «пустых» байт.

откуда такое условие? Если серилизация, то так и скажи. И для серилизации не нужно массива.

emulek
()
Ответ на: комментарий от emulek

откуда такое условие? Если серилизация, то так и скажи. И для серилизации не нужно массива.

принимаю пакет 300 байт по сети к этому пакету должен пристыковать описанные в теме данные и записать в обычный бинарный файл. Решая эту задачу, и пришел к массиву.

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

как пример можно взять торрент файл, там данные разные и ниединого разрыва, в общем и распарсить и создать не очень сложно.

IvanR ★★★
()
Ответ на: комментарий от podovalov5

принимаю пакет 300 байт по сети к этому пакету должен пристыковать описанные в теме данные и записать в обычный бинарный файл. Решая эту задачу, и пришел к массиву.

Ну так и пристыкуй в конец пакованную структуру. Массив тебе в хрен не уперся.

hateyoufeel ★★★★★
()
Ответ на: комментарий от podovalov5

принимаю пакет 300 байт по сети к этому пакету должен пристыковать описанные в теме данные и записать в обычный бинарный файл. Решая эту задачу, и пришел к массиву.

вот прямо и пиши свои байты в эту свою структуру. Как убрать выравнивание, тебе уже рассказали.

Массив тут не нужен.

emulek
()
Ответ на: комментарий от geks

geks воспользовался твоим советом. Огромное спасибо. Подскажи, там в структуре есть два массива

uint8_t ant[3];
uint8_t lin[3];
как к ним доступ получить? На запись типа
packed_data->ant = other_array_1 ;
packed_data->lin = other_array_2 ;
Компилятор выдает: error: invalid array assignment

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

Неужели только так:

packed_data->ant[0] = other_array_1[0] ;
packed_data->ant[1] = other_array_1[1] ;
packed_data->ant[2] = other_array_1[2] ;
packed_data->lin[0] = other_array_2[0] ;
packed_data->lin[1] = other_array_2[1] ;
packed_data->lin[2] = other_array_2[2] ;
??? Не хотелось бы..

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

документируй протокол, бери строку для передачи, лепи туда все по порядку, с другой стороны распарсят согласно протоколу

unt1tled ★★★★
()
Ответ на: комментарий от podovalov5

если ты ТОЧНО УВЕРЕН, что структуры ОДИНАКОВЫЕ, то можно memcpy(&target, &source);

Но сам понимаешь, если структуры и/или выравнивания разные, то получится хрень.

emulek
()
Ответ на: комментарий от emulek

Но сам понимаешь, если структуры и/или выравнивания разные, то получится хрень.

У него там не структуры, а массивы - раз. В массивах нет дырок. Взятие адреса там не нужно.

Твой мемкопи будет работать всегда.

TrueTsarC
()
Ответ на: комментарий от TrueTsarC

У него там не структуры, а массивы

ТС показал два массива. Тут нужно две memcpy(3).

В массивах нет дырок.

но они могут быть между массивов.

emulek
()
Ответ на: комментарий от podovalov5

packed_data->ant = other_array_1

memcpy(packed_data->ant, other_array_1, 3)

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.