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 panels = p->panels[1000]; は機能せず、2 回目の試行 (最後の 3 行) からの出力はゼロを返します。誰かが私が間違っていることを見ていますか?

構造体パネルの私の定義は次のとおりです。

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->panel1000要素の配列です。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 に答える