Array von Funktionen



  • @pumuckl: Includeguards helfen in diesem fall nicht.

    Damit werden mehrfache definitionen durch mehrfache Einbindung von Headern unmöglich.

    sollte eigentlich heissen :
    Damit werden mehrfache definitionen durch mehrfache Einbindung von Headern in einer kompilationseinheit (sagt man das so ?) unmöglich.
    Das problem hier ist aber das der gleiche Header in verschiedenen kompilationseinheiten eingebunden wird, daher befindet sich die variable dann in mehreren .obj-files und das mag der linker nicht.
    Wie tvdog schon gesagt hat extern ist die lösung.
    BTW Includeguards verhindern compilerfehler, extern verhindert linkerfehler.
    Kurt



  • Hallo

    Ich habe die typedef-Anweisung und die Array Deklaration in die *.h-Datei geschrieben und in der *.cpp-Datei steht der Rest:

    *h-Datei:

    typedef int(*myFunctions) (CWuerfel arWuerfel[]);
    myFunctions aCheckFunctions[13];
    

    *.cpp-Datei:

    myFunctions aCheckFunctions[13]={CCheckBedingung::CheckEinsen,CCheckBedingung::CheckZweien,CCheckBedingung::CheckDreien,CCheckBedingung::CheckVieren,CCheckBedingung::CheckFuenfen,CCheckBedingung::CheckSechsen,CCheckBedingung::CheckDreierPasch,CCheckBedingung::CheckViererPasch,CCheckBedingung::CheckFullHouse,CCheckBedingung::CheckKleineStrasse,CCheckBedingung::CheckGrosseStrasse,CCheckBedingung::CheckChance,CCheckBedingung::CheckKniffel};
    

    In meiner Funktion rufe ich jetzt mit einen Feldparameter die gewünschte Funktion auf und bekomme dabei leider immer eine Fehlermeldung. Hier erstmal der Aufruf der Funktion:

    int CKniffelDlg::DoClicked(int Feld)
    {
    	//wenn Einsen bereits belegt sind, erscheint MessageBox mit Meldung
    	if(m_cCheckBedingung.m_abIsChecked[Feld])
    		MessageBox("Sie haben dieses Feld bereits belegt");
    	//ansonsten werden die Punkte ausgegeben, Belegt-Varible auf true gesetzt und alle Würfel neu gewürfelt 
    	else
    	{
    		//Aufruf der Funktion CheckEinsen aus der Klasse CCheckBedingung, in der ermittelt wird, wie hoch die
    		//Punktzahl beim Einserfeld ist und Zuweisung zur Variablen von IDC_STATICAUSGABEEINSEN
    		m_aiAusgabe[Feld]=m_cCheckBedingung.aCheckFunctions[Feld](arWuerfel);
    

    Das ist nicht die ganze Funktion, aber der wichtige Aufruf steht in der letzten Zeile. Wenn ich nun auf einen Button klicke und die Funktion DoClicked aufgerufen wird, bekomme ich die Fehlermeldung:

    Unhandled exception at 0xcccccccc in Kniffel.exe: 0xC0000005: Access violation reading location 0xcccccccc.

    Vielleicht wisst Ihr ja Hilfe, da Ihr bis jetzt ja immer Bescheid wusstet.

    chrische



  • Hallo

    Weiss keiner, was hier los sein könnte?

    chrische



  • Vielleicht ist Feld kein gültiger Index für aCheckFunctions.

    BTW: Das mit den static-Funktionen solltest du wieder rückgängig machen und stattdessen einen Funktionspointer auf ein Klassenelement benutzen.



  • Hallo

    "Feld" ist ein gültiger Index, da ich 0 übergebe und das Array 13 Plätze hat (von 0-12) Warum ist das mit static ungünstig? Ich habe wie gesagt noch gar nicht richtig verstanden, was static eigentlich bringt.

    chrische



  • Eine statische Methode hat keinen this-Pointer, d.h. alle Instanzen der Klassen teilen sich die Methode.



  • Hallo

    In Ordnung und warum ist das in meinem Fall schlecht. Hilft mir das bei der Fehlersuche.

    chrische



  • static-Funktionen kann man immer ohne eine einzige Instanz einer Klasse ausführen. Das macht aber bei deinen Funktionen keinen Sinn, weshalb man sie nicht statisch macht.



  • Ich versteh noch nicht ganz zu was genau du es brauchst aber es könnte in diese Richtung gehen:

    class foo
    {
    	private:
    
    		void bar_0() { cout << "bar_0();" << endl; }
    		void bar_1() { cout << "bar_1();" << endl; }
    		void bar_2() { cout << "bar_2();" << endl; }
    
    		static void (foo::*pfunc[3])();
    
    	public:
    
    		void call(int num) { (this->*pfunc[num])(); }
    		foo() { }
    };
    
    void (foo::*(foo::pfunc[3]))() = { &foo::bar_0, &foo::bar_1, &foo::bar_2 };
    

    Hoffe das stimmt so habs net getestet. Man sollte villeicht noch ein typedef verwenden.



  • Hallo

    Erstmal danke für eure Hilfe. Da alles bei mir nicht geklappt hat, habe ich mich jetzt doch für die switch-Variante entschieden.

    chrische



  • Hallo,

    ich möchte die Antwort eines Touchscreens (über den I²C-Bus) mit einem Atmel
    AtMega88-Controller auswerten. Ich verwende zum Programmieren den kostenlosen
    AVR-GCC-Compiler.

    Der Touchscreen liefert je nach betätigtem Button einen 8-Bit Returncode zum
    Prozessor (den Returncode vergebe ich im intelligenten Display selber). Die Auswertung habe ich mit IF-Anweisungen angefangen, da ich aber ca. 100 Returncodes auswerten muß, wird das verdammt umständlich.

    Wie schreibe ich ein Funktionsarray in C? So ganz klar ist mir das nicht. Habe auch bisher keine große Erfahrung mit solch "komplexen" Sachen.

    Ich habe folgendes:
    * Rückgabewert des Displays (z.B. 1...127)
    * diverse Befehle, die bei den entsprechenden Rückgabewerten ausgeführt werden sollen.

    Vielen Dank im Voraus.

    Martin


Anmelden zum Antworten