Code funktioniert in C, aber in C++ nicht (oder auch: Screenshot mit OpenGL und C)



  • Hallo,
    ich habe ein echt übles Problem und bin wirklich ratlos.
    Hab hier nen C - Code vorliegen, bei dem mit OpenGL gearbeitet wird.
    Ich kenn leider nur Standard ANSI-Consolen-C
    Meine Aufgabe ist es eine Screenshot Funktion einzubauen, welche eine bmp. vom OpenGL erzeugten Bild anfertigt.

    Weil ich von OpenGL keinen Plan hat, hat mir eine Freund eine solche geschrieben...leider in C++ - dann dachte ich mir, naja was solls, es heißt ja immer, C++ kann auch C übersetzen, also hab ich in Visual Studio einfach auf "als C++ kompilieren" aktiviert...

    Der Code von meinen Freund geht auf den ersten Blick, der Rest auch - zum Linken kam es leider noch nicht, denn ein Fehler trat beim Kompilieren trotzdem noch auf..und in einer völlig anderen unbearbeiteten Quelle:
    dort steht:

    GLFONT * FontCreate(HDC hdc,const char *typeface,
    int height,int weight,DWORD italic)
    {
    GLFONT *font;

    font= calloc(1,sizeof(GLFONT)); <- Fehler !

    [...]
    }

    Die Fehlermeldung lautet:
    Fehler 93 error C2440: '=' : cannot convert from 'void *' to 'GLFONT *' c:\teamprojektarbeit\z88o2bmp\quellen\oglfont.c 82

    Ich hab keine Ahnung was GLFONT überhaupt bedeutet, aber irgendwie scheint c++ diese Zeile nicht zu mögen. Weiß jemand da Rat?

    Mmh... am einfachsten wäre es natürlich, wenn jemand eine Screenshotfunktion für Opengl hätte, die direkt in C geschrieben ist...

    Falls mir irgendjemand helfen kann, wär das total super.
    Danke schomal
    Andi



  • In C können Zeiger auf void implizit in Zeiger auf irgendeinen Typ konvertiert werden, was in C++ nicht geht.

    Benutze entweder static_cast (C++) oder die C-Klammercasts für eine explizite Konvertierung



  • danke für die schnelle antwort 🙂
    ich verstehs nur leider nicht 😞

    das heißt mit
    GLFONT *font
    lege ich einen Zeiger namens "font" auf Void an? Ich dachte einen auf GLFONT (was auch immer das ist)

    Und das nachfolgende Array kann ich dann nicht mit Calloc bestücken?

    was genau muss ich denn jetzt "static_casten" damit es dann geht?
    static_cast(font)= calloc(1,sizeof(GLFONT))
    oder wie meinst du das?



  • Andband schrieb:

    das heißt mit
    GLFONT *font
    lege ich einen Zeiger namens "font" auf Void an? Ich dachte einen auf GLFONT

    Nein, da hast du schon Recht mit deiner Vermutung. Es wird ein Zeiger auf GLFONT angelegt.

    Andband schrieb:

    was genau muss ich denn jetzt "static_casten" damit es dann geht?

    Normalerweise empfehle ich static_cast . Aber da du sonst in C programmierst und dich damit auskennst, kannst du auch den Cast-Operator mit den Klammern verwenden.

    Die Funktion calloc() gibt einen void* , also Zeiger auf void zurück. Diesen musst du umwandeln:

    font = (font*) calloc(1,sizeof(GLFONT));
    

    Um C++ trotzdem noch schnell zur Geltung kommen zu lassen:

    font = static_cast<font*>(calloc(1,sizeof(GLFONT));
    

    Das wäre die entsprechende Umwandlung in C++. In diesem Falle ginge auch reinterpret_cast , jedoch greife ich wenn möglich lieber zur sichereren Methode.



  • /edit: Zu spät.

    Nein, GLFONT* font legt einen Zeiger auf GLFONT an, das ist schon richtig. Aber calloc liefert keinen solchen zurück, sondern einen auf void, den du in C++ nicht implizit casten kannst.

    font = (GLFONT*) calloc(1, sizeof(GLFONT));
    

    sollte sowohl mit C++ als auch mit C den gewünschten Effekt bringen.



  • Andband schrieb:

    danke für die schnelle antwort 🙂
    ich verstehs nur leider nicht 😞

    das heißt mit
    GLFONT *font
    lege ich einen Zeiger namens "font" auf Void an? Ich dachte einen auf GLFONT (was auch immer das ist)

    Und das nachfolgende Array kann ich dann nicht mit Calloc bestücken?

    was genau muss ich denn jetzt "static_casten" damit es dann geht?
    static_cast(font)= calloc(1,sizeof(GLFONT))
    oder wie meinst du das?

    er meint

    //entweder
    font = static_cast<GLFONT*>(calloc(1, sizeof(GLFONT))); //c++ stil
    
    //oder
    font = (GLFONT*)calloc(1, sizeof(GLFONT)); //c stil
    


  • super, vielen Dank - es liegt also daran, dass C diesen Zeiger auf Void der bei Calloc "rauskommt" akzeptiert und C++ nicht..gut
    🙂

    kompilieren klappt jetzt...
    jetzt kommt eine einzige linker fehlermeldung 😕

    Fehler 144 error LNK2019: unresolved external symbol "void __cdecl ri1x88(void)" (?ri1x88@@YAXXZ) referenced in function "long __stdcall Z88O_WinProc(struct HWND__ *,unsigned int,unsigned int,long)" (?Z88O_WinProc@@YGJPAUHWND__@@IIJ@Z) z88o.obj

    Auch dass tritt nur bei C++ auf.

    Die Funktion bei der gemotzt wird heißt:

    ri1x88()

    Sie wird an einer Stelle im Programm aufgerufen - wenn man diesen Aufruf auskommentiert klappt auch das Linken. Ich schätze mal dass es ein ähnliches Problem ist....

    Ah..habs grad selber rausgefunden glaub ich. Die Funktion wurde im Header als

    void rilx88 (void)
    

    deklariert und in der Funktion selber dann aber als

    int rilx88 (void)
    

    - komisch aber, dass das dann beim normalen C funktioniert hat...
    wie dem auch sei, jetzt geht hier das zumindest schonmal 🙂

    bin echt begeistert, wie nett und schlau ihr seid 🙂
    kennt ihr euch auch mit OpenGL aus? 🙂

    Lg
    Andi



  • Andband schrieb:

    kennt ihr euch auch mit OpenGL aus? 🙂

    Mit Sicherheit, wobei das dann ein Thema für ein anderes Unterforum wäre...



  • ok, ich schau mal ob ich selber durch anschauen vom quellcode was rausfinde, ansonsten such ich dann das andere Unterforum mal auf 🙂

    nochmals herzlichen dank an alle an dieser stelle!



  • Wenn du weiterhin C mit C++ mischst und auch C-Bibliotheken verwendest, musst du eventuell extern "C" verwenden (aufgrund verschiedener Aufrufkonventionen und Linkages in beiden Sprachen). Aber solange alles geht, ist ja alles gut. 🙂

    Andband schrieb:

    ansonsten such ich dann das andere Unterforum mal auf :

    Um einem Post am falschen Ort vorzubeugen: Es ist das Spiele-/Grafikprogrammierung-Forum. 😉


Log in to reply