C++ 使用指向函数的指针数组创建结构

C++ 使用指向函数的指针数组创建结构,c++,c,function,pointers,struct,C++,C,Function,Pointers,Struct,有人能帮我解决下面代码中显示的错误吗 #include <iostream> #include "FG.h" struct pr { double (*fG[3]) (double, double, double, double*);}; int main() { double (*fG[3]) (double, double, double, double*); fG[0] = GX00; fG[1] = GX00; fG[2

有人能帮我解决下面代码中显示的错误吗

#include <iostream>
#include "FG.h"

struct pr { double (*fG[3]) (double, double, double, double*);};

int main()
{       


    double (*fG[3]) (double, double, double, double*);

    fG[0] = GX00;
    fG[1] = GX00;
    fG[2] = GX22;

    double prx[2] = {10, 1};
    struct pr params ={ fG };
    std::cout << params.fG[0]( 1 , 0.5 , 1, prx ) << std::endl;

    return 0;
}
test.cpp:在函数“int main()”中:
test.cpp:15:25:错误:数组必须用括号内的初始值设定项初始化

在C中不能从一个数组初始化另一个数组(就像数组赋值不起作用一样)。请尝试以下方法:

struct pr params = { { &GX00, &GX00, &GX22 } };

另一种方法是使用自定义构造函数:

在C中不能从一个数组初始化另一个数组(就像数组赋值不起作用一样)。请尝试以下方法:

struct pr params = { { &GX00, &GX00, &GX22 } };
另一种方法是使用自定义构造函数:

问题是,“读取”fG(就像您在
struct pr params={fG};
中所做的那样)不会给您数组的副本,而是给您数组的第一个地址的副本。这与以下情况相当:

char  buffer[200] = "Test";
char *p = buffer;
在这种情况下,p只存储缓冲区的第一个地址。另一方面,要初始化结构,需要告诉编译器每个元素应该存储什么。因此,结构的正确初始化是:

struct pr params ={ 
    { GX00, GX00, GX22 }
};
此外,我建议您键入函数签名,而不是一次又一次地复制它。它使代码更具可读性:

typedef double (*tCallback) (double, double, double, double*);

struct pr {
    tCallback fG[3];
}
问题是,“读取”fG(就像您在
struct pr params={fG};
中所做的那样)不会给您数组的副本,而是给您数组的第一个地址的副本。这与以下情况相当:

char  buffer[200] = "Test";
char *p = buffer;
在这种情况下,p只存储缓冲区的第一个地址。另一方面,要初始化结构,需要告诉编译器每个元素应该存储什么。因此,结构的正确初始化是:

struct pr params ={ 
    { GX00, GX00, GX22 }
};
此外,我建议您键入函数签名,而不是一次又一次地复制它。它使代码更具可读性:

typedef double (*tCallback) (double, double, double, double*);

struct pr {
    tCallback fG[3];
}

在您的示例中,您获得了第一个元素的地址,因为您在一个上下文中使用了数组,其中数组将衰减为指针。问题中的代码不是这样的上下文,我想指出一个事实,即您永远不会像OP试图获取整个数组的方式那样获取整个数组的内容。这就是为什么我写了“它不会给你数组的副本”。对于OP的代码,fG也会衰减为初始化结构中第一个函数指针的指针。(这显然是错误的)在您的示例中,您获得了第一个元素的地址,因为您在上下文中使用了数组,其中数组衰减为指针。问题中的代码不是这样的上下文,我想指出一个事实,即您永远不会像OP试图获取整个数组的方式那样获取整个数组的内容。这就是为什么我写了“它不会给你数组的副本”。对于OP的代码,fG也会衰减为初始化结构中第一个函数指针的指针。(这显然是错误的)欢迎来到这里。你应该坐飞机。很高兴您的问题得到解决。欢迎使用SO。你应该坐飞机。很高兴你的问题解决了。