0

間違った引数を使用している関数ポインターに問題があります。

問題を引き起こしているコードの部分はこれです

654     for (k = 0; k < o->nk; k++) {
655       val[0] = o->f(o->xyz+3*k, o->constant, o->f_cent, o->f_sig, val+1);
          ...
659     }

目標は一連の関数 (そのポインターは o->f に格納されている) を呼び出すことであり、それぞれがこのループで o->nk 回呼び出されます。

o->f の型は

typedef double (*FLDfunc_t)(double x[], double A, double *ct, double *sig, double grd[]);

最後の関数 (multsinfunc) を除いて、すべての関数が正しく実行されます。gdb からの出力は次のとおりです。

#0  0x000000000048712f in multsinfunc (xyz=0x3923c55, A_in=6.28318530717958, cent_in=0x3568ad7, sig_in=0x3568b6e, grad=0x3243f6a879aff)
at MODELS/fields/functions.c:176
#1  0x00000000004863c2 in do_field_operation (o=0x7fffffffdde0, mdl=0x7ffff7e11010, l=CELL_C, kvar=4, kfrom=0, kto=8)
at MODELS/fields/fields.c:655

ただし、「do_field_operation」に入ると、パラメーターの値が異なります。

gdb$ p o->xyz+3*k
$13 = (double *) 0x918150

gdb$ p o->constant
$14 = 1

gdb$ p o->f_cent
$15 = (double *) 0x880130

gdb$ p o->f_sig
$16 = (double *) 0x880148

その結果、multsinfunc で「xyz」にアクセスしようとすると、セグメンテーション違反が発生します。たぶんこれは明らかですが、なぜこれが起こるのかわかりません。すべてが適切に宣言されているようです。何が原因でしょうか?

4

1 に答える 1