2011-09-15 24 views
5

मैंने लंबे समय तक सी ++ कोड नहीं लिखा है; हालांकि अब मुझे टेक्सास उपकरणों F28335 डीएसपी पर काम करना है और मैं सी से सी ++ में माइग्रेट करने की कोशिश कर रहा हूं।सी ++ स्थिर विधि के लिए कास्ट सूचक

//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; 
} 

जब संकलन मैं निम्नलिखित मिल:

error: a value of type "void (*)()" cannot be assigned to an entity of type "PINT"

मुझे लगता है मैं याद कर रहा हूँ मैं निम्नलिखित कोड है कि एक वर्ग का एक स्थिर विधि के साथ व्यवधान सेवा दिनचर्या प्रारंभ करने की कोशिश कर रहा है कुछ कास्ट

+1

'इंटरप्ट' कीवर्ड सी ++ का हिस्सा नहीं है। यह आपके कार्यान्वयन के लिए विशिष्ट एक विस्तार होना चाहिए। क्या होता है यदि आप इसे 'पिनटी' और 'एपीडब्ल्यूएम 1 इंटरप्टहैंडलर' दोनों की परिभाषाओं से हटा देते हैं? क्या आपको अभी भी कोई त्रुटि मिलती है? –

+0

डीएसपी प्रोसेसर के लिए टीआई कंपाइलर्स के अपने अनुभव की गुणवत्ता में सी के लिए भी प्रभावशाली नहीं है (उदाहरण के लिए हमने पेज हैंडलिंग के सीमा मामलों पर कोड जनरेटर की बग में एक से अधिक बार बाउंस किया)। क्या आप सुनिश्चित हैं कि सी ++ जैसी अधिक जटिल भाषा में माइग्रेट करना एक अच्छा विचार है? – 6502

+0

अगर मैं त्रुटि को 'इंटरप्ट' लेता हूं तो बाहर निकलता है ... हालांकि मुझे इसके प्रभावों के बारे में निश्चित नहीं है। मैं सोच रहा था कि सी ++ में माइग्रेट करना सब कुछ अधिक संरचित (वर्ग, वस्तुओं, डिजाइन पैटर्न इत्यादि) रखने के लिए एक अच्छा विचार होगा क्योंकि हमारे सी कोड बहुत गन्दा दिखने लग रहे हैं। – TropE

उत्तर

2

मुझे लगता है कि मौलिक समस्या यह है कि एपर्सेंड पी के लिए आपके असाइनमेंट के आरएचएस को उपसर्ग कर रहा है। इसके अलावा, अन्य ऑपरेटिंग सिस्टम में "पिनटी" "पूर्णांक के लिए सूचक" है। तो चलो किसी संभावित नाम विवाद से बचें। लेकिन मुझे लगता है कि यह आपके लिए काम करेगा:

// 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

आप सही हैं। प्रदान किया गया कोड बस ठीक काम करता है। मेरे कोड पर नज़र डालने के बाद मैंने देखा कि टाइपिफ़ को बाहरी सी के रूप में घोषित किया गया था, जिससे इसे सी ++ कोड के साथ असंगत बना दिया गया। मैंने इसे हटा दिया, और यह अब काम करता है। धन्यवाद। – TropE

0

मुझे लगता है कि आप कई असंबंधित वाक्य रचना गलतियों यहाँ है: के रूप में मैं अपने Epwm1InterruptHandler समझते हैं तो पहली पंक्ति से शून्य हटाने प्रकार बाधा के एक समारोह के लिए एक सूचक वापस जाने के लिए माना जाता है,

static interrupt void Epwm1InterruptHandler(void); 

और

static interrupt void Epwm1InterruptHandler(void); 

तो प्रकार व्यवधान के पी, और फिर इस तरह कोष्ठक डाल:

interrupt p; 
p = &(EPWMManager::Epwm1InterruptHandler()); 
+0

वह फ़ंक्शन * आईएस * इंटरप्ट हैंडलर, ऐसा कुछ नहीं जो एक इंटरप्ट हैंडलर को पॉइंटर देता है। – 6502

0

क्या आप गायब नहीं हैं; टाइपपीफ अंतराल (* पिनटी) (शून्य) में बाधा डालने के बाद? आपका कोड मेरे लिए संकलित करता है।

संबंधित मुद्दे