LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

=)

Я остановился ещё потому что много вопросов, например ты выше сказал что динамическая память нини, значит массив структур создаётся целиком, сразу и навсегда. Значит он лишь заполняется, отправляется и чистится (чистятся значения структур)

Но если он (массив структур) статичный то зачем там order если порядок перед отправкой можно задавать порядком инициализации структур, при передаче последовательность данных будет сохранена.

Опять же, у тебя name это указатель на строку, видимо всё же аллокация есть, но в таком случае твоя идея приведения массива структур к указателю на массив char невозможна, name должен быть статическим масивом внутри стурктуры

typedef struct {
    ordet_t order;
    uint8_t name[MAXNAME];
    uint16_t lenght;
} data_t;

Но в таком случае я так понимаю lenght ранее указывавший на размер name теперь тоже не нужен так как нам известен максимальный размер name и видимо name это unsigned char текст, где не может быть например значения 0 как значимого, а значит можно просто вставить нуль терминал \0 таким образом всё превращается просто в

typedef struct {
    uint8_t name[MAXNAME];
} data_t;

или просто в

    uint8_t name[MAXNAME];

А так как нужен массив то в

   static int arrslen = 16 ;
   static int maxname = 128;
   uint8_t data[arrslen][maxname];

Отправка будет в виде просто


data[ONE] = "HELLO "
data[THREE] = "!"
data[TWO] = "WORLD"

for(int i=ONE; i < THREE && i < arrslen;i++)
{
    некий_send(data[i],strlen(data[i]+1))
}

Так как порядок важен, другое устройство уже знает в каком порядке придёт данные. И просто примет. Может придётся разве что порядок байт поменять.

А моожет всё вообще не так, и тебе реально нужны прям структуры. Тогда вариант отправить их одним блобом такой

  • 1 как сказано выше name должен быть статик массивом внутри структуры и заполнятся нужным name
  • 2 должен быть 1 статический uint8_t буфер, он будет переиспользоваться для отправки
  • 3 в структурах не должно быть дырок (ссылка про дырки выше)

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

Таким образом (не для структуры массивов, а для массива структур, для структуры массивов вообще ничего делать не надо можно её отсылать как есть, как у тебя в шапке, только данные надо изменить) можно сделать так

uint8_t senderbuffer[размер_структуры умнижить на количество структур];
uint8_t * ppp = senderbuffer; /*сохраняем указатель*/
for(int i=откуда_начинать; i < сколько_слать; i++)
{
   uint8_t * p = (uint8_t *) массив_структур[i]; /*если нет дыр то можно спокойно приводить тело структуру к массиву*/
   
   for(int j=0; j < sizeof(структура);j++)
   {
       ppp[j] = p[j];
   }
   ppp += sizeof(структура)
}

/*всё у тебя 1 строка senderbuffer заполненная телами структур*/
  некий_send_отсылающий_байты(senderbuffer, sizeof(структура) * сколько_ты_там_их_отсылаешь)

Принимающая сторона примет целиком массив байт, она знает его размер, и знает размер структур внутри, теперь она может сделать так

void writefunc(char byte)
{
   /*получаем результат и записываем кудато в input_data*/
}

uint8_t data[max]

get(writefunc) /*типа получили*/

/*теперь просто берём режем получинный массив на структуры как пирожок*/


data_t arr[лимит];
for(int i=0,j = 0; i < data_size / размер_структуры;i+=размер_структуры,j++)
{
   arr[j] = (структура*)(data+i)
}

printf("%s\n",arr[0].name);

Всё!

Segmentation fault

Исправление LINUX-ORG-RU, :

=)

Я остановился ещё потому что много вопросов, например ты выше сказал что динамическая память нини, значит массив структур создаётся целиком, сразу и навсегда. Значит он лишь заполняется, отправляется и чистится (чистятся значения структур)

Но если он (массив структур) статичный то зачем там order если порядок перед отправкой можно задавать порядком инициализации структур, при передаче последовательность данных будет сохранена.

Опять же, у тебя name это указатель на строку, видимо всё же аллокация есть, но в таком случае твоя идея приведения массива структур к указателю на массив char невозможна, name должен быть статическим масивом внутри стурктуры

typedef struct {
    ordet_t order;
    uint8_t name[MAXNAME];
    uint16_t lenght;
} data_t;

Но в таком случае я так понимаю lenght ранее указывавший на размер name теперь тоже не нужен так как нам известен максимальный размер name и видимо name это unsigned char текст, где не может быть например значения 0 как значимого, а значит можно просто вставить нуль терминал \0 таким образом всё превращается просто в

typedef struct {
    uint8_t name[MAXNAME];
} data_t;

или просто в

    uint8_t name[MAXNAME];

А так как нужен массив то в

   static int arrslen = 16 ;
   static int maxname = 128;
   uint8_t data[arrslen][maxname];

Отправка будет в виде просто


data[ONE] = "HELLO "
data[THREE] = "!"
data[TWO] = "WORLD"

for(int i=ONE; i < THREE && i < arrslen;i++)
{
    некий_send(data[i],strlen(data[i]+1))
}

Так как порядок важен, другое устройство уже знает в каком порядке придёт данные. И просто примет. Может придётся разве что порядок байт поменять.

