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

 
 
> Снова про const, не получается переползти с С на СРР
Aprox
сообщение Jan 10 2011, 06:05
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Искал свою проблему в форуме, но не нашел решения. Проблема в следующем. Имеется готовый проект на С для IAR-430A, кристаллы ARM ST91х. Использую структуры, состоящие из данных-констант вида:
Код
typedef struct{
  const Tsome_type  some_data1;
  const Tsome_type  some_data2;
  // ...etc
} Tsome_info;

Затем в коде на С создаю эти структуры с уже конкретными константами в полях
Код
const Tsome_info info1={,,,,,};
const Tsome_info info2={,,,,,};
const Tsome_info info3={,,,,,};
//..etc

На С все прекрасно живет, компилятор помещает мои структуры в сегмент CONST, а линкер- в ROM. Но, тот же самый код на СPP приводит к размещению структур в сегменте CSTACK вместе с другими объектами. В результате куча констант хранится в RAM, которой и так мало! Я в шоке. wacko.gif Можно ли как-то победить эту проблему? Или придется перелопачивать идеологию проекта?


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Oldring
сообщение Jan 10 2011, 17:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(Aprox @ Jan 10 2011, 12:05) *
Я в шоке.


В плюсах модификатор const не гарантирует, что объект не будет изменяться во время работы программы. Для программ обычных компов это не критично. Для встроенных систем изучайте тонкости настроек компилятора, с целью заставить его поместить объект в ROM.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 11 2011, 08:53
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Oldring @ Jan 11 2011, 02:15) *
В плюсах модификатор const не гарантирует, что объект не будет изменяться во время работы программы.

Это как это? А что же тогда он гарантирует? И почему "в плюсах"? А в голом Цэ по-иному строится отношение к константным объектам?

Квалификатор const не гарантирует, что объект будет размещаться в ПЗУ (если оно вообще есть в наличие), это да. А насчет изменения очень даже гарантирует. И чтобы это обойти, придется использовать хаки (на свой страх и риск, ессно).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Oldring
сообщение Jan 11 2011, 09:25
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(dxp @ Jan 11 2011, 14:53) *
Это как это? А что же тогда он гарантирует? И почему "в плюсах"? А в голом Цэ по-иному строится отношение к константным объектам?


В голых сях - иначе. Было у Страуструпа эссе по этому поводу.
Слово гарантирует, что программист не модифицирует объект неумышленно. Но всё равно если есть конструктор-деструктор, они будут вызваны. И иногда константные объекты мутируют. Было даже введено в язык специальное ключевое слово "mutable". Но иногда обходятся по-старинке и без него, снимая константность с указателя.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 11 2011, 16:04
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



А все-таки, посоветуйте новичку в "плюсах", как наиболее грамотно и экономно в смысле RAM строить объекты, которые используют предопределенные свойства в виде набора констант. Можно на хрестоматийном примере компонента ComboBox. Там используется куча свойств-констант. Отсюда вопрос- как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 11 2011, 18:52
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Aprox @ Jan 12 2011, 00:04) *
как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично?

Ну вы всё правильно делаете - константные структуры, и указатель на них в качестве параметра конструктора.

Если объектов немного, то можно шаблонами. Типа
Код
struct ComboProps1
{
    enum { width = 200 };
    enum { height = 500 };
    enum { some_bool_prop1 = false };
    ...
};

struct ComboProps2
{
    enum { width = 300 };
    enum { height = 200 };
    enum { some_bool_prop1 = true };
    ...
};

template<typename Props> class TComboBox
{
    enum { width = Props::width };
...
}

TComboBox<ComboProps1> Combo1;
TComboBox<ComboProps2> Combo2;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 13 2011, 06:05
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(AHTOXA @ Jan 12 2011, 00:52) *
Ну вы всё правильно делаете - константные структуры, и указатель на них в качестве параметра конструктора.
Ваш вариант задания констант-описаний выглядит читабельно и красиво. Однако, если в структуре-описания много разных типов, например, строки, указатели на места памяти, float и пр., то ваш вариант приводит к излишней писанине в момент декларации самих констант. Мне кажется, следующий вариант экономней в смысле писанины
Код
typedef struct{
   int i;
   float f;
   char* s;
} Tprops;

//----здесь декларации свойств с экономией писанины
static const Tprops prop1 ={13, 3.14, "Name1"}; // это точно попадает в ROM
static const Tprops prop2 ={16, 2.73, "Name2"}; // это точно попадает в ROM

