Указатель приведения С++ к статическому методу

Я давно не писал код на C++; однако теперь мне нужно работать с цифровым сигнальным процессором texas tools F28335, и я пытаюсь перейти с C на C++. У меня есть следующий код, который пытается инициализировать процедуру обслуживания прерываний статическим методом класса:

//type definition for the interrupt service routine
typedef interrupt void (*PINT)(void);
//EPWMManager.h
class EPWMManager
{
public:
    EPWMManager();      
    static interrupt void Epwm1InterruptHandler(void);  
};
//EPWMManager.cpp
interrupt void EPWMManager::Epwm1InterruptHandler(void)
{
 //some code to be called on interruption
}   
//main.cpp
int main(void)
{
    PINT p;
    p = &(EPWMManager::Epwm1InterruptHandler);
    return 0;
 }

При компиляции получаю следующее:

ошибка: значение типа "void (*)()" не может быть присвоено объекту типа "PINT"

Кажется, мне не хватает актерского состава.


person TropE    schedule 15.09.2011    source источник
comment
Ключевое слово interrupt не является частью C++. Это должно быть расширение, специфичное для вашей реализации. Что произойдет, если вы удалите его из определений как PINT, так и Epwm1InterruptHandler? Вы все еще получаете сообщение об ошибке?   -  person n. 1.8e9-where's-my-share m.    schedule 15.09.2011
comment
По моему опыту, качество компиляторов TI для процессоров DSP не впечатляет даже для C (например, мы не раз отскакивали от ошибок генератора кода на граничных случаях обработки страниц). Вы уверены, что переход на гораздо более сложный язык, такой как C++, является хорошей идеей?   -  person 6502    schedule 15.09.2011
comment
если я возьму «прерывание», ошибка исчезнет ... Однако я не уверен в ее последствиях. Я подумал, что переход на C++ был бы хорошей идеей, чтобы все было более структурировано (классы, объекты, шаблоны проектирования и т. д.), поскольку наш код C начинает выглядеть очень беспорядочно.   -  person TropE    schedule 15.09.2011


Ответы (3)


Я думаю, что фундаментальная проблема заключается в том, что амперсанд, предшествующий правой стороне вашего назначения на p. Кроме того, «PINT» — это «указатель на целое число» в других операционных системах. Так что давайте избегать любых потенциальных конфликтов имен. Но я думаю, что это сработает для вас:

// you may have to move "interrupt" keyword to the left of the "void" declaration.  Or just remove it.
typedef void (interrupt *FN_INTERRUPT_HANDLER)(void);

interrupt void EPWMManager::Epwm1InterruptHandler(void)
{
 //some code to be called on interruption
}  

int main(void)
{
    FN_INTERRUPT_HANDLER p;
    p = EPWMManager::Epwm1InterruptHandler; // no ampersand

    // and if for whatever reason you wanted to invoke your function, you could just do this:

   p(); // this will invoke your function.

    return 0;
}
person selbie    schedule 15.09.2011
comment
Ты прав. Предоставленный код работает просто отлично. Присмотревшись к своему коду, я заметил, что typedef был объявлен как внешний C, что делает его несовместимым с кодом C++. Я удалил это, и теперь это работает. Спасибо. - person TropE; 15.09.2011

Я думаю, что у вас есть несколько несвязанных синтаксических ошибок: как я понимаю, ваш Epwm1InterruptHandler должен возвращать указатель на функцию типа прерывания, а затем сначала удалять пустоту из строки

static interrupt void Epwm1InterruptHandler(void);

и

static interrupt void Epwm1InterruptHandler(void);

затем сделайте p типа прерывания, а затем расставьте скобки так:

interrupt p;
p = &(EPWMManager::Epwm1InterruptHandler());
person Anton Daneyko    schedule 15.09.2011
comment
Эта функция ЯВЛЯЕТСЯ обработчиком прерывания, а не чем-то, что возвращает указатель на обработчик прерывания. - person 6502; 15.09.2011

Вам не хватает ; после прерывания typedef void (*PINT)(void)? Ваш код компилируется для меня.

person cpl    schedule 15.09.2011