C ++ приведёт указатель на статический метод - PullRequest
5 голосов
/ 15 сентября 2011

Я давно не пишу код на C ++; Однако теперь я должен работать на DSP Texas Instruments 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"

Полагаю, мне не хватает актеров

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Я думаю, что основная проблема заключается в том, что амперсанд и префикс RHS в вашем назначении на 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;
}
0 голосов
/ 15 сентября 2011

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

0 голосов
/ 15 сентября 2011

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

static interrupt void Epwm1InterruptHandler(void);

и

static interrupt void Epwm1InterruptHandler(void);

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

interrupt p;
p = &(EPWMManager::Epwm1InterruptHandler());
...