我正在尝试使用c ++中的C库,它具有以下功能:
int MAG_robustReadMagModels(char *, MAGtype_MagneticModel *(*)[], int);
从给出的示例C代码中,以下是如何调用此库:
char filename[] = "filename";
int epochs = 1;
MAGtype_MagneticModel * MagneticModels[1];
if(!MAG_robustReadMagModels(filename, &MagneticModels, epochs)) {
//ERROR
}
我试图将其翻译成c ++,如下所示:
char filename[8] = "filename";
int epochs = 1;
MAGtype_MagneticModel * MagneticModels[1];
if(!MAG_robustReadMagModels(filename, &MagneticModels, epochs)) {
//ERROR
}
这给了我以下错误:
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
如何让c ++正确地重新解释它正在调用的c库?作为参考,我试图使用的库可以在http://www.ngdc.noaa.gov/geomag/WMM/soft.shtml下的标签为WMM2015_Windows.zip
的链接下找到。答案 0 :(得分:1)
导致此错误的原因是编译器对具有已知大小(type[x]
)的数组的处理方式与具有未知大小(type[]
)的数组的处理方式不同。避免此问题的一种方法是创建一个具有未知(就编译器而言)大小的数组,以传递到您的函数中:
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);
}