我认为,将混合类型参数传递给函数作为指针

时间:2012-06-14 18:26:18

标签: c function pointers struct

这是我第一次在这里发帖。请原谅我的经验不足;我只是在学习。

我正在尝试实现GSL根查找方法,它需要将因变量和参数结构传递给函数。

这是传递给函数的参数struct(它在.h文件中):

struct SumForces_params
{
double curvature;
struct panel panels[1000];
int lenPanels;
};

这是我定义参数实例的地方:

struct SumForces_params params = {0.0000001, {panels[1000]}, lenPanels};

这是功能:

double SumForces(double NAloc, void *params)
{
struct SumForces_params *p = (struct SumForces_params *) params;
double curvature = p->curvature; //works fine
int lenPanels = p->lenPanels; //works fine

struct panel panels = p->panels[1000];
//~ printf("panel 421 location = %g\n", panels[421].Yloc); 
//~ Above line gives this error: SumForces.c:54: error: subscripted value is neither
//~ array nor pointer

double yloc = 0;
yloc = p->panels[421].Yloc;
printf("panel 421 location = %g\n", yloc);
}

主要是,这给了我预期的输出:

printf("Main Panel 421 loc = %g\n",panels[421].Yloc);

但是从功能代码中可以看出,struct panel panels = p-> panels [1000];不起作用,第二次尝试的输出(最后三行)返回零。有人看到我做错了吗?

这是我对struct panel的定义:

struct panel
{
   double strain[136];
   double stress[136];
   double AE[136];
   double Ys;
   double E;
   double Yloc;
   double Area;
   gsl_interp_accel *acc_stress;
   gsl_spline *spline_stress;
   gsl_interp_accel *acc_AE;
   gsl_spline *spline_AE;
};

这里我将面板定义为1000个面板结构的数组:

struct panel panels[1000];

2 个答案:

答案 0 :(得分:0)

struct panel panels = p->panels[1000];

p->panel是一个1000元素数组。自从您开始在999建立索引以来,最后一个元素的索引为0。所以,这个特定的行调用UB。你可能想要:

struct panel panels = p->panels[ 999 ];

答案 1 :(得分:0)

编译器可能以错误的方式理解您的语法(不是您所期望的),并且没有对此发出警告:

struct SumForces_params params = {0.0000001, {panels[1000]}, lenPanels};

我想从您的问题中想要将有关面板的数据复制到params。正确的方法是这样的:

    struct SumForces_params params =
    {
        0.0000001,
        {}, // C doesn't have syntax for "put panels here"
        lenPanels
    };
    memcpy(params.panels, panels, sizeof(params.panels));