ODEのよく見かけるエラー

講義でODEに関する演習をやってみて学生のプログラムで良く見かけるエラーメッセージとその対策を紹介します。

  1. 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をどこかで宣言してください。または,スペルミスの可能性もあります。
  2. ../../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を代入します。
  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行目の変数を確認しましょう。
  4. 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辺が格納されている配列名を入れてください。配列名は配列が格納されている先頭アドレスでしたね。

  5. ODE INTERNAL ERROR1 assertion “dMassCheck(mass)” failed in dBodySetMass() [ode.cpp]
    これはソースコードの文法には間違いがありません。dBodySetMass()でボディに質量パラメータを設定するわけですが,このエラーは質量パラメータの計算に問題があります。たとえば,dMassSet***Total()の引数になる質量や半径,長さなどの変数を初期化しないで使っていたり,あるいは間違って0などを代入していませんか?

コメント

タイトルとURLをコピーしました