Баг(?) IAR для AVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Lezz
Родился
Сообщения: 5
Зарегистрирован: Пн янв 25, 2010 06:20:54

Баг(?) IAR для AVR

Сообщение Lezz »

Нарвался я на интересный (и весьма противный для меня) баг...При существовании пары классов произведенных виртуальным наследованием от общего предка,тело их общего виртуального метода должно содержаться в определении класса.
( То есть так :

Код: Выделить всё

class Pegasus2 : /*public Horse,*/ public Bird2
  {
     ...
     void Chirp() {cout << "Pegasus2 Chirp...\n";}     
  };
)
----------
А если так:

Код: Выделить всё

class Pegasus2 : /*public Horse,*/ public Bird2
  {
     ...
     void Chirp() ;//{cout << "Pegasus2 Chirp...\n";}     
  };

pegasus2_c.c:

Код: Выделить всё

#include "pegasus2.h"
void Pegasus2::Chirp()
{cout << "Pegasus2 Chirp...\n";}


то ни в какую:
" Error[e27]: Entry "Bird2::__vtbl_Animal_c0" in module pegasus2_c (
C:\Users\Igor\Documents\IAR\test_project\Debug\Obj\pegasus2_c.r90 )
redefined in module pegasus3_c ".

Баг? или я чего то не понимаю?
Приложил компилящийся и не компилящийся проект,отличаются они только упомянутым.
И картинку для простоты осознания схемы наследования....
Ждемс критики...
Вложения
test-virtualInheritance2.rar
Еще более простой проект
(36.19 КБ) 135 скачиваний
IAR_AVR_linker_bug.rar
проект
(158.79 КБ) 147 скачиваний
Scan-100125-0001+_resize.png
схема классов
(100.82 КБ) 409 скачиваний
Последний раз редактировалось Lezz Сб янв 30, 2010 02:18:17, всего редактировалось 1 раз.
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Сообщение Doniak »

извиняюсь что не по теме, но не хотел создавать новую тему :)

собственно провожу компиляцию проэкта Debug все нормально,
а вот когда компилирую Release ИАР начинает ругатся
Error[Pe020]: identifier "CLK_PSADIV_1_gc" is undefined C:\1progIAR_AVR_XMEGA\Untitled2.c 12
хотя CLK_PSADIV_1_gc прописан через #define в файле ATXmega128A1.h

собственно пример прикрепляю
Вложения
1progIAR_AVR_XMEGA.rar
пример
(19.25 КБ) 126 скачиваний
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

хмм, с классами в си не работал, но тут непонятно, разве в си не надо виртуальные методы перекрывать в дочерних классах, типа как в делфи "override"?
и вот тут void Pegasus2::Chirp() случаем не надо указать в скобках тип void? да и в объявлениях тоже самое.. может из-за этой мелочи и не компилится?
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

Разве классы для С (не С++) и уж тем более МК существуют? Ведь классы относятся к ООП.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

Meteor, это не C, это C++. IAR позволяет писать на С++, и как следствие поддерживает парадигму ООП.

---
Написал я ерунду, не заметил последнего фрагмента кода. По идее все должно работать... Скачал проект, и не лень было делать столько файлов? пипец как неудобно, нихрена не разберешь... завтра на свежую голову подумаю
Lezz
Родился
Сообщения: 5
Зарегистрирован: Пн янв 25, 2010 06:20:54

Сообщение Lezz »

Насчет кучи файлов: тут оно,конечно,смысла не имеет... тут все можно прямо в определение класса вписывать,только и бага-то тогда нет....

А насчет Chirp(void) я прошелся на всякий случай,заменил-не помогло....
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

Бага мож и вылазит гдето чтото напутали может...
Lezz
Родился
Сообщения: 5
Зарегистрирован: Пн янв 25, 2010 06:20:54

Сообщение Lezz »

Ну,я постарался вроде упростить настолько,насколько это возможно....
Основная причина,по которой я считаю что это баг - это отличия между компилящимся и некомпилящимся проектом...если побайтно сравнить,тоталом например,разница только в том что я вынес определение метода в отдельный файл...Как так можно накосячить чтоб оно при этом ошибалось?
Впрочем....сейчас попробую слить все в 1 файл...
------
PS добавил в шапку проект,в котором все одним файлом....И пегаса там 2 а не 3...
Он не компилится,чтоб компилилось,достаточно из этого:

Код: Выделить всё

class Pegasus2 : /*public Horse,*/ public Bird
  {
  public:
   

     Pegasus2();
     virtual ~Pegasus2() {cout << "Pegasus destructor...\n";}
                     
     void Chirp(void);/// {cout << "Pegasus2 Chirp...\n";}   ////:UNCOMMENT THIS
  };
///...
void Pegasus2::Chirp(void)               ////:COMMENT THIS
{cout << "Pegasus2 Chirp...\n";}         ////:COMMENT THIS
сделать это:

Код: Выделить всё

class Pegasus2 : /*public Horse,*/ public Bird
  {
  public:
   

     Pegasus2();
     virtual ~Pegasus2() {cout << "Pegasus destructor...\n";}
                     
     void Chirp(void){cout << "Pegasus2 Chirp...\n";}   ////:UNCOMMENT THIS
  };
 

  //COMMENT: 
////void Pegasus2::Chirp(void)               ////:COMMENT THIS
///{cout << "Pegasus2 Chirp...\n";}         ////:COMMENT THIS


Вот,собственно...всегда думал что это одно и то же....
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

Да, это и есть одно и тоже... Даже не знаю что вам сказать. Не пробовали компилировать под виндовс?
Lezz
Родился
Сообщения: 5
Зарегистрирован: Пн янв 25, 2010 06:20:54

Сообщение Lezz »

Собственно,и компилится и работает(оба варианта).. VS2008 : vc++ : win32 console.
все,что пришлось дописать:

Код: Выделить всё

#include "stdafx.h"
#include <iostream>
using namespace std;

я б конечно,мог приложить проект,только зачем?...


я сейчас у себя это обошел примерно так:

Код: Выделить всё

...
void OnClose(void){OnClose_cpuR();};   
void OnClose_cpuR(void);///здесь на "внешний" код не ругается,ибо к наследованию отношения не имеет
...     
все равно потом инлайнится,наверно,а нет так нет-по скорости здесь совсем не критично...
Я даже этим жлобам написал на мыло,но они лишь ответили,что надо номер лицензии,мол,прикладывать,зато быстро ;)
Найти бы кого с лицухой,кто б от своего имени им написал...
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

С лицензиями засада - больно дорогой йар
Lezz
Родился
Сообщения: 5
Зарегистрирован: Пн янв 25, 2010 06:20:54

Может,сий мой опыт общения с support@iar кому-нибудь поможет

Сообщение Lezz »

Гм...а они таки признали что это баг....
Hello,

The reported behaviour is a bug.
Thanks for reporting it.

I will file a bug report.
В качестве лицензии я просто отправил им номер триалки,что честно сразу и указал. На сайте у них значится "ограниченная техническая поддержка" для триала,но все таки, как видно, ситуация не безнадежна...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»