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

 
 
> Глюк ИАРа или мой?, Почему ИАР не дает проинициализировать статический атрибут класса
lamerok
сообщение May 14 2007, 06:44
Сообщение #1


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

Группа: Свой
Сообщений: 135
Регистрация: 22-06-04
Из: Челябинск
Пользователь №: 88



Посмотрите плз картинку. Почему ИАР ругается на инициализацию статического члена класса, при этом на инициализацию не статического члена говорит, что атрибут должен быть статическим????.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
lamerok
сообщение May 15 2007, 02:31
Сообщение #2


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

Группа: Свой
Сообщений: 135
Регистрация: 22-06-04
Из: Челябинск
Пользователь №: 88



Цитата(Сергей Борщ @ May 14 2007, 15:00) *
Попробуйте так:
Код
class cClassDir
{

private:
   static tF32 const initVolt;
   tF32 const initTest;
};

// in .cpp:
cClassDir::cClassDir() : initTest(4.0f) {}
tF32 cClassDir::initVolt = 5.0f;
P.S. А виноват, конечно, компилятор smile.gif


Спасибо, так компилятор съел...
Код
const float cClass::initialVoltValueRange = 800.0f;
const float cClass::initialCurValueRange =  0.5f;
const float cClass::initialTestValue = 8.0f;

cClass::cClass(void)    
{
   internalVoltRange = initialVoltValueRange;
   internalCurRange = initialCurValueRange;
   internalTest = initialTestValue;
}


но вот что получилось в ассемблере....

Код
     66                internalVotlRange = initialVoltValueRange;
   \   000000C4   ....               LDI     R16, LOW(??initialVoltValueRange)
   \   000000C6   ....               LDI     R17, (??initialVoltValueRange) >> 8
   \   000000C8   01F8               MOVW    R31:R30, R17:R16
   \   000000CA   8140               LD      R20, Z
   \   000000CC   8151               LDD     R21, Z+1
   \   000000CE   8162               LDD     R22, Z+2
   \   000000D0   8173               LDD     R23, Z+3
   \   000000D2   01F3               MOVW    R31:R30, R7:R6
   \   000000D4   AF41               STD     Z+57, R20
   \   000000D6   AF52               STD     Z+58, R21
   \   000000D8   AF63               STD     Z+59, R22
   \   000000DA   AF74               STD     Z+60, R23
     67                internalCurRange = initialCurValueRange;
   \   000000DC   01F8               MOVW    R31:R30, R17:R16
   \   000000DE   8144               LDD     R20, Z+4
   \   000000E0   8155               LDD     R21, Z+5
   \   000000E2   8166               LDD     R22, Z+6
   \   000000E4   8177               LDD     R23, Z+7
   \   000000E6   934D               ST      X+, R20
   \   000000E8   935D               ST      X+, R21
   \   000000EA   936D               ST      X+, R22
   \   000000EC   937C               ST      X, R23
   \   000000EE   9713               SBIW    R27:R26, 3
     68                internalTest = initialTestValue;
   \   000000F0   8500               LDD     R16, Z+8
   \   000000F2   8511               LDD     R17, Z+9
   \   000000F4   8522               LDD     R18, Z+10
   \   000000F6   8533               LDD     R19, Z+11
   \   000000F8   01FD               MOVW    R31:R30, R27:R26
   \   000000FA   8304               STD     Z+4, R16
   \   000000FC   8315               STD     Z+5, R17
   \   000000FE   8326               STD     Z+6, R18
   \   00000100   8337               STD     Z+7, R19


Т.е. данные берутся из ОЗУ а нужно из памяти программ.... Опять глюк компилятора????

Кстати из первого моего поста, если не делать атрибут класса статическим и проинициализировать его, то ИАР дает предупреждение, как видно на картинке (говорит, что не стаический член класса не рекумендуется инициализировать, сделайте его статическим). И выдает верный код в ассемблере!!!!!
Т.е подставляет непосредственно число (LDI R16, 0 -> LDI R18, 72 -> LDI R19, 68). См. код

Код
     66                internalVoltRange = initialVoltValueRange;
   \   000000C0   E000               LDI     R16, 0
   \   000000C2   E428               LDI     R18, 72
   \   000000C4   E434               LDI     R19, 68
   \   000000C6   01F2               MOVW    R31:R30, R5:R4
   \   000000C8   AF01               STD     Z+57, R16
   \   000000CA   AF02               STD     Z+58, R16
   \   000000CC   AF23               STD     Z+59, R18
   \   000000CE   AF34               STD     Z+60, R19
     67                internalCurRange = initialCurValueRange;
   \   000000D0   EC0D               LDI     R16, 205
   \   000000D2   EC1C               LDI     R17, 204
   \   000000D4   E33E               LDI     R19, 62
   \   000000D6   01F3               MOVW    R31:R30, R7:R6
   \   000000D8   8300               ST      Z, R16
   \   000000DA   8311               STD     Z+1, R17
   \   000000DC   8312               STD     Z+2, R17
   \   000000DE   8333               STD     Z+3, R19
     68                internalTest = initialTestValue;
   \   000000E0   E000               LDI     R16, 0
   \   000000E2   E010               LDI     R17, 0
   \   000000E4   8304               STD     Z+4, R16
   \   000000E6   8305               STD     Z+5, R16
   \   000000E8   8306               STD     Z+6, R16
   \   000000EA   8307               STD     Z+7, R16

