我将Visual Studio 2013与Visual Studio 2010编译器一起使用。

我在c++ / CLI项目中重新使用了一些c代码,并且遇到编译错误。
所有文件都在同一个项目中,所有主体文件均未使用预编译的头文件

如果可能,我正在尝试不编辑已重用的代码...
这是代码示例,请注意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++
此问题的任何解决方案都必须在带有Visual Studio 2010编译器的Visual Studio 2013中工作,通过“工作”,我的意思是“构建解决方案”必须构建包括这些c文件在内的所有内容。

最佳答案

有人说C是C++的子集。这是不正确的。正确的是,存在两种语言都通用的子集。您正在遇到C++不支持的C方面之一。

由于C++不支持此功能,因此任何答案的质量都是可疑的。就是说,这是一个质量可疑的答案:只需将&myVar转换为指向myStruct的指针数组的指针即可:

libFunc((myStruct*(*)[])&myVar);

这样编译干净。是否“有效”,这是另一个问题。这个问题中有一条评论使我认为这行不通:



如果该函数确实做到了 set arg (而不是 sets contents of arg ),那么C++根本不支持该功能。

除了:为什么该函数需要一个指向myStruct的指针数组的指针?您尚未显示该代码的主体。我不知道在C中设置*arg是否有效,但在C++中肯定无效。

关于c++ - 如何调用具有参数的函数,该参数是指向结构的指针数组的指针并且未指定大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34687562/

10-11 21:30