Можно ли инициализировать ссылку на структуру массивом?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли инициализировать ссылку на структуру массивом?

Сообщение Anonymous »

Можно ли сделать что-то подобное?:

Код: Выделить всё

struct S {
int length;
char data[100];
};

class C {
uint8_t buffer[10];
S& s = buffer[0];
};
Если я использую указатель, он компилируется, но работать со ссылкой было бы удобнее:

Код: Выделить всё

class C {
uint8_t buffer[10];
S* s = (S*)buffer;
};
Если вам интересно, зачем делать что-то подобное, у меня есть структура, похожая на структуру S, приведенную выше, которая используется для отправки и анализа различных пакетов данных. Некоторые реальные пакеты имеют ограниченную длину, поэтому нет смысла выделять для них больше места, чем необходимо, объявляя член как простой S.
ОБНОВЛЕНИЕ:
Кажется, я недостаточно ясно объяснил свои намерения. Возможно, вам поможет фрагмент реального кода.

Код: Выделить всё

typedef struct BP_Error_t {
uint8_t cause;
uint8_t error;
} BP_Error_t;

typedef struct BP_Upload_Rq_t {
char    file[FILE_NAME_LENGTH];
uint8_t size;
uint8_t chunk[MAX_FILE_CHUNK];
} BP_Upload_Rq_t;

typedef struct BusPacket_t {
uint8_t source;
uint8_t target;
uint8_t packet_id;
uint8_t length;
union {
BP_Error_t          error;
BP_TPI_Poll_t       tpi_poll;
BP_TPI_ACK_t        tpi_ack;
BP_WiFi_Poll_t      wifi_poll;
BP_WiFi_ACK_t       wifi_ack;
BP_Erase_Rq_t       erase_rq;
BP_Erase_Rsp_t      erase_rsp;
BP_Upload_Rq_t      upload_rq;
BP_Upload_Rsp_t     upload_rsp;
BP_Download_Rq_t    download_rq;
BP_Download_Rsp_t   download_rsp;
BP_DFU_Rq_t         dfu_rq;
BP_DFU_Rsp_t        dfu_rsp;
};
} BusPacket_t;
Как видите, у меня есть структура, представляющая различные пакеты данных. Sizeof() будет определяться самым длинным членом объединения, который составляет 240 байт. Теперь предположим, что я хочу быть готовым отправить пакет ошибок (длиной всего 6 байт) как член класса.
Если я объявлю его как BusPacket_t, я потрачу много памяти. ни за что. Поэтому я подумал, что могу выделить 6-байтовый массив, а затем присвоить ему псевдоним структуры для облегчения доступа.

Подробнее здесь: https://stackoverflow.com/questions/787 ... h-an-array
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»