class Tobj {//-------------
  const Tprops* p;
public:
  Tobj(){}
  Tobj(const Tprops* prop) {p=prop;}
  
// здесь можно пользоваться элементами описания *p.f или p->i
};

Tobj example1=&prop1;
Tobj example2=&prop2;

...

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2011, 06:29
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Aprox @ Jan 13 2011, 14:05) *
Мне кажется, следующий вариант экономней в смысле писанины

Дык, моя фраза
Цитата(AHTOXA @ Jan 12 2011, 02:52) *
константные структуры, и указатель на них в качестве параметра конструктора.

была как раз про этот вариант sm.gif А с шаблонами - это альтернативный.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 13 2011, 08:23
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(AHTOXA @ Jan 13 2011, 12:29) *
А с шаблонами - это альтернативный.
Я про шаблоны и говорю, что писанины больше при инициализации полей структуры-описания. В каждом конкретном определении структуры свойств придется набирать имена полей и все сопутствующее. Кроме того, шаблоны не поддерживает Embedded C++, а переходить на Extended C++ сразу утяжеляет проект ненужными фичами.

Я тут подумал, можно несколько повысить быстродействие, если передавать конструктору класса не указатель на структуру-описание, а ссылку на эту структуру. Заодно и в методах классах обращение к описаниям будет выглядеть приятнее.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2011, 15:40
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Aprox @ Jan 13 2011, 16:23) *
Я про шаблоны и говорю, что писанины больше при инициализации полей структуры-описания. В каждом конкретном определении структуры свойств придется набирать имена полей и все сопутствующее.

Это понятно. Плюс к тому, вы получаете фактически по классу на каждый экземпляр объекта. Поэтому я и написал, "если объектов немного".
Но есть у шаблонов и плюсы. Например, все ветки if () и case, зависящие от константных параметров шаблона, компилятор вычислит на этапе компиляции (то есть их не останется).
То есть, код
Код
    if (some_bool_prop1)
        func1();
    else
        func2();
при some_bool_prop1 == true будет скомпилирован в
Код
    func1();




Цитата(Сергей Борщ @ Jan 13 2011, 16:36) *
За счет чего будет подъем быстродействия? Как вы представляете внутренюю реализацию ссылки кроме как через указатель?

Может, для ссылки на константу есть надежда, что компилятор подставит константу прямо в код?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 14 2011, 07:52
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(AHTOXA @ Jan 13 2011, 21:40) *
Может, для ссылки на константу есть надежда, что компилятор подставит константу прямо в код?
Подскажите, какие существуют методы для проверки подобных гипотез? Дисассемблер?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 14 2011, 08:39
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А как иначе? sm.gif
Ну или можно скомпилировать оба варианта и сравнить размеры получившихся программ.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 19 2011, 18:50
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(AHTOXA @ Jan 14 2011, 11:39) *
А как иначе? sm.gif
Ну или можно скомпилировать оба варианта и сравнить размеры получившихся программ.
Попробовал. Дисассемблером не лазил, а размеры программ сравнил. Практически неотличимо.

Как передавать создаваемому объекту структуру из констант разобрался. Прошу дальнейшей помощи идейного плана. Сейчас уперся в другое. Задача стоит прорисовывать в окне разнородные объекты, например. TComboBox, TCheckBox. TRadioButton..etc., каждый имеет свое описание в виде структур констант, тоже разнотипных. Я думал создать базовый класс TObj с виртуальной функцией прорисовки и от него уже наследовать разнотипные классы, каждый со своей конкретной прорисовкой. Далее думал создать массив указателей на базовые объекты прорисовки и в цикле, по очереди вызывать функцию прорисовки базового объекта.
Тупик наступил на этапе- где должен размещаться указатель на структуру описание, в базовом, или наследуемом классе? По идее в наследуемом. Но тогда до нее не доберешься из базового класса, а ведь цикл прорисовки идет именно по списку из указателей на базовые. Если структуру-констант разместить в базовом классе, то теряется вся идея, поскольку структуры все разного типа и указать конкретно один тип, базовый, не представляется возможным. Прошу совета у гуру С++ - как быть? Также прошу иметь в виду, что речь идет об ARM кристаллах, в которых RAM - маловато, а ROM- много больше. Т.е. по-прежнему загвоздка с директивой const.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 19 2011, 19:44
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Aprox @ Jan 19 2011, 23:50) *
По идее в наследуемом. Но тогда до нее не доберешься из базового класса, а ведь цикл прорисовки идет именно по списку из указателей на базовые.

До неё и не надо добираться. Доступ к ней будет из функции Draw() наследуемого класса. А к функции Draw() доступ по указателю на базовый класс есть, так что всё в порядке.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 19 2011, 20:37
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(AHTOXA @ Jan 19 2011, 22:44) *
До неё и не надо добираться. Доступ к ней будет из функции Draw() наследуемого класса. А к функции Draw() доступ по указателю на базовый класс есть, так что всё в порядке.
Спасибо, все получилось. rolleyes.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Aprox   Снова про const   Jan 10 2011, 06:05
- - Сергей Борщ   QUOTE (Aprox @ Jan 10 2011, 11:05) На С в...   Jan 10 2011, 06:41
- - sergeeff   Ну и оставьте свои Кодconst Tsome_info info1={,,,...   Jan 10 2011, 06:46
|- - Aprox   Спасибо за идею! Действительно, проект можно с...   Jan 10 2011, 07:55
|- - Сергей Борщ   QUOTE (Aprox @ Jan 10 2011, 12:55) Чисто ...   Jan 10 2011, 08:58
- - sergeeff   В общем случае надо явно компилятору/линкеру сообщ...   Jan 10 2011, 08:05
|- - Aprox   Цитата(sergeeff @ Jan 10 2011, 14:05) В о...   Jan 10 2011, 16:44
|- - Сергей Борщ   QUOTE (Aprox @ Jan 10 2011, 21:44) Вот мо...   Jan 10 2011, 20:11
|- - Aprox   Спасибо огромное! Действительно, попробовал по...   Jan 11 2011, 00:36
|- - Сергей Борщ   QUOTE (Aprox @ Jan 11 2011, 05:36) Действ...   Jan 11 2011, 03:36
|- - Aprox   Цитата(Сергей Борщ @ Jan 11 2011, 09:36) ...   Jan 11 2011, 05:55
- - dimka76   А если IAR посвежее взять может там что-то изменил...   Jan 10 2011, 08:24
- - sergeeff   Вы должны четко понять, что С и С++ это разные ком...   Jan 10 2011, 16:58
||- - sergeeff   Цитата(Aprox @ Jan 11 2011, 23:04) А все-...   Jan 11 2011, 17:23
|||- - Сергей Борщ   QUOTE (Aprox @ Jan 13 2011, 13:23) Я тут ...   Jan 13 2011, 08:36
|||- - Aprox   И еще вдогонку вопрос. Как я понимаю, тот массив с...   Jan 20 2011, 06:46
|||- - Сергей Борщ   QUOTE (Aprox @ Jan 20 2011, 08:46) Потому...   Jan 20 2011, 07:51
|||- - Aprox   Цитата(Сергей Борщ @ Jan 20 2011, 10:51) ...   Jan 21 2011, 07:49
|||- - jorikdima   Цитата(Aprox @ Jan 21 2011, 10:49) Что эт...   Jan 21 2011, 08:10
|||- - Aprox   Цитата(jorikdima @ Jan 21 2011, 11:10) Во...   Jan 21 2011, 11:00
|||- - Сергей Борщ   QUOTE (Aprox @ Jan 21 2011, 13:00) но упо...   Jan 21 2011, 11:09
||||- - Aprox   Цитата(Сергей Борщ @ Jan 21 2011, 14:09) ...   Jan 21 2011, 12:39
|||- - ReAl   Цитата(Aprox @ Jan 21 2011, 13:00) К сожа...   Jan 21 2011, 13:59
|||- - jorikdima   Цитата(ReAl @ Jan 21 2011, 16:59) Что-то ...   Jan 21 2011, 14:18
|||- - Aprox   Цитата(ReAl @ Jan 21 2011, 16:59) Кодobje...   Jan 21 2011, 15:12
||- - Oldring   Цитата(Aprox @ Jan 11 2011, 22:04) А все-...   Jan 11 2011, 20:40
|- - dxp   Цитата(Oldring @ Jan 11 2011, 18:25) В го...   Jan 12 2011, 05:12
|- - Oldring   Цитата(dxp @ Jan 12 2011, 11:12) Такие да...   Jan 12 2011, 05:29
|- - jorikdima   Цитата(dxp @ Jan 12 2011, 11:12) Такие да...   Jan 12 2011, 09:34
|- - dxp   Цитата(jorikdima @ Jan 12 2011, 18:34) co...   Jan 13 2011, 02:47
- - ReAl   const_cast<> цяця-ляля, но до тех пор, пока ...   Jan 12 2011, 17:23
- - Oldring   Цитата(ReAl @ Jan 12 2011, 23:23) А когда...   Jan 13 2011, 06:54


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

 


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


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