C++ C Cast Problem



  • Habe eine C Datei und möchte die in mein C++ Projekt einbinden.

    Jetzt hab ich ein Problem:

    spline.control_point =  calloc(...)
    

    von void* kann er nicht auf "dxf_spline_::control_point_t*" konvertieren

    typedef struct dxf_spline_{
        union control_point_t{
        fpoint3_t c3;
        fpoint2_t c2;
      } *control_point;
    }dxf_spline_t;
    

    Wie muss ich casten?
    = (union control_point_t*) calloc
    funktioniert nicht



  • Sisko86 schrieb:

    Habe eine C Datei und möchte die in mein C++ Projekt einbinden.

    Nachfrage: Möchtest du sie einbinden, oder kann sie auch angepasst werden?

    Für das einbinden sieht es glaube ich so aus (arbeite nur an DLL-Schnittstellen mit C, daher nicht ganz 100% sicher):

    extern "C"
    {
      #include "meineCDatei.h"
    }
    

    Vielleicht funktioniert es damit.

    cu André



  • Mach es wie asc sagte und konpilier die C-Übersetzungseinheit mit einem C-Compiler. Ansonsten müsstest Du wahrscheinlich noch mehr Code nach C++ umschreiben. Dann müsste folgender Cast funktionieren:

    spline.control_point = static_cast<dxf_spline_::control_point_t*>(calloc(...));
    

  • Mod

    static_cast<dxf_spline_t::control_point*>(calloc(...))
    

    besser noch

    new dxf_spline_t::control_point(); //bzw.
    new dxf_spline_t::control_point[..]();
    

    Strenggenommen ist das nicht ganz äquivalent zu calloc - es bildet eher noch besser die Intention ab.



  • camper schrieb:

    ...
    besser noch

    new dxf_spline_t::control_point(); //bzw.
    new dxf_spline_t::control_point[..]();
    

    ...

    Dann aber bei der Freigabe natürlich delete bzw. delete[] nicht vergessen (statt free).



  • extern "C" Funktioniert irgendwie nicht
    Es wird nicht als C kompiliert.

    Kann ich die C Datei so anpassen, dass sie evtl. auch wieder als C kompiliert werden kann. new und static_cast fallen somit aus.



  • Sisko86 schrieb:

    extern "C" Funktioniert irgendwie nicht
    Es wird nicht als C kompiliert.

    Klar. 'extern "C"' hat nichts damit zu tun, wie die Dateien kompiliert werden. Es geht hierbei nur darum, C++ das Finden der Symbole zu ermöglichen.

    Aber Dein C-Code wird ja wohl (hoffentlich!) in eine h- und eine c-Datei aufgeteilt sein. Nur die h-Datei wird per #include eingefügt, die c-Datei hingegen nicht. *Diese* Datei musst Du (im Gegensatz zum Rest) mit einem C-Compiler kompilieren. Das geschieht evtl. auch nicht automatisch sondern muss von Dir speziell angegeben werden.

    Auf welchem System arbeitest Du? Das ist seehr unterschiedlich je nach verwendeter Plattform. Wenn Du mit GCC/make arbeitest, sollte der korrekte Compiler allerdings normalerweise automatisch gewählt werden. Unter Visual Studio hingegen geht das so einfach nicht (wie es dort geht, weiß ich nicht).

    Kann ich die C Datei so anpassen, dass sie evtl. auch wieder als C kompiliert werden kann. new und static_cast fallen somit aus.

    Na ja, statt des C++-Casts kann zur Not auch ein C-Cast verwendet werden. Dein Typenname war halt nur unvollständig, daher hat der Cast nicht funktioniert.



  • Hab den C Cast geändert, jetzt Funktionierts
    (dxf_spline_::control_point_t*)
    Auf diese Schreibweise wäre ich nicht gekommen


Log in to reply