Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 22.12.2010, 02:56  
Profyelec
Прохожий
 
Аватар для Profyelec
 
Регистрация: 13.02.2010
Сообщений: 9
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
Profyelec на пути к лучшему
Вопрос Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Доброго времени суток.
Есть серйозный вопрос к спецам по программированию в С++.
Некоторый код нужно чтобы был одновременно под два разных направления, то есть в одном случае он используется по Borland C builder в качестве DLL, а в другом случае используется для Mega2560. Код приведен ниже:

class class_a
{
private:
int FInternalCount;
public:
class_a();
#ifdef _WIN32
void (__closure * fptr)(void); // Borland C Builder'a
#else
// для микроконтроллера не знаю что написать
//???
#endif
virtual void Check(void);
};

class class_b
{
private:
class_a * ca;
public:
class_b();
virtual void func_b(void);
virtual void RunClassA(void);
};

class class_c
{
private:
class_a * ca;
public:
class_c();
virtual void func_c(void);
virtual void RunClassA(void);
};

class_a::class_a()
{
fptr = 0x0000;
FInternalCount = 0;
}

void class_a::Check(void)
{
// тут тоже не знаю как это написать для микроконтроллера -
// проверка что обработчик назначен и вызов его
if ((fptr) && (FInternalCount++ == 50))
{
FInternalCount = 0;
fptr();
}
}

class_b::class_b()
{
ca = new class_a();
ca-›fptr = func_b; // назначение обаботчика некоторого события дла class_b
}

void class_b::func_b()
{
// обработчик события класса class_b
}

void class_b::RunClassA()
{
ca-›Check();
}


class_c::class_c()
{
ca = new class_a();
ca-›fptr = func_c; // назначение обаботчика некоторого события дла class_c
}

void class_c::func_c()
{
// обработчик события класса class_c
}

void class_c::RunClassA()
{
ca-›Check();
}

class_b * cb;
class_c * cc;

void main()
{
cb = new class_b();
cc = new class_c();

while (1)
{
cb-›RunClassA();
cc-›RunClassA();
}
}

Уже целую неделю бьюся над кодом ...
Отсюда следует вопрос как это переписать для IAR? Кто что может посоветовать?
Реклама:

Последний раз редактировалось Profyelec; 22.12.2010 в 11:50. Причина: Слетели коменты при вставке кода
Profyelec вне форума  
Непрочитано 22.12.2010, 04:13  
Красный Свин
Частый гость
 
Регистрация: 12.10.2010
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
Красный Свин на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Ну, во-первых, это не код - это отъявленный случай говнокода, который неизвестно что делает и вообще непонятно, зачем написан.

2. За написание такого говнокода надо просто убивать, пока говнокодер не сотворил что-нибудь трагического, типа перехода в говноманагеры.

3. "__closure" - это нестандартное расширение Ц++ и непонятно, зачем оно тут используется.

Вот так будет получше, хотя все равно непонятно, зачем это барахло нужно.

#ifdef _WIN32
void (__closure * fptr)(void); // Borland C Builder'a
#else
void (* fptr)(void); // standard C++ compiler
#endif

4. IAR, AFAIK, всегда отличался некоторой ублюдочностью. Он указатели на функции-члены классов вообще поддерживает ?
Красный Свин вне форума  
Непрочитано 22.12.2010, 12:08  
Profyelec
Прохожий
 
Аватар для Profyelec
 
Регистрация: 13.02.2010
Сообщений: 9
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
Profyelec на пути к лучшему
Вопрос Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Попорядку:
Сообщение от Красный Свин Посмотреть сообщение
Ну, во-первых, это не код - это отъявленный случай говнокода, который неизвестно что делает и вообще непонятно, зачем написан.
Согласен. Но сам проект лежит в нескольких файлах и исходники довольно объемистые. Просьба рассматривать как пример. Коменты которые слетели при вставке поправлены.

Сообщение от Красный Свин Посмотреть сообщение
3. "__closure" - это нестандартное расширение Ц++ и непонятно, зачем оно тут используется.
Знаю но аналогии в IAR нет либо я не могу найти...

Сообщение от Красный Свин Посмотреть сообщение
Вот так будет получше, хотя все равно непонятно, зачем это барахло нужно.

#ifdef _WIN32
void (__closure * fptr)(void); // Borland C Builder'a
#else
void (* fptr)(void); // standard C++ compiler
#endif
Ответ не правильный. Он действителен только для статических методов классов или функций которые находяться вне класов. (читаем заголовок темы и думаем).
Вот пример оглашения, но он привязывается к конкретному класу(а нужно чтоб к разным):
#ifdef _WIN32
void (__closure * fptr)(void); // Borland C Builder'a
#else
void (class_b::* fptr)(void); // оглашение что указатель будет загружен на виртуальный метод класса class_b
#endif
Присвоить сюда указатель метода класса class_c компилятор не даст!


