memberfunktions aufruf durch pointer funktioniert nur halb



  • Hi.
    Ich arbeite gerade an einem Project für eine tasking queue. An das Ende der Schlange werden pointer zu Strukturen gehängt die Prioritär, Pointer wie auch den Parameter des Tasks tragen. An der Stelle, an der die Tasks ausgeführt werden gibt es ein kleines Problem. Die Funktion wird gerufen, aber der 32-bit Wert wird nicht richtig übergeben (was zum Error führt).

    //header.h
    typedef int (CLASSA::*PFUC) (DWORD _Parameter);
    
    typedef struct task{
    
      PFUNC Funktion;
      DWORD Parameter;
      BYTE  Flag;
    }TASK;
    
    //queue.cpp
    void
    __cdecl CLASSA::ExecuteTask( TASK * _pTask ){
    
        //Bis hierhin sind noch alle Werte im richtigen Bereicht
        _pTask->Funktion( _pTask->Parameter );
    }
    
    void
    __cdecl CLASSA::TaskToExecute( DWORD _SomeParameter ){
    
       //Funktion wird aufgerufen doch stimmt der Paramerter nicht
       printf("0x%08x\n",_SomeParameter);
    }
    
    //parameter = 0xFFFFFFFF
    //ausgeben tut er:
    
    0x005780F6
    

    Irgendwelche Ratschläge?



  • Bite gewöhne Dir C-ismen wie " typedef struct " ab. Ich musste dreimal drübergucken, um zu sehen, dass TASK nur ein Synonym für task ist.

    Was ist CLASSA?

    Wozu benutzt du __cdecl?

    Du schreibst...

    _pTask->Funktion( _pTask->Parameter );
    

    wobei
    _pTask ein Zeiger auf task ist und
    _pTask->Funktion ein Zeiger auf eine Elementfunktion ist.
    Das dürfte so gar nicht kompilieren. Ich verstehe den Sinn des Ganzen nicht, kann daher auch nicht sagen, wie es richtig gemacht werden müsste. Eine Möglichkeit, wie diese Stelle zumindest kompiliert werden kann, ist diese:

    (this->*(_pTask->Funktion))(_pTask->Parameter);
    

    Ob es das ist, was Du willst, weiß ich nicht.

    Wenn Dein Problem noch besteht, versuche ein kleines Programm zu schreiben, was Dein Problem verdeutlicht, teste es, und zeig uns dann den Code vollständig, inklusive einer Beschreibung von dem, was es tun soll, wie es fehlschlägt (zB Compilerfehlermeldungen), etc.


Anmelden zum Antworten