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

C++ и массивы констант.

Есть следующий код:

 typedef union {
         uint32_t p;
         float f;
} tUnion;

typedef struct {
         uint8_t type;
         uint8_t info[4];
         tUnion u;
} tItem;

const tItem i[] = {
         {2, {1,2,4,2}, .u.f=1.5},
         {1, {2,2,4,2}, .u.p=10},
         {2, {3,2,4,2}, .u.f=2.3}
};

 

В чистом C замечательно компилируется и работает. А вот как написать подобное в C++?

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


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

Есть следующий код:

В плюсах нельзя по имени инициализировать. Так что через конструктор итд. :(

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


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

В плюсах нельзя по имени инициализировать. Так что через конструктор итд. :(

Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...

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


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

Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...

Тогда просто без .u.f

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


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

без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают.

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


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

без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают.

Поменяйте местами.

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


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

Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C"

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


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

 struct TItem
{
..........

 

Поясните. Что-то немогу понять как оно поможет.

 

Поменяйте местами.

А смысл? Будет к другому типу приводить и ругаться в другом месте.

 

Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C"

 

Похоже так и придётся сделать ...

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


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

А смысл? Будет к другому типу приводить и ругаться в другом месте.

Ну не умеет это C++. Каличный язык. У меня у самого подобная проблема была, когда один инклюд хотелось и в C++ и в С использовать.

Как уже сказали, компилируйте в С, потмо в инклюдах пишите extern "C"{бла-бла-бла}

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


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

Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...

Сколько и какой памяти на ветер? :rolleyes:

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


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

Сколько и какой памяти на ветер? :rolleyes:

предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой.

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


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

предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой.

 

Те стоит задача запихнуть этот массив в ROM (например - во флешь)?

 

предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой.

 

Кстати, почему?

Этот код собирается прекрасно

 

typedef struct sss
{ 
  BYTE a;
  BYTE b;
         
  sss(BYTE bA_, BYTE bB_):a(bA_),b(bB_){}       
};

static const sss sSss_ = sss(1,2);
static const sss asSSS_[] = {sss(1,2),sss(3,4),sss(5,6)};

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


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

sss(BYTE bA_, BYTE bB_):a(bA_),b(bB_){}

 

static const sss sSss_ = sss(1,2);

static const sss asSSS_[] = {sss(1,2),sss(3,4),sss(5,6)};[/code]

Никогда такого не видел. Хоть как называется? Это стандартная фича или расширение IAR?

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


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

Вообще-то и первоначальный код прекрасно собрался. Пришлось только типы объявить. Компилятор IAR 5.11B for AVR, что при Embedded C++, что при Extended Embedded C++. Что я не так делаю? :)

typedef unsigned char uint8_t;
typedef unsigned long uint32_t;

typedef union {
         uint32_t p;
         float f;
} tUnion;

typedef struct {
         uint8_t type;
         uint8_t info[4];
         tUnion u;
} tItem;

const tItem Item[] = {
         {2, {1,2,4,2}, .u.f=1.5},
         {1, {2,2,4,2}, .u.p=10},
         {2, {3,2,4,2}, .u.f=2.3}
};

 

P.S. Может расширение файла поменять нужно на cpp :laughing:

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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