Перейти к содержанию
    

Incomplete arrays at end of structs - почему не работают?

Читаю описание компилятора:

The last element of a struct may be an incomplete array. This is useful because one chunk of memory can be allocated for the struct itself and for the array, regardless of the size of the array.
Вроде все понятно и логично. Беру пример из того же описания:

struct str 
{
  char a;
  unsigned long b[];
};

Компилю. Error[Pe070]: incomplete type is not allowed.

 

Режимы ставил и Embedded C++ и Extended Embedded C++ и галка "Allow IAR extentions" стоит.

Компилятор версии 4.30A, но и мануал от него(This guide applies to version 4.x of ARM IAR Embedded Workbench®).

Что же делать???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тоже компилятор IAR C/C++ Compiler for ARM 4.30A Evaluation (4.30.1.237)

Вставил этот код в свою программу, откомпилировалось. Language при этом стоит просто C

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Language при этом стоит просто C
Проверил. Действительно, в режиме С компилятся.

Полез в стандарт. "Сам дурак". ISO/IEC 14882:1998(E). An object of array type contains a contiguously allocated non-empty set of N sub-objects of type T.

И правда, как иначе наследование делать?

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребята, а как же в режиме C++ объявить структуру такого типа:

typedef struct udp_packet {
    u16 from_port;
    u16 to_port;
    u16 len;
    u16 cksum;
    u8 data[];
} udp_packet_t;

или

 

// IP-пакет
typedef struct ip_packet {
    u8 ver_head_len; // версия и длина заголовка =0x45
    u8 tos; //тип сервиса
    u16 total_len; //длина всего пакета
    u16 fragment_id; //идентификатор фрагмента
    u16 flags_framgent_offset; //смещение фрагмента
    u8 ttl; //TTL
    u8 protocol; //код протокола
    u16 cksum; //контрольная сумма заголовка
    u32 from_addr; //IP-адрес отправителя
    u32 to_addr; //IP-адрес получателя
    u8 data[];
} ip_packet_t;

??

 

 

Или как по другому удобно работать с протоколом ip-udp, например?

В Си это решается просто:

 

char buffer[256];
ip_packet_t* ip = buffer;
udp_packet_t *udp = ip->data;
strcpy(udp->data, "test");

 

как в С++ написать подобный код?

UPD:

блин... туплю... ничего же не мешает мне объявить хоть data[1000000000] в описании, всё равно же память под неё не выделяется, если использовать как указатель

Изменено пользователем vertexodessa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...