2012-01-27 14 views
5

का उपयोग करते समय कोई मिलान करने वाली फ़ंक्शन त्रुटि नहीं है मुझे अपने नवीनतम Arduino प्रोजेक्ट कोड के साथ एक छोटी सी त्रुटि है जो TimerOne library का उपयोग 4 अंकों, 7 सेगमेंट डिस्प्ले पर प्रदर्शित करने के लिए करता है। मैं माइक्रोप्रोसेसर को प्रत्येक अंक के बीच लगातार फ्लिक करने के लिए एक बाधा का उपयोग करता हूं क्योंकि वे अनिवार्य रूप से एक साथ वायर्ड होते हैं।attachInterrupt

मेरे पास कोड पूरी तरह से काम कर रहा है अगर मैं इसे मुख्य पीडीई फ़ाइल में रखता हूं, लेकिन मैंने सोचा कि प्रदर्शन को अपनी कक्षा में अलग करना बेहतर होगा।

मेरे संकलक PDE में निम्न कोड की दूसरी पंक्ति के साथ समस्या हो रहा है:

Timer1.initialize(500); 
Timer1.attachInterrupt(digitDisplay.flashDigit,500); 

attachInterrupt में दूसरा आर्ग वैकल्पिक होना चाहिए, मैं साथ हैं और इस के बिना की कोशिश की है! किसी भी तरह मैं निम्नलिखित त्रुटि मिलती है:

DigitDisplayTest.cpp: In function 'void setup()': 
DigitDisplayTest:29: error: no matching function for call to  'TimerOne::attachInterrupt(<unresolved overloaded function type>)' 
C:\Program Files (x86)\arduino-0022\arduino-0022\libraries\Timer1/TimerOne.h:62: note: candidates are: void TimerOne::attachInterrupt(void (*)(), long int) 

DigitDisplay (जिनमें से digitDisplay एक उदाहरण है) के भीतर, मैं flashDigit परिभाषित इस प्रकार है:

class DigitDisplay 
{ 
    private: 
    /*...*/ 
    public: 
    /*...*/ 
    void flashDigit(); 
} 

void DigitDisplay::flashDigit() 
{ 
    wipeDisplay(); 
    for (int i = 0; i < _digitCount ; i++) 
    { 
    if (i == _digit) digitalWrite(_digitPins[i], HIGH); 
    else digitalWrite(_digitPins[i], LOW); 
    } 
    displayNumber(_digits[_digit]); 
    _digit++ ; 
    _digit %= _digitCount; 
} 

आप अधिक कोड की आवश्यकता होती है तो कृपया मुझे पता है, लेकिन मैं कर रहा हूँ निश्चित रूप से FlashDigit() विधि के gubbings के साथ कुछ भी गलत नहीं है - यह निश्चित रूप से इसे अपनी कक्षा के अंदर रखने से पहले काम किया।

जाहिर है मैं मुख्य PDE करने

void Interrupt() 
{ 
    digitDisplay.flashDigit(); 
} 

जोड़ते और उसे समारोह संलग्न करके इस त्रुटि को नाकाम कर सकते हैं, लेकिन यह सिर्फ एक काम के आसपास है, यह अच्छा होगा अगर मैं इसे सीधे कह सकते हैं।

मुझे लगता है कि एक फ़ंक्शन पॉइंटर बनाने में त्रुटि है (जिसमें से कोई त्रुटि नहीं है), लेकिन पॉइंटर्स मेरे मजबूत बिंदु नहीं हैं इसलिए मैं वास्तव में इसे हाथ से सॉर्ट कर सकता हूं।

+0

आपका दूसरे उदाहरण का उपयोग करता है 'digitDisplay.flashDigit()' जो 'digitDisplay तुलना में अलग है:

#include "Classname.h" void* pt2Object; void Classname::receiveEvent_wrapper (int numBytes){ // explicitly cast to a pointer to Classname Classname* mySelf = (Classname*) pt2Object; // call member mySelf->receiveEvent(numBytes); } 

अब मैं आवरण समारोह बजाय

विवरण और यहाँ पूरे स्पष्टीकरण के फोन .flashDigit'। क्या आपने अभी तक यह कोशिश की? – gary

+0

हां मैंने किया, यह समस्या का समाधान नहीं करता है, लेकिन वैसे भी धन्यवाद;) – SmallJoeMan

उत्तर

3

आप बहुत करीब हैं। समस्या एक सदस्य फ़ंक्शन है (FlashDigit()) फ़ंक्शन (शून्य फ़ंक्शन()) के समान नहीं है। एक सदस्य फ़ंक्शन एक फ़ंक्शन पर पीआरआर होता है जो रनटाइम पर बदल सकता है, संकलन समय पर ज्ञात फ़ंक्शन के विपरीत। (इसलिए अनसुलझा फ़ंक्शन प्रकार के बारे में त्रुटि संदेश)। दो "काम के आसपास" हैं। पहला लिफाफा कार्य जिसे आप इंगित करते हैं। और दूसरा, यदि फ़ंक्शन को वर्ग के उदाहरण के अद्वितीय सदस्य मानों का लाभ उठाने की आवश्यकता नहीं है, तो सदस्य फ़ंक्शन को स्थिर घोषित किया जा सकता है।

static void flashDigit();

This is described in more detail in section 33.1-33.3 of the Cline's C++ FAQ

+0

बहुत बहुत धन्यवाद, यह बहुत उपयोगी है। – SmallJoeMan

1

मैं Arduino TWI पुस्तकालय और कॉलबैक फ़ंक्शन निर्दिष्ट करने के साथ इस एक ही मुद्दा था। इसलिए मैंने एक स्थिर रैपर फ़ंक्शन बनाया जो क्लास ऑब्जेक्ट्स को कॉल करता है।

मेरी ज फ़ाइल में मेरे पास है:

#ifndef Classname 
#define Classname 
class Classname { 
    pubic: 
    void receiveEvent(int numBytes); 
    static void receiveEvent_wrapper(int numBytes); 
}; 
#endif 

और मेरे में।सीपीपी फ़ाइल मेरे पास है: http://www.newty.de/fpt/callback.html#static