|
Глюк ИАРа или мой?, Почему ИАР не дает проинициализировать статический атрибут класса |
|
|
|
 |
Ответов
|
May 15 2007, 02:31
|

Частый гость
 
Группа: Свой
Сообщений: 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. А виноват, конечно, компилятор  Спасибо, так компилятор съел... Код 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 Ничего не понимаю.... Обращаться в ИАР????
|
|
|
|
|
May 15 2007, 03:15
|

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 тут совершенно не причем, надо просто подучить С++.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 15 2007, 03:43
|

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

|
Цитата(dxp @ May 15 2007, 06:15)  А с чего он должен во флеши-то появиться? От того, что объявили const? Нет, это не причина - сегмент const на платформе AVR расположен в области ОЗУ и никак он во флешь попасть не может. Именно по этой причине и введено расшинение для AVR в виде ключевого слова __flash. 1. Я не говориил, что static const Должен быть во Флеше. Я говорил, что правильный компилятор, Должен static const параметр в коде просто подменить числом!!!! Число естественно лежит в коде (во флеше)  См последний дизамблер с прошлого поста. Он так и сделал, но при этом я не писал, что атрибут static!!!! а просто написал const tF32 internalVoltValueRange = 800.0f Цитата(dxp @ May 15 2007, 06:15)  Совершенно правильно - нестатические члены-данные класса надо иницилизировать в конструкторе - для этого он и предназначен. Делать те или иниые члены статическими или нестатическими надо не по советам компилятора, а на основе собственного замысла - автор программы-то Вы, Вам и решать, что и как лучше реализовать. А классы, их члены, нестатические и статические - это лишь средства (как и все остальное). Вот нестатический мне не нужен. Но компилятор не воспринимает почему-то статический тип и не хочет его инициировать. Замысел. Объявляем static const атрибут в классе, инициализируем его и это у нас получается, если по Сишному сказать как бы #define. Т.е компилятор в коде должен подставлять не саму пременную, а только число. Так и просиходит, но только в случае если я static нее ставлю перед const. Вопрос почему???? Код internalVoltRange = initialVoltValueRange; \ 000000C0 E000 LDI R16, 0 //00h 00h 73h 68h = 800.0f \ 000000C2 E428 LDI R18, 72 \ 000000C4 E434 LDI R19, 68 Код // Class.h class cClass { public: float getInternalVoltRange(void) const { return internalVoltRange; } float getInternalCurRange(void) const { return internalCurRange; } float getInternalTest(void) const { return internalTest; }
private: float internalVoltRange; float internalCurRange; float internalTest;
const float initialVoltValueRange = 800.0f; // Что за вата??? Почему так можно вообще делать??? // static const float initialVoltValueRange = 800.0f; // А вот так почему нельзя???? const float initialCurValueRange = 0.40f; // static const float initialCurValueRange = 0.40f; const float initialTestValue = 0.0f; // static const float initialTestValue = 0.0f; };
// Class.cpp ... //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; } Цитата(dxp @ May 15 2007, 06:15)  Именно поэтому статические члены-данные надо создавать (выделять под них память) и инициализировать как обычные глобальные переменные Но только не static const. Как таковой переменной не существует, есть некий идентификатор только, который компилятор подменяте конктретным числом. Цитата(dxp @ May 15 2007, 06:15)  IAR тут совершенно не причем, надо просто подучить С++.  ИАР причем, а C++ изучать - так это всем надо сделать
|
|
|
|
|
May 15 2007, 10:27
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(lamerok @ May 15 2007, 06:43)  Но только не static const. Как таковой переменной не существует, есть некий идентификатор только, который компилятор подменяте конктретным числом. Еще раз, по губам: Объявлен (описан тип) статический член класса в объявлении класса, которое обычно в .h и которое через include может быть включено в несколько .cpp - файлов. Определен этот член и проинициализирован (ему присвоено значение) в каком-то из .cpp файлов. Внимание, вопрос: откуда компилятор, компилируя другой .cpp - файл знает, какое значение вы присвоили этому члену? Цитата(lamerok @ May 15 2007, 06:43)  ИАР причем Кто бы сомневался, один lamerok д'Артаньян
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 15 2007, 15:51
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Сергей Борщ @ May 15 2007, 17:27)  Еще раз, по губам: Объявлен (описан тип) статический член класса в объявлении класса, которое обычно в .h и которое через include может быть включено в несколько .cpp - файлов. Определен этот член и проинициализирован (ему присвоено значение) в каком-то из .cpp файлов. Внимание, вопрос: откуда компилятор, компилируя другой .cpp - файл знает, какое значение вы присвоили этому члену? Это не обязательно знать компилятору. А линкер, при сборке проекта, будет это знать в любом случае.
|
|
|
|
|
May 15 2007, 16:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(IgorKossak @ May 15 2007, 22:51)  Это не обязательно знать компилятору. А линкер, при сборке проекта, будет это знать в любом случае. Вот линкер и знает, и настраивает адрес константы в сегменте данных. А у lamerok претензии, что константа не прямо в коде (кодовом серменте) находится. А это компилятор мог-бы сделать, и ему даже сказали, что это константа, но ее значение ему в общем случае неведомо по указанной Сергеем причине.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
lamerok Глюк ИАРа или мой? May 14 2007, 06:44 Сергей Борщ Цитата(lamerok @ May 14 2007, 09:44) Посм... May 14 2007, 12:00 IgorKossak Статические члены класса определяются и инициализи... May 14 2007, 15:26    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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|