Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C++ и массивы констант.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Terminator
Есть следующий код:
Код
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
Цитата(Terminator @ Dec 9 2009, 09:49) *
Есть следующий код:

В плюсах нельзя по имени инициализировать. Так что через конструктор итд. sad.gif
Terminator
Цитата(Methane @ Dec 9 2009, 14:01) *
В плюсах нельзя по имени инициализировать. Так что через конструктор итд. sad.gif

Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...
Methane
Цитата(Terminator @ Dec 9 2009, 10:07) *
Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...

Тогда просто без .u.f
Terminator
без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают.
VladimirYU
Код
struct TItem
{
..........
};

const TItem Item
{
...................
};
Methane
Цитата(Terminator @ Dec 9 2009, 10:18) *
без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают.

Поменяйте местами.
jorikdima
Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C"
Terminator
Цитата(VladimirYU @ Dec 9 2009, 14:29) *
Код
struct TItem
{
..........


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

Цитата(Methane @ Dec 9 2009, 14:37) *
Поменяйте местами.

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

Цитата(jorikdima @ Dec 9 2009, 14:49) *
Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C"


Похоже так и придётся сделать ...
Methane
Цитата(Terminator @ Dec 9 2009, 10:50) *
А смысл? Будет к другому типу приводить и ругаться в другом месте.

Ну не умеет это C++. Каличный язык. У меня у самого подобная проблема была, когда один инклюд хотелось и в C++ и в С использовать.
Как уже сказали, компилируйте в С, потмо в инклюдах пишите extern "C"{бла-бла-бла}
Dima_G
Цитата(Terminator @ Dec 9 2009, 12:07) *
Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...

Сколько и какой памяти на ветер? rolleyes.gif
jorikdima
Цитата(Dima_G @ Dec 9 2009, 11:54) *
Сколько и какой памяти на ветер? rolleyes.gif

предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой.
Dima_G
Цитата(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)};
Methane
Цитата(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?
LessNik
Вообще-то и первоначальный код прекрасно собрался. Пришлось только типы объявить. Компилятор IAR 5.11B for AVR, что при Embedded C++, что при Extended Embedded C++. Что я не так делаю? smile.gif
Код
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.gif
Dima_G
Цитата(Methane @ Dec 9 2009, 12:50) *
Никогда такого не видел. Хоть как называется? Это стандартная фича или расширение IAR?

Вы про что? Про конструктор?
Methane
Цитата(Dima_G @ Dec 9 2009, 12:04) *
Вы про что? Про конструктор?

Тю, я думал то С.
Terminator
Цитата(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
Dima_G
Цитата(Terminator @ Dec 9 2009, 16:28) *
Подогнал свой под такой же вид(получается монстрообразно) тоже работает, за исключением массива info внутри tItem, как его инициализировать?


Почему монстрообразно? Можете код привести?
Terminator
Код
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 десяток разных типов ...
Dima_G
Цитата(Terminator @ Dec 9 2009, 16:50) *
[code][/code]


Ну ничего монстрообразного не вижу smile.gif
А массивы можно инициализировать так же как в С


Цитата(Terminator @ Dec 9 2009, 16:50) *
В реальном проекте в tUnion десяток разных типов ...


Тогда будте аккуратны с конструкторами (чтобы избежать неявного приведения типов)
Может имеет смысл объявить их explicit
Terminator
Цитата(Dima_G @ Dec 9 2009, 18:55) *
Ну ничего монстрообразного не вижу smile.gif
А массивы можно инициализировать так же как в С


Действительно, если немного упростить то и массивы нормально укладываются.

Про explicit можно подробней, что это даст?
demiurg_spb
Цитата(Methane @ Dec 9 2009, 12:50) *
Никогда такого не видел. Хоть как называется? Это стандартная фича или расширение IAR?
Это конструктор С++. К Си не имеет отношения ИМХО.
Dima_G
Цитата(Terminator @ Dec 9 2009, 17:14) *
Про explicit можно подробней, что это даст?


Погорячился)
Смысла тут от этого не будет
alekseykoj
Вот так попробуй.
Код
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}
};
HARMHARM
Цитата(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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.