реклама на сайте
подробности

 
 
> C++ и массивы констант., А в чистом C работало ...
Terminator
сообщение Dec 9 2009, 07:49
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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++?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 25)
Methane
сообщение Dec 9 2009, 08:01
Сообщение #2


Гуру
******

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



Цитата(Terminator @ Dec 9 2009, 09:49) *
Есть следующий код:

В плюсах нельзя по имени инициализировать. Так что через конструктор итд. sad.gif
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 9 2009, 08:07
Сообщение #3


Местный
***

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



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

Ну это вообще не вариант, эта табличка пару кило весит, столько памяти на ветер...
Go to the top of the page
 
+Quote Post
Methane
сообщение Dec 9 2009, 08:13
Сообщение #4


Гуру
******

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



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

Тогда просто без .u.f
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 9 2009, 08:18
Сообщение #5


Местный
***

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



без .u.f оно приводит к типу первого элемента union-а и ругается если если типы не совпадают.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Dec 9 2009, 08:29
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Код
struct TItem
{
..........
};

const TItem Item
{
...................
};
Go to the top of the page
 
+Quote Post
Methane
сообщение Dec 9 2009, 08:37
Сообщение #7


Гуру
******

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



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

Поменяйте местами.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 9 2009, 08:49
Сообщение #8


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Создайте отдельный модуль и компилируйте его и только его в С. Затем в остальную плюсовую программу подключаете данные из сишного модуля, пользуя extern "C"
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 9 2009, 08:52
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 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"


Похоже так и придётся сделать ...
Go to the top of the page
 
+Quote Post
Methane
сообщение Dec 9 2009, 08:53
Сообщение #10


Гуру
******

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



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

Ну не умеет это C++. Каличный язык. У меня у самого подобная проблема была, когда один инклюд хотелось и в C++ и в С использовать.
Как уже сказали, компилируйте в С, потмо в инклюдах пишите extern "C"{бла-бла-бла}
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 9 2009, 08:54
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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

Сколько и какой памяти на ветер? rolleyes.gif
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 9 2009, 09:00
Сообщение #12


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



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

предполагаю РАМ ибо сущность tItem i[] = уже не сможет быть константой.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 9 2009, 09:15
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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)};
Go to the top of the page
 
+Quote Post
Methane
сообщение Dec 9 2009, 09:50
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post
LessNik
сообщение Dec 9 2009, 09:51
Сообщение #15


Частый гость
**

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



Вообще-то и первоначальный код прекрасно собрался. Пришлось только типы объявить. Компилятор 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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 9 2009, 10:04
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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

Вы про что? Про конструктор?
Go to the top of the page
 
+Quote Post
Methane
сообщение Dec 9 2009, 11:22
Сообщение #17


Гуру
******

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



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

Тю, я думал то С.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 9 2009, 12:28
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 9 2009, 12:41
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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


Почему монстрообразно? Можете код привести?
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 9 2009, 12:50
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 9 2009, 12:55
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Terminator @ Dec 9 2009, 16:50) *
[code][/code]


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


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


Тогда будте аккуратны с конструкторами (чтобы избежать неявного приведения типов)
Может имеет смысл объявить их explicit
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 9 2009, 13:14
Сообщение #22


Местный
***

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



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


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

Про explicit можно подробней, что это даст?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 9 2009, 16:09
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Methane @ Dec 9 2009, 12:50) *
Никогда такого не видел. Хоть как называется? Это стандартная фича или расширение IAR?
Это конструктор С++. К Си не имеет отношения ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 9 2009, 16:14
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Terminator @ Dec 9 2009, 17:14) *
Про explicit можно подробней, что это даст?


Погорячился)
Смысла тут от этого не будет
Go to the top of the page
 
+Quote Post
alekseykoj
сообщение Dec 17 2009, 07:00
Сообщение #25


Участник
*

Группа: Свой
Сообщений: 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}
};
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Dec 17 2009, 07:14
Сообщение #26


читатель даташитов
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.0161 секунд с 7
ELECTRONIX ©2004-2016