1

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

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

这是传递给函数的参数结构(它在 .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 panel = p->panels[1000]; 不起作用,第二次尝试(最后三行)的输出返回零。有人看到我做错了什么吗?

这是我对结构面板的定义:

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];
4

2 回答 2

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

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

struct panel panels = p->panels[ 999 ];
于 2012-06-14T18:32:10.060 回答
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));
于 2012-06-14T21:09:16.607 回答