А моожет всё вообще не так, и тебе реально нужны прям структуры. Тогда вариант отправить их одним блобом такой

  • 1 как сказано выше name должен быть статик массивом внутри структуры и заполнятся нужным name
  • 2 должен быть 1 статический uint8_t буфер, он будет переиспользоваться для отправки
  • 3 в структурах не должно быть дырок (ссылка про дырки выше)

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

Таким образом можно сделать так

uint8_t senderbuffer[размер_структуры умнижить на количество структур];
uint8_t * ppp = senderbuffer; /*сохраняем указатель*/
for(int i=откуда_начинать; i < сколько_слать; i++)
{
   uint8_t * p = (uint8_t *) массив_структур[i]; /*если нет дыр то можно спокойно приводить тело структуру к массиву*/
   
   for(int j=0; j < sizeof(структура);j++)
   {
       ppp[j] = p[j];
   }
   ppp += sizeof(структура)
}

/*всё у тебя 1 строка senderbuffer заполненная телами структур*/
  некий_send_отсылающий_байты(senderbuffer, sizeof(структура) * сколько_ты_там_их_отсылаешь)

Принимающая сторона примет целиком массив байт, она знает его размер, и знает размер структур внутри, теперь она может сделать так

void writefunc(char byte)
{
   /*получаем результат и записываем кудато в input_data*/
}

uint8_t data[max]

get(writefunc) /*типа получили*/

/*теперь просто берём режем получинный массив на структуры как пирожок*/


data_t arr[лимит];
for(int i=0,j = 0; i < data_size / размер_структуры;i+=размер_структуры,j++)
{
   arr[j] = (структура*)(data+i)
}

printf("%s\n",arr[0].name);

Всё!

Segmentation fault

Исходная версия LINUX-ORG-RU, :

=)

Я остановился ещё потому что много вопросов, например ты выше сказал что динамическая память нини, значит массив структур создаётся целиком, сразу и навсегда. Значит он лишь заполняется, отправляется и чистится (чистятся значения структур)

Но если он (массив структур) статичный то зачем там order если порядок перед отправкой можно задавать порядком инициализации структур, при передаче последовательность данных будет сохранена.

Опять же, у тебя name это указатель на строку, видимо всё же аллокация есть, но в таком случае твоя идея приведения массива структур к указателю на массив char невозможна, name должен быть статическим масивом внутри стурктуры

typedef struct {
    ordet_t order;
    uint8_t name[MAXNAME];
    uint16_t lenght;
} data_t;

Но в таком случае я так понимаю lenght ранее указывавший на размер name теперь тоже не нужен так как нам известен максимальный размер name и видимо name это unsigned char текст, где не может быть например значения 0 как значимого, а значит можно просто вставить нуль терминал \0 таким образом всё превращается просто в

typedef struct {
    uint8_t name[MAXNAME];
} data_t;

или просто в

    uint8_t name[MAXNAME];

А так как нужен массив то в

   static int arrslen = 16 ;
   static int maxname = 128;
   uint8_t data[arrslen][maxname];

Отправка будет в виде просто


data[ONE] = "HELLO "
data[THREE] = "!"
data[TWO] = "WORLD"

for(int i=ONE; i < THREE && i < arrslen;i++)
{
    некий_send(data[i],strlen(data[i]+1))
}

Так как порядок важен, другое устройство уже знает в каком порядке придёт данные. И просто примет. Может придётся разве что порядок байт поменять.

А моожет всё вообще не так, и тебе реально нужны прям структуры. Тогда вариант отправить их одним блобом такой

  • 1 как сказано выше name должен быть статик массивом внутри структуры и заполнятся нужным name
  • 2 должен быть 1 статический uint8_t буфер, он будет переиспользоваться для отправки
  • 3 в структурах не должно быть дырок (ссылка про дырки выше)

Таким образом можно сделать так

uint8_t senderbuffer[размер_структуры умнижить на количество структур];
uint8_t * ppp = senderbuffer; /*сохраняем указатель*/
for(int i=откуда_начинать; i < сколько_слать; i++)
{
   uint8_t * p = (uint8_t *) массив_структур[i]; /*если нет дыр то можно спокойно приводить тело структуру к массиву*/
   
   for(int j=0; j < sizeof(структура);j++)
   {
       ppp[j] = p[j];
   }
   ppp += sizeof(структура)
}

/*всё у тебя 1 строка senderbuffer заполненная телами структур*/
  некий_send_отсылающий_байты(senderbuffer, sizeof(структура) * сколько_ты_там_их_отсылаешь)

Принимающая сторона примет целиком массив байт, она знает его размер, и знает размер структур внутри, теперь она может сделать так

void writefunc(char byte)
{
   /*получаем результат и записываем кудато в input_data*/
}

uint8_t data[max]

get(writefunc) /*типа получили*/

/*теперь просто берём режем получинный массив на структуры как пирожок*/


data_t arr[лимит];
for(int i=0,j = 0; i < data_size / размер_структуры;i+=размер_структуры,j++)
{
   arr[j] = (структура*)(data+i)
}

printf("%s\n",arr[0].name);

Всё!

Segmentation fault