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

时间:2013-07-15 03:52:23

标签: 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] = GX22;

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

    return 0;
}

编译:

$ g++ -c test.cpp 

test.cpp:在函数'int main()'中: test.cpp:15:25:error:数组必须使用大括号括起初始化器初始化

2 个答案:

答案 0 :(得分:4)

您不能在C中初始化另一个数组(就像数组赋值不起作用一样)。试试这个:

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

这是另一种方法,使用自定义构造函数:http://ideone.com/blVBox

答案 1 :(得分:0)

问题是,“读取”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];
}