Страница 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.
В качестве лицензии я просто отправил им номер триалки,что честно сразу и указал. На сайте у них значится "ограниченная техническая поддержка" для триала,но все таки, как видно, ситуация не безнадежна...