Function POinter Problem



  • Hi Leute,

    ich hab folgendes Problem mit Function Pointern. arbeite mit MS Visual C++ 6.0 unter Win2000 und möchte einen einfachen Callback-Mechanismus realisieren.
    Mein Programm ist pures C, aber ich baue mit structs sowas ähnliches wie OOP nach, indem ich einfach jeder Function einen Pointer auf die struct als eine Art "this pointer" übergebe.

    int registerCallback(myStruct_t * fakedThisPointer, int (*callback)(int))
    {
    ....
    fakedThisPointer->callback = callback;
    ...
    }

    ... irgendwo im Programm: ...
    int rc = (*(fakedThisPointer->callback))(mySocket);
    ...
    --------------------

    int myCallback(int socket)
    {
    ....
    }

    Das Problem ist nun folgendes. Beim Aufruf der Callback-Function verkackt mir das ganze Programm, und zwar mit einem Stack Overflow in einer Funktion namens __alloca_probe, die wohl als Teil des Funktionsaufrufs vom Compiler automatisch eingebaut wird.

    Ich habe die grobe Vermutung das mein Problem mit Call-Signaturen zu tun hat. Habe schon probiert, vor myCallback sowas wie __stdcall etc. davor zu schreiben, aber da meckert der Compiler immer. Wie kann ich es hinbekommen ohne Absturz mein Callback aufzurufen?

    danke für eure Hilfe



  • Wie ist denn deine "Eigenschaft" callback in der Struktur deklariert? Das mit dem * davor beim Aufruf kommt mir im Moment etwas spanisch vor.



  • Die ist so deklariert:

    struct
    {
    ...
    int (*callback)(int);
    }

    Habe jetzt noch einen einfachen Test gemacht: Wenn ich statt dem Callback Mechanismus die Funktion direkt hartkodiert aufrufe, funktioniert es auch nicht.. genau der selbe stack overflow. Was kann das sein??? Es ist doch nur ein einfaches int im Argument!



  • Wie wäre es mit einem ganz normalen Aufruf

    int rc = fakedThisPointer->callback(mySocket);
    


  • groovemaster schrieb:

    Wie wäre es mit einem ganz normalen Aufruf

    int rc = fakedThisPointer->callback(mySocket);
    

    Ja so sollte es gehen.


Anmelden zum Antworten