Сообщение от Красный Свин Посмотреть сообщение
4. IAR, AFAIK, всегда отличался некоторой ублюдочностью. Он указатели на функции-члены классов вообще поддерживает ?
Тоже не согласен. Нужно уметь пользоваться инструментарием. И самое интересное все таки поддерживает.
Profyelec вне форума  
Непрочитано 22.12.2010, 12:22  
alberio
Гражданин KAZUS.RU
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
alberio на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Ну... а в чем проблема-то?

Таким же макаром через препроцессорные директивы #ifndef / #ifdef

Или же вас интересует как что-то конкретное перевести на ИАРовский С++, тогда что конкретно? Или я не понял чего?
__________________
Sex, Druggs, Rock&Roll
alberio вне форума  
Непрочитано 22.12.2010, 12:33  
Profyelec
Прохожий
 
Аватар для Profyelec
 
Регистрация: 13.02.2010
Сообщений: 9
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
Profyelec на пути к лучшему
Вопрос Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Интересует как правильно огласить указатель метода внешнего класса, но так чтоб не прывязывать к его к конкретному класу:

void (class_b::* fptr)(void);
...
...

ca-›fptr = &class_b::func_b; //‹-- нормально компилируется
а
ca-›fptr = &class_c::func_c; //‹-- ругается

Error[Pe513]: a value of type "void (__farfunc __version_3 class_c::*)()" cannot be assigned to an entity of type "void (__farfunc __version_3 class_b::*)()"
Profyelec вне форума  
Непрочитано 22.12.2010, 12:59  
alberio
Гражданин KAZUS.RU
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
alberio на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Умная книжка не пишет, как это сделать, ясно только что нельзя преобразовать указатель на функцию член класса в указатель на обычную - и наоборот, из-за this, следовательно преобразовать указатель на функцию член класса можно преобразовать на функцию член другого класса... Возможно через приведение типов...
__________________
Sex, Druggs, Rock&Roll
alberio вне форума  
Непрочитано 22.12.2010, 13:06  
Profyelec
Прохожий
 
Аватар для Profyelec
 
Регистрация: 13.02.2010
Сообщений: 9
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
Profyelec на пути к лучшему
Вопрос Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Сообщение от alberio Посмотреть сообщение
Умная книжка не пишет, как это сделать, ясно только что нельзя преобразовать указатель на функцию член класса в указатель на обычную - и наоборот, из-за this
Насколько я понимаю Вы говорите о статическом методе или все же нет?

Сообщение от alberio Посмотреть сообщение
следовательно преобразовать указатель на функцию член класса можно преобразовать на функцию член другого класса... Возможно через приведение типов...
Как привести тип class_c::* к типу class_b::* ???
Profyelec вне форума  
Непрочитано 22.12.2010, 13:16  
alberio
Гражданин KAZUS.RU
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
alberio на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Меня самого этот вопрос заинтересовал, сижу, думаю.
По логике вещей надо через reinterpret_cast преобразовывать.
__________________
Sex, Druggs, Rock&Roll
alberio вне форума  
Непрочитано 22.12.2010, 13:24  
alberio
Гражданин KAZUS.RU
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
alberio на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Кстати, о птичках, а вы о каких методах говорите - я не о статических.
Ведь в таком случае вместе с указателем на функцию this не передается, и єто совсем другие пироги...
__________________
Sex, Druggs, Rock&Roll
alberio вне форума  
Непрочитано 22.12.2010, 13:42  
Profyelec
Прохожий
 
Аватар для Profyelec
 
Регистрация: 13.02.2010
Сообщений: 9
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
Profyelec на пути к лучшему
Вопрос Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Да - да. Именно не о статических. Иначе писалось бы все на чистом С.
Profyelec вне форума  
 

Закладки

Метки
c++, iar c++
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь с системой сигнализирования andrey300 Производственное оборудование 1 12.12.2010 16:34
Нужна помощь по схеме Жора Корнев Электроника средств транспорта 5 20.08.2010 17:13
Нужна помощь CDC-232 и atmega16 robin7341 Микроконтроллеры, АЦП, память и т.д 0 08.08.2010 00:13
Нужна помощь с картой SD в режим SD! (не SPI) backa Микроконтроллеры, АЦП, память и т.д 2 23.04.2010 15:28
AVR Studio и AT89S51 - нужна помощь roobeeaz Микроконтроллеры, АЦП, память и т.д 5 13.03.2010 18:34


Часовой пояс GMT +4, время: 19:26.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot