Terminator 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Есть следующий код: 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++? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Есть следующий код: В плюсах нельзя по имени инициализировать. Так что через конструктор итд. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба В плюсах нельзя по имени инициализировать. Так что через конструктор итд. :( Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер... Тогда просто без .u.f Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба struct TItem { .......... }; const TItem Item { ................... }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают. Поменяйте местами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба struct TItem { .......... Поясните. Что-то немогу понять как оно поможет. Поменяйте местами. А смысл? Будет к другому типу приводить и ругаться в другом месте. Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C" Похоже так и придётся сделать ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба А смысл? Будет к другому типу приводить и ругаться в другом месте. Ну не умеет это C++. Каличный язык. У меня у самого подобная проблема была, когда один инклюд хотелось и в C++ и в С использовать. Как уже сказали, компилируйте в С, потмо в инклюдах пишите extern "C"{бла-бла-бла} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер... Сколько и какой памяти на ветер? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Сколько и какой памяти на ветер? :rolleyes: предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба предполагаю РАМ ибо сущность 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)}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Methane 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба Вообще-то и первоначальный код прекрасно собрался. Пришлось только типы объявить. Компилятор 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться