C++ 如果一个函数的参数是指向指向结构的指针数组的指针,且其大小未指定,如何调用该函数
我正在使用visual studio 2013和visual studio 2010编译器 我在我的c++/CLI项目中重新使用了一些c代码,并且出现了编译错误。 所有的文件都在同一个项目中,并且所有的主体文件都没有使用预编译的头文件 我正在尝试不编辑重复使用的代码,如果可能的话…C++ 如果一个函数的参数是指向指向结构的指针数组的指针,且其大小未指定,如何调用该函数,c++,c,pointers,C++,C,Pointers,我正在使用visual studio 2013和visual studio 2010编译器 我在我的c++/CLI项目中重新使用了一些c代码,并且出现了编译错误。 所有的文件都在同一个项目中,并且所有的主体文件都没有使用预编译的头文件 我正在尝试不编辑重复使用的代码,如果可能的话… 下面是代码示例,请注意libFunc.h和.c是重复使用的代码,我正在编写wrapper.cpp: // libFunc.h typedef struct { double max; double v
下面是代码示例,请注意libFunc.h和.c是重复使用的代码,我正在编写wrapper.cpp:
// libFunc.h
typedef struct
{
double max;
double var;
} myStruct;
void libFunc(char * filename, myStruct *(*arg)[]);
void readVals(char * filename, myStruct *(*arg)[]);
void assignVals(myStruct *arg, char vals[][1024]);
// libFunc.c
void libFunc(char * filename, myStruct *(*arg)[])
{
readVals(filename, arg);
}
void readVals(char * filename, myStruct *(*arg)[])
{
char vals[15][1024];
char *line = (char *) malloc(1024);
s = fopen(filename, "r");
while(fgets(line, 1024, s) != NULL)
{
// parse tokens into vals
assignVals((*arg)[index], vals);
}
}
void assignVals(myStruct *arg, char vals[][1024])
{
arg->max = atof(values[0]);
arg->var = atof(values[1]);
}
// wrapper.cpp
#include "libFunc.h"
int wrapper()
{
myStruct *myVar[1];
char filename[512];
strcpy(filename, "input.txt");
libFunc(filename, &myVar);
}
我得到一个错误:
cannot convert myStruct *(*)[1] to myStruct *(*)[].
我试过:
myStruct ** myVar = new myStruct*[1];
libFunc(&myVar);
这导致了以下错误:
cannot convert myStruct *** to myStruct *(*)[].
我如何传递它将接受的内容
代码不必编译为c++这个问题的任何解决方案都必须在VisualStudio 2013中使用VisualStudio 2010编译器来执行,而“工作”是指“构建解决方案”必须构建包括这些C文件在内的所有东西。
P>有些人说C是C++的子集。这是不正确的。正确的是,存在两种语言共有的子集。您正在运行C++中不支持的C方面的其中一个方面。
因为这是C++中不支持的东西,任何答案都是可疑的质量。也就是说,这里有一个质量可疑的答案:只需将您的
&myVar
转换为指向指向myStruct
的指针数组的指针:
libFunc((myStruct*(*)[])&myVar);
这编译得很干净。它是否“有效”,这是另一个问题。问题中有一条评论让我觉得这行不通:
如果该函数确实是<强> <代码>设置ARG (与
旁白:为什么该函数会使用指向
myStruct
的指针数组的指针?您还没有显示该代码的主体。我不知道C++中的设置<代码> *ARG< /C>是有效的,但是它在C++中是无效的。我认为你不能从C++调用这个函数。只有C允许指针指向未指定的绑定数组。你需要重新设计函数接口C或C++——你的选择-决定一个可能的副本可以写<代码> LBFUNC((MyStReT*(*)[])和A);代码>。它可能会起作用,但我认为这是形式上未定义的行为。@ChrisBeck看起来不像是它的复制品,它设置了内容。我更新了这个问题,以显示关于这些函数的更多细节
void libFunc(myStruct *(*arg)[]){ // does stuff, sets arg