Ничего не понимаю....
Обращаться в ИАР????
Go to the top of the page
 
+Quote Post
dxp
сообщение May 15 2007, 03:15
Сообщение #3


Adept
******

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



Цитата(lamerok @ May 15 2007, 09:31) *
Т.е. данные берутся из ОЗУ а нужно из памяти программ.... Опять глюк компилятора????

А с чего он должен во флеши-то появиться? От того, что объявили const? Нет, это не причина - сегмент const на платформе AVR расположен в области ОЗУ и никак он во флешь попасть не может. Именно по этой причине и введено расшинение для AVR в виде ключевого слова __flash.

Цитата(lamerok @ May 15 2007, 09:31) *
Кстати из первого моего поста, если не делать атрибут класса статическим и проинициализировать его, то ИАР дает предупреждение,

Совершенно правильно - нестатические члены-данные класса надо иницилизировать в конструкторе - для этого он и предназначен.

Цитата(lamerok @ May 15 2007, 09:31) *
как видно на картинке (говорит, что не стаический член класса не рекумендуется инициализировать, сделайте его статическим). И выдает верный код в ассемблере!!!!!

Делать те или иниые члены статическими или нестатическими надо не по советам компилятора, а на основе собственного замысла - автор программы-то Вы, Вам и решать, что и как лучше реализовать. А классы, их члены, нестатические и статические - это лишь средства (как и все остальное).

Небольшой хинт: статические члены класса - это по сути обычные глобальные переменные, только помещенные в область видимости класса и если это функции (статические функции-члены), то имеющие доступ к закрытым членам класса. Только и всего. Именно поэтому статические члены-данные надо создавать (выделять под них память) и инициализировать как обычные глобальные переменные (только надо квалифицировать именем класса, т.к. они находятся в его scope (области видимости)). Остальные правила точно такие же, как и с обычными глобальными переменными. Жить такой статический член-данное может совей жизнью - может быть не создано ни одного объекта класса, а этот существует сам по себе. Инициализируется он так же на этапе статической иницализации (когда инициализируются все глобальные объекты не класс типов), которая по Стандарту осуществляется до динамической инициализации (вызова конструкторов объектов), и это обстоятельство может быть использовано - во время вызова конструктора статический член-данное уже гарантировано проициализирован.

Цитата(lamerok @ May 15 2007, 09:31) *
Ничего не понимаю....
Обращаться в ИАР????

IAR тут совершенно не причем, надо просто подучить С++. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- lamerok   Глюк ИАРа или мой?   May 14 2007, 06:44
- - Сергей Борщ   Цитата(lamerok @ May 14 2007, 09:44) Посм...   May 14 2007, 12:00
- - IgorKossak   Статические члены класса определяются и инициализи...   May 14 2007, 15:26
|- - lamerok   Цитата(dxp @ May 15 2007, 06:15) А с чего...   May 15 2007, 03:43
|- - Сергей Борщ   Цитата(lamerok @ May 15 2007, 06:43) Но т...   May 15 2007, 10:27
|- - IgorKossak   Цитата(Сергей Борщ @ May 15 2007, 17:27) ...   May 15 2007, 15:51
||- - zltigo   Цитата(IgorKossak @ May 15 2007, 22:51) Э...   May 15 2007, 16:32
|- - lamerok   Цитата(Сергей Борщ @ May 15 2007, 17:27) ...   May 16 2007, 00:11
|- - Сергей Борщ   Цитата(lamerok @ May 16 2007, 07:11) Каже...   May 16 2007, 04:31
- - lamerok   Цитата(Сергей Борщ @ May 16 2007, 11:31) ...   May 16 2007, 05:23
|- - Сергей Борщ   Цитата(lamerok @ May 16 2007, 12:23) Поче...   May 16 2007, 06:59
|- - lamerok   Цитата(Сергей Борщ @ May 16 2007, 13:59) ...   May 16 2007, 08:23
- - lamerok   Вот что получается... в мар файле Мои переменные л...   May 16 2007, 07:05
|- - IgorKossak   Цитата(lamerok @ May 16 2007, 14:05) Вот ...   May 16 2007, 16:54
|- - lamerok   Цитата(IgorKossak @ May 16 2007, 23:54) N...   May 17 2007, 00:57
|- - Сергей Борщ   Цитата(lamerok @ May 17 2007, 07:57) Но к...   May 17 2007, 03:05
||- - lamerok   Цитата(Сергей Борщ @ May 17 2007, 10:05) ...   May 17 2007, 05:19
||- - Сергей Борщ   Цитата(lamerok @ May 17 2007, 12:19) Код-...   May 17 2007, 06:13
||- - lamerok   Цитата(Сергей Борщ @ May 17 2007, 09:13) ...   May 20 2007, 16:03
|- - IgorKossak   Цитата(lamerok @ May 17 2007, 07:57) Хочу...   May 17 2007, 05:13
- - lamerok   После кучи экспериментов пришел к выводу: 1. Можно...   May 21 2007, 14:24


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

 


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


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