PavelK
@PavelK

Как лучше добавить перед структурой ещё одну и поместить в массив?

Привет!

typedef struct {
  int a;
  int b;
} base;

typedef struct {
  int c;
  int d;
} S1;

void send(void * data, int dataSize) 
{
  char arr[sizeof(base)+dataSize];
  base * b =(base*)arr;
  b->a =1;
  b->b =2;
  memcpy(arr+sizeof(base), data, dataSize);  
  
  dummy(arr, sizeof(arr));
}

S1 s1;
s1.c =3;
s1.d =4;
send(&s1, sizeof(S1));


Как видите, в функции send в массив нужно поместить базовую структуру, потом структуру с данными, потом передать это на вход другой функции.
Аргументы и саму dummy менять нельзя (системная), стуктуру, S1 менять то же нельзя.

Напрягает постоянное копирование - data в массив и обратно - может быть есть идее, как улучшить этот участок в send?

Пока что из мыслей разве что глобально объявлять arr большего размера и при необходимости
S1 *s1 = (S1*)(arr+BASE_OFFSET);
Но крайне не хочется так делать.
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вообще, работу с указателем на base тоже надо переписать через memcpy. Потому что это UB. Вдруг выравнивание у массива не такое, как у структуры Base. Без memcpy тут никак. Другого способа разместить 2 структуры в памяти подряд компактно - нет.

Edit: конечно, можно объявить вашу стоуктуру где поля base и S1 идут рядом, но там будет какой-то padding. Работать с этим как с сериализированным массивом байт - нельзя.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы