这是我第一次在这里发帖。请原谅我的经验不足;我只是在学习。
我正在尝试实现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];
答案 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));