|
C++ и массивы констант., А в чистом C работало ... |
|
|
|
Dec 9 2009, 07:49
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Есть следующий код: Код 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++?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 25)
|
Dec 9 2009, 08:52
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Цитата(VladimirYU @ Dec 9 2009, 14:29)  Код struct TItem { .......... Поясните. Что-то немогу понять как оно поможет. Цитата(Methane @ Dec 9 2009, 14:37)  Поменяйте местами. А смысл? Будет к другому типу приводить и ругаться в другом месте. Цитата(jorikdima @ Dec 9 2009, 14:49)  Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C" Похоже так и придётся сделать ...
|
|
|
|
|
Dec 9 2009, 09:15
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(jorikdima @ Dec 9 2009, 13:00)  предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой. Те стоит задача запихнуть этот массив в ROM (например - во флешь)? Цитата(jorikdima @ Dec 9 2009, 13:00)  предполагаю РАМ ибо сущность 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)};
|
|
|
|
|
Dec 9 2009, 09:50
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(Dima_G @ Dec 9 2009, 11:15)  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?
|
|
|
|
|
Dec 9 2009, 09:51
|

Частый гость
 
Группа: Свой
Сообщений: 107
Регистрация: 6-09-06
Из: Москва
Пользователь №: 20 118

|
Вообще-то и первоначальный код прекрасно собрался. Пришлось только типы объявить. Компилятор 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
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Dec 9 2009, 10:04
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Methane @ Dec 9 2009, 12:50)  Никогда такого не видел. Хоть как называется? Это стандартная фича или расширение IAR? Вы про что? Про конструктор?
|
|
|
|
|
Dec 9 2009, 12:28
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Цитата(Dima_G @ Dec 9 2009, 15:15)  Те стоит задача запихнуть этот массив в ROM (например - во флешь)? Именно Цитата(Dima_G @ Dec 9 2009, 15:15)  Этот код собирается прекрасно Код typedef struct sss ... Да ваш код нормально собирается. Подогнал свой под такой же вид(получается монстрообразно) тоже работает, за исключением массива info внутри tItem, как его инициализировать? P. S. компилятор GCC-4.4.2
Сообщение отредактировал Terminator - Dec 9 2009, 12:33
|
|
|
|
|
Dec 9 2009, 12:41
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Terminator @ Dec 9 2009, 16:28)  Подогнал свой под такой же вид(получается монстрообразно) тоже работает, за исключением массива info внутри tItem, как его инициализировать? Почему монстрообразно? Можете код привести?
|
|
|
|
|
Dec 9 2009, 12:50
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Код union tUnion { int p; float f; tUnion(double t): f(t) {} tUnion(int t): p(t) {} };
struct tItem { const uint8_t type; const float info; tUnion u; tItem(const int t, const double in, int p): type(t), info(in), u(p) {}; tItem(const int t, const double in, double p): type(t), info(in), u(p) {}; };
const tItem Item[]= { {tItem(1, 2.1, 1)}, {tItem(23, 1.2, 3.2)} }; В реальном проекте в tUnion десяток разных типов ...
Сообщение отредактировал Terminator - Dec 9 2009, 12:52
|
|
|
|
|
Dec 9 2009, 12:55
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Terminator @ Dec 9 2009, 16:50)  [code][/code] Ну ничего монстрообразного не вижу  А массивы можно инициализировать так же как в С Цитата(Terminator @ Dec 9 2009, 16:50)  В реальном проекте в tUnion десяток разных типов ... Тогда будте аккуратны с конструкторами (чтобы избежать неявного приведения типов) Может имеет смысл объявить их explicit
|
|
|
|
|
Dec 9 2009, 13:14
|

Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382

|
Цитата(Dima_G @ Dec 9 2009, 18:55)  Ну ничего монстрообразного не вижу А массивы можно инициализировать так же как в С Действительно, если немного упростить то и массивы нормально укладываются. Про explicit можно подробней, что это даст?
|
|
|
|
|
Dec 9 2009, 16:14
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Terminator @ Dec 9 2009, 17:14)  Про explicit можно подробней, что это даст? Погорячился) Смысла тут от этого не будет
|
|
|
|
|
Dec 17 2009, 07:00
|
Участник

Группа: Свой
Сообщений: 60
Регистрация: 8-11-05
Пользователь №: 10 602

|
Вот так попробуй. Код typedef unsigned char uint8_t; typedef unsigned long uint32_t;
union tUnionDat { uint32_t p; float f; tUnionDat(float a) { f = a; } tUnionDat(uint32_t a) { p = a; } };
typedef struct { uint8_t type; uint8_t info[4]; tUnionDat u; } tItem;
const tItem Item[] = { {2, {1,2,4,2}, (float)1.5}, {1, {2,2,4,2}, (uint32_t)10}, {2, {3,2,4,2}, (float)2.3} };
|
|
|
|
|
Dec 17 2009, 07:14
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(alekseykoj @ Dec 17 2009, 09:00)  Код {2, {1,2,4,2}, (float)1.5}, {1, {2,2,4,2}, (uint32_t)10}, Можно 1.5f и 10u.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|