2016-03-25 6 views
-1

ich mit einer C-Bibliothek in c zu arbeiten versuchen ++, die die Funktion hat:einen Datentyp für eine C-Bibliothek in C Casting ++

int MAG_robustReadMagModels(char *, MAGtype_MagneticModel *(*)[], int); 

Aus dem Beispiel C-Code angegeben, ist die folgende, wie Sie das nennen würden Bibliothek:

char filename[] = "filename"; 
int epochs = 1; 
MAGtype_MagneticModel * MagneticModels[1]; 
if(!MAG_robustReadMagModels(filename, &MagneticModels, epochs)) { 
    //ERROR 
} 

ich dies in C++ zu übersetzen versucht wie folgt:

char filename[8] = "filename"; 
int epochs = 1; 
MAGtype_MagneticModel * MagneticModels[1]; 
if(!MAG_robustReadMagModels(filename, &MagneticModels, epochs)) { 
    //ERROR 
} 

das gibt mir die fol Muhen Fehler:

error: C2664: 'int MAG_robustReadMagModels(char *,MAGtype_MagneticModel *(*)[],int)' 
: cannot convert argument 2 from 'MAGtype_MagneticModel *(*)[1]' to 'MAGtype_MagneticModel *(*)[]' 
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

Wie würde ich C++ erhalten, um richtig dies für die C-Bibliothek neu zu interpretieren, die sie anrufen wird? Als Referenz bin versucht die Bibliothek I arbeiten können http://www.ngdc.noaa.gov/geomag/WMM/soft.shtml unter dem Link WMM2015_Windows.zip wird verursacht

+0

Ein Parameter vom Typ 'foo * (*) []' ist gleich 'foo ***'. Der Autor wollte wahrscheinlich nicht wie ein Dreifachstern-Programmierer aussehen. – fuz

+0

Diese beiden Codeabschnitte scheinen identisch zu sein, abgesehen von der Größe des Zeichenarrays im zweiten Beispiel – Tibrogargan

+0

@Tribargargan Der Code ist derselbe. Der Unterschied besteht darin, dass der erste Codecode C-Code ist, der in C kompiliert. Der zweite Code versucht jedoch, denselben Code in C++ auszuführen, wo er fehlschlägt. – user3830784

Antwort

1

Dieser Fehler markiert gefunden werden, weil ein Array mit einer bekannten Größe (type[x]) unterschiedlich vom Compiler als Array behandelt wird mit einer unbekannten Größe (type[]). Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, ein Array mit einer unbekannten Größe (soweit es der Compiler betrifft) zu erstellen:

char filename[] = "filename"; 
int epochs = 1; 
void *foo = malloc(sizeof(MAGtype_MagneticModel *)); 
if (foo) { 
    MAGtype_MagneticModel* *magnetic_models = (MAGtype_MagneticModel **)foo; 
    if(!MAG_robustReadMagModels(filename, (MAGtype_MagneticModel* (*)[]) &magnetic_models, epochs)) { 
     //ERROR 
    } else { 
     // do something with the new magnetic_model; 
    } 
    free(foo); 
} 
+0

Der Versuch, diesen Code auszuführen, führt zu folgendem Fehler: C2664: int MAG_robustReadMagModels (char *, MAGtype_MagneticModel * (*) [], int): Argument 2 von MAGtype_MagneticModel (**) [] kann nicht in MAGtype_MagneticModel * (*) konvertiert werden [] Typen, auf die verwiesen wird, sind nicht verwandt; Konvertierung erfordert reinterpret_cast, C-artige Umwandlung oder Funktion-artige Umwandlung – user3830784

+0

Dieser Fehler zeigt einen anderen Argumenttyp als Ihren ursprünglichen Fehler an. 'MAGtype_MagneticModel * (*) []' vs 'MAGtype_MagneticModel *() []'. Ich denke, du hast irgendwo Formatierungsprobleme. Bitte setzen Sie Code in Kommentare in Backticks – Tibrogargan

+0

Hier ist der Fehlercode richtig formatiert für Kommentare 'Fehler: C2664: 'int MAG_robustReadMagModels (char *, MAGtype_MagneticModel * (*) [], int)': kann Argument 2 von 'MAGtype_MagneticModel (* *) [] 'bis' MAGtype_MagneticModel * (*) [] ' Typen, auf die verwiesen wird, sind nicht verwandt; Konvertierung erfordert reinterpret_cast, C-Style-Cast oder Funktion-Style-Cast – user3830784