Цитата(pitt @ Mar 2 2013, 00:33)

// учтите, логика, проверена и работает на х86
memcpy(&p_dst->data, p_src->data, p_src->len);
Работает? Это же просто каша в коде написана!
1. Где поле data в в структуре типа pack_s? Может, имеется ввиду ->info?
2. Если поле info есть указатель, почему первый параметр по ссылке (с &)?
Мои догадки:
1. info[SIZE] есть, видимо, какой-то общий буфер, в котором где-то "вложена" структура pack_s, которая, похоже, представляет собой блок данных, предваренный его типом и длиной. В этом случае структуру следует записать как
Код
typedef __packed struct {
uint8_t type;
uint16_t len;
uint8_t data[1];
} pack_s;
понимая, что data[1] на самом деле есть сам буфер переменной длины, а не указатель на куда-то еще.
2. Возможен и другой вариант: структура pack_s в виде от автора есть просто некий универсальный описатель, который, будучи наложен на последовательность байт, выглядит как я описал выше, а будучи использован где-то внутри кода, - действительно не содержит данные, а указывает на еще один буфер с ними посредством *info. Это подозрение следует из memcpy(&p_dst->data, p_src->data, p_src->len), где, к слову, вместо data должно быть info, а имя для info[SIZE] есть просто катастрофа с бодуна, и должно быть выбрано иным. Ну тогда уж надо бы написать:
Код
#pragma anon_unions
typedef __packed struct {
uint8_t type;
uint16_t len;
__packed uinon {
uint8_t data[1];
uint8_t *info;
}
} pack_s;
...
memcpy(p_dst->data, p_src->info, p_src->len);
// или
memcpy(p_dst->info, p_src->data, p_src->len);
Я написал два варианта memcpy, т.к. это автор знает, что на что у него "положено", пусть уточнит.
Сообщение отредактировал KnightIgor - Mar 2 2013, 11:09