Страница 1 из 1

Баг(?) IAR для AVR

Добавлено: Пн янв 25, 2010 07:21:57
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 ".

Баг? или я чего то не понимаю?
Приложил компилящийся и не компилящийся проект,отличаются они только упомянутым.
И картинку для простоты осознания схемы наследования....
Ждемс критики...

Добавлено: Вт янв 26, 2010 10:01:27
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

собственно пример прикрепляю

Добавлено: Ср янв 27, 2010 19:27:04
QZ_
хмм, с классами в си не работал, но тут непонятно, разве в си не надо виртуальные методы перекрывать в дочерних классах, типа как в делфи "override"?
и вот тут void Pegasus2::Chirp() случаем не надо указать в скобках тип void? да и в объявлениях тоже самое.. может из-за этой мелочи и не компилится?

Добавлено: Ср янв 27, 2010 20:12:45
Meteor
Разве классы для С (не С++) и уж тем более МК существуют? Ведь классы относятся к ООП.

Добавлено: Чт янв 28, 2010 02:23:41
BCluster
Meteor, это не C, это C++. IAR позволяет писать на С++, и как следствие поддерживает парадигму ООП.

---
Написал я ерунду, не заметил последнего фрагмента кода. По идее все должно работать... Скачал проект, и не лень было делать столько файлов? пипец как неудобно, нихрена не разберешь... завтра на свежую голову подумаю

Добавлено: Чт янв 28, 2010 20:39:56
Lezz
Насчет кучи файлов: тут оно,конечно,смысла не имеет... тут все можно прямо в определение класса вписывать,только и бага-то тогда нет....

А насчет Chirp(void) я прошелся на всякий случай,заменил-не помогло....

Добавлено: Сб янв 30, 2010 00:56:00
BCluster
Бага мож и вылазит гдето чтото напутали может...

Добавлено: Сб янв 30, 2010 02:00:53
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
Вот,собственно...всегда думал что это одно и то же....

Добавлено: Сб янв 30, 2010 12:29:18
BCluster
Да, это и есть одно и тоже... Даже не знаю что вам сказать. Не пробовали компилировать под виндовс?

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

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

#include "stdafx.h"
#include <iostream>
using namespace std;
я б конечно,мог приложить проект,только зачем?...


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

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

...
void OnClose(void){OnClose_cpuR();};    
void OnClose_cpuR(void);///здесь на "внешний" код не ругается,ибо к наследованию отношения не имеет
...     
все равно потом инлайнится,наверно,а нет так нет-по скорости здесь совсем не критично...
Я даже этим жлобам написал на мыло,но они лишь ответили,что надо номер лицензии,мол,прикладывать,зато быстро ;)
Найти бы кого с лицухой,кто б от своего имени им написал...

Добавлено: Сб янв 30, 2010 22:36:13
BCluster
С лицензиями засада - больно дорогой йар

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

Добавлено: Ср фев 03, 2010 15:06:36
Lezz
Гм...а они таки признали что это баг....
Hello,

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

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