講義でODEに関する演習をやってみて学生のプログラムで良く見かけるエラーメッセージとその対策を紹介します。
- bounce.cpp: In function `void makeBall()’:
bounce.cpp:70: error: `radius’ undeclared (first use this function)
bounce.cpp:70: error: (Each undeclared identifier is reported only once for each function it appears in.)
make: *** [bounce.o] Error 1
70行目のradiusが宣言されていません(undeclared)。この関数で初めて使われています。
radiusをどこかで宣言してください。または,スペルミスの可能性もあります。 - ../../include/ode/mass.h:63: error: too few arguments to function `void dMassSetCylinderTotal(dMass*, dReal, int, dReal, dReal)’
bounce.cpp:78: error: at this point in file
make: *** [bounce.o] Error 1
引数(argumen)の数が足りないというエラーです。dMassSetCylinderTotalをODE本で調べましょう。3番目の引数は円柱の長軸方向です。姿勢を指定しないと長軸方向がZ軸なので,その場合は3を代入します。 - bounce.cpp: In function `void makeBall()’:
bounce.cpp:70: error: ‘struct MyObject’ has no member named ‘sides’
make: *** [bounce.o] Error 1
MyObject構造体(struct)のメンバー(member)にsidesがないという意味です。構造体の宣言と70行目の変数を確認しましょう。 - bounce.cpp: In function `void simLoop(int)’:
bounce.cpp:59: error: cannot convert `double’ to `const double*’ for argument `3′ to `void dsDrawBoxD(const double*, const double*, const double*)’
make: *** [bounce.o] Error 1
doubleをconst double *へ変換できないと怒っています。具体的には,kdsDrawBoxDの3番目の引数(argument)の使い方が間違っています。それにはconst doubleへのポインタを入れてください。
なお,ODE本で調べると3番目の引数はconst float sides[3]になっています。これは配列へのポインタを入れなさいということです。つまり,直方体の3辺が格納されている配列名を入れてください。配列名は配列が格納されている先頭アドレスでしたね。 - ODE INTERNAL ERROR1 assertion “dMassCheck(mass)” failed in dBodySetMass() [ode.cpp]
これはソースコードの文法には間違いがありません。dBodySetMass()でボディに質量パラメータを設定するわけですが,このエラーは質量パラメータの計算に問題があります。たとえば,dMassSet***Total()の引数になる質量や半径,長さなどの変数を初期化しないで使っていたり,あるいは間違って0などを代入していませんか?
コメント