Funktionspointer Fehlermeldung



  • Hallo,

    warum ist mein Funktionspointer falsch

    //////////////////////////////////////////////////////////////////////////////
    // class test
    //
    
    class test
    {
    public:
    	void TestFunktionspointer();
    private:
    	float ZMedian(Point *a_cPoint,const LTInt &a_iNum);
    	float ZMean(Point *a_cPoint,const LTInt &a_iNum);
    };
    
    //////////////////////////////////////////////////////////////////////////////
    // Zmedian
    //
    
    float
    test::ZMedian(Point *a_cPoint,const LTInt &a_iNum)
    {	
    	return(a_cPoint[(a_iNum-1)/2].getZ());					// Zmedian
    }
    
    //////////////////////////////////////////////////////////////////////////////
    // Zmean
    //
    float
    test::ZMean(Point *a_cPoint,const LTInt &a_iNum)
    {
    	float t_fSumZ = 0;										// Zmean
    	register int k;
    	for(k=0;k<a_iNum;++k){
    		t_fSumZ += a_cPoint[k].getZ();
    	}
    
    	return(t_fSumZ/(float)a_iNum);
    }
    
    //////////////////////////////////////////////////////////////////////////////
    // Funktionspointer
    //
    
    void
    test::TestFunktionspointer()
    {
    	float(*getZ)(Point *a_cPoint,const LTInt &a_iNum);
    	int Z = 3;
    	if(Z ==3){
    		getZ = ZMedian;
    	}else
    		getZ = ZMean;
    }
    

    Fehlermeldung:

    D:\.....cpp(184) : error C2440: '=' : 'float (__thiscall test::*)(class Point *,const int &)' kann nicht in 'float (__cdecl *)(class Point *,const int &)' konvertiert werden
    Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist



  • Hallo,

    was du willst ist ein Pointer auf eine Memberfunktion. Bei eben diesen wird
    intern auch immernoch der this-Zeiger mitgeschleift und den hast du bei
    normalen Funktionspointern nicht. Daher muss deine Deklaration folgendermassen
    aussehen:

    float (test::*getZ)(Point *a_cPoint,const LTInt &a_iNum);
    

    mfg
    v R



  • Es gibt einen grundlegenden Unterschied zwischen Funktionen und (nicht-statischen) Memberfunktionen. Die einen werden einfach so aufgerufen:

    foo();
    

    Die anderen werden stets in Verbindung mit einem Objekt aufgerufen, was dann über den this-Zeiger verfügbar ist:

    obj.bar();
    

    Du versuchst jetzt, die Adresse einer Memberfunktion an einen normalen Funktionspointer zuzuweisen, was wie man sich denken kann, nicht funktionieren kann. Man kann zwar in C++ Memberzeiger definieren, aber das braucht man hier nicht. Mache deine beiden Memberfunktionen einfach statisch:

    class test { ...
      static float ZMedian(Point *a_cPoint,const LTInt &a_iNum);
      static float ZMean(Point *a_cPoint,const LTInt &a_iNum);
    };
    

    Das klappt, weil beide Funktionen nicht auf andere (nichtstatische) Klassenmembers zugreifen, und somit theoretisch auch ohne ein Objekt funktionieren können.



  • Hallo,
    vielen Dank.

    Jetzt hab ich ein weiteres Problemchen:

    void
    test::TestFunktionspointer()
    {
        float(test::*getZ)(Point *a_cPoint,const LTInt &a_iNum);
        int Z = 3;
        if(Z ==3){
            getZ = ZMedian;
        }else
            getZ = ZMean;
        // Wie erhalte ich nun mit dem Funktionspointer einen float-Wert???
        float t_fZ = getZ(a_cPoint,a_iNum); // so klappt es nicht :-(
                                            // Fehlermeldung: Ausdruck ergibt keine Funktion
    
    }
    


  • this->*getZ( ...
    

    aber mit static hast du hier wesentlich weniger Zahnschmerzen 🙂



  • Hallo,

    o.k. dann mach ich's wohl lieber mit static.

    Danke.



  • Bashar schrieb:

    this->*getZ( ...
    

    Hier fehlen allerdings noch Klammern:

    (this->*getZ)( ...
    


  • Guten Morgen,

    hab noch Probleme mit meinem Funktionspointer

    void
    test::test1()
    {
    	float(test::*getZ)(Point *a_cPoint,const int &a_iNum);
    
    	int Z = 3;				// geb ich einfach mal so vor
    	if(Z ==3){
    		getZ = ZMedian; // Fehlermeldung:	'float (__cdecl *)(class Point *,const int &)' kann nicht in 'float (__thiscall test::*)(class Point *,const int &)' konvertiert werden
    						   //					 Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist.
    	}else
    		getZ = ZMean;	// hier die gleiche Fehlermeldung
    
    	Point* t_test;	// bestimme ich einfach mal so
    	int Num = 4;
    
    	float ZWert = (this->*getZ)(t_test,Num); // Mein Programm soll jetzt so schlau sein, dass ich mit (this->*getZ) die richtige Methode anwende und ein float-Wert zurückgegeben wird.
    }
    

    Was mach ich denn falsch? 😞



  • ga_un schrieb:

    Was mach ich denn falsch? 😞

    Bashar schrieb:

    Du versuchst jetzt, die Adresse einer Memberfunktion an einen normalen Funktionspointer zuzuweisen, was wie man sich denken kann, nicht funktionieren kann.



  • Hallo,

    bitte einen Tipp, wie ich das schreiben kann???

    getZ = this->ZMean;     //?
    getZ[0] = this->ZMean;  //?
    //....
    


  • Hallo,

    hab's jetzt gecheckt, es funktioniert so (muss kein static Member deklarieren):

    class test
    {
    public:
    	void test1();
    private:
    	float ZMedian(Point *a_cPoint,const LTInt &a_iNum);
    	float ZMean(Point *a_cPoint,const LTInt &a_iNum);
    };
    
    void
    test::test1()
    {
        float(test::*getZ)(Point *a_cPoint,const int &a_iNum);
    
        int Z = 3;               
        if(Z ==3) getZ = ZMedian; 
        else      getZ = ZMean;    
    
        Point* t_test;    
        int Num = 4;
    
        float ZWert = (this->*getZ)(t_test,Num); 
    }
    


  • Probier mal

    getZ = &ZMean;
    

    oder

    getZ = &test::ZMean;
    

    BTW was ist aus der static-Idee geworden? Ich hoffe mal du willst nur Memberpointer ausprobieren und die hier nicht tatsächlich benutzen ...



  • Ich wollte Memberpointer ausprobieren.
    Ausserdem hab ich ne Schleife, die bis zu 2Mio.x durchgeführt wird. In der hatte ich drei Abfragen: soll Min/Max/ od. Median berechnet werden. Damit in der Schleife die drei if-Abfragen entfallen, wollte ich Memberpointer einsetzen ...



  • Nee, ursprünglich wolltest du mit Funktionspointern arbeiten. Wenn ich dich mal auf dein erstes Posting hinweisen darf ...



  • In deinem Code wird immer nur der Median berechnet. 😉

    mfg
    v R



  • Unabhaengig zum speziellem Thema: Hier gibt es ein wirklich nettes Tutorial fuer Funktionszeiger: (sinnigerweise) www.function-pointer.org.


Anmelden zum Antworten