funktions-übergabe-problem



  • hi!
    ich hab ein problem: Mein compiler (bcc32 afaik) gibt mir folgende meldung aus:

    Cannot convert 'void((__closure)(int, int, Graphics::TColor))(int, int, Graphics::TColor) to 'void ()(int, int, Graphics::TColor)'

    Der Quelltext:

    Funktion die übergeben wird:

    void SetPix(int px, int py, TColor color))
    {
    ...
    }
    

    Funktion, die die übergebende Funktion bekommt:

    void FillPolygon(void (*write)(int x, int y, TColor color)
    {
    ...
    }
    

    was muss ich machen? übrigens hat mir das einsetzen des verlangten types in die empfängerfunktion nur einen type mismatch eingebracht.
    achja, falls das einfluss haben sollte: ich benutze den bcb und SetPix is eigentum der klasse TForm1, FillPolygon einer unabhängigen anderen Klasse (polyfill).

    Danke,
    chris90



  • Schau dir mal diesen Source an, soll dir klarer werden:

    #include <iostream>
    
    class TColor
    {};
    
    void SetPix(int px, int py, TColor color) // funktion definieren
    {   
        std::cout << "SetPix(" << px << ", " << py << ", .." << ")" << std::endl;
    }
    
    void FillPolygon(void (*write)(int, int, TColor)) // callback
    {   
        (*write)(5, 5, TColor()); // funktion mit argumenten aufrufen, argumente kannst du natürlich auch übergeben
    }
    
    int main()
    {   
        FillPolygon(&SetPix);
    }
    

    Achja: www.function-pointer.org sollte dir helfen. 💡



  • und was hat das mit __closure zutun?



  • Ich habe dir gezeigt, wie du es mit Standard C++ (eigentlich eher C) lösen kannst. Ich habe gedacht, du hättest beim Übergeben der Funktion ein Fehler gemacht. Es sieht / sah ganz danach aus, als hättest du die Funktionszeiger nicht richtig angewendet. Wenn das nicht so ist, dann lasse dich in BCB Forum verschieben, damit man den Fehler finden kann. Ich glaube aber nicht, dass es an dem Compiler liegt, sondern an deinem Code. Das Keyword __closure wird von deinem Compiler kommen. Ich kenne mich damit jedoch nicht aus. Mache mal ein komplettes Beispiel. Wie rufst du denn die Callback Funktion FillPolygon() auf?



  • Hallo

    SetPix is eigentum der klasse TForm1

    da ist das Problem. Das ist in Standard-C++ nicht so einfach zu lösen. Im BCB gibt es dafür das Schlüsselwort __closuse, um Memberfunktionen an Funktionspointer zu übergeben. Der Aufruf sieht dann so aus :

    void FillPolygon(void (__closure *write)(int x, int y, TColor color) EventFunktion)
    {
      ...
      }
    

    Schau dir in der BCB-Hilfe z.B. mal den TNotifyEvent an, um das ganze nachzuvollziehen.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Borland C++ Builder (VCL/CLX) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • vielen dank an alle, ich versuch es jetzt nochmal und wenn es nich klappt, dann wird der bcb verschrottet.


Log in to reply