- 締切済み
H8 3052 のプログラムで、少数のべき乗計算
H8 3052 のプログラムで、少数のべき乗計算がしたいです。 y=4610.6x^(-1.156) という計算を入れたいです。 H8 3052 ヘッダファイル 3052f.h stdio.h math.h メイン関数で 1 x2=ad1_val; 2 y2=4610.6*pow(x2,-1.156); 3 if(y2>20){s2_flag = CW;} 4 if(y2<20){s2_flag = CCW;} このプログラムだと動作しません。 1 x2=ad1_val; 2 y2=x2/2; 3 if(y2>150){s2_flag = CW;} 4 if(y2<150){s2_flag = CCW;} このプログラムだと動作しました。 2行目のpowの式のせいで動作エラーするみたいなんですけど、 pow関数はH8 3052 では使えないのですか? それとも他に書き足すことがあるのですか? pow関数が使えないのなら他に方法はないですか? コンパイラは CC38H.exe です。 お願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- rinkun
- ベストアンサー率44% (706/1571)
リンクに -lm オプションが必要です。 一応、リンク設定を確認ください。リンクエラーになってないなら問題ないと思いますけど。 あと関数が正常に使えるとして、xが負でyが整数でない場合は領域エラーでNaNになりますし、xが0でyが負数の場合はゼロ除算例外が置きます。 これらに該当しないかどうかも確認した方が良いでしょう。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
途中で止まるとなると、リンクで失敗している(飛び先がない)可能性が高い気がするのですが。 1)まず、math.h の中に、pow() の定義は存在しますか? (ここにないと、標準では使えない。ただ、リンクで失敗するはず) 2)コンパイルだけでなく、リンクでもエラーは出ていませんか? 参照先がないとか、メモリ領域がオーバーフローしているとか(こっちは、警告の場合もあるかも) 3)マップファイル(普通は、拡張子が .map のファイル)を見て、pow() がちゃんと存在してるアドレスに存在しているか確認する くらいしか思いつきません。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
math.h が提供されていて、(コンパイルだけでなく)リンクエラーもないのなら、(ついでに結果がメモリに収まっていれば)使えるでしょう。 まず、「動作しない」ということが、どういうことなのか、(モータが動かないのか、動くけど回転方向が変わらないだけなのか)説明がないと、何が起こっているかは判断しようがないところですが。 1 x2=ad1_val; 2 y2=x2/2; 3 if(y2>150){s2_flag = CW;} 4 if(y2<150){s2_flag = CCW;} が動いていると言うことは、x2 は、300 内外の値なのですね。 1 x2=ad1_val; 2 y2=4610.6*pow(x2,-1.156); 3 if(y2>20){s2_flag = CW;} 4 if(y2<20){s2_flag = CCW;} で、y2に対して、20 で判定ができると言うことは、x2 は、110あたりと、想定する値がそもそも違いますが、これは大丈夫ですか? いずれにしても、前者は、x2 (= ad1_val)が、300前後で動作が変わりますが、後者は x2 が110あたりで動作が変わると言うことになります。
補足
回答ありがとうございます。 コンパイラエラーはありません。 プログラムの説明 赤外線センサの値を読み取ってA/D変換。 パソコンに送信してTera Termで表示。 その値によってモータを正転逆転させる。 ad1_valは赤外線センサの値です。 powを使わないプログラムは、パソコンに値を送信してきます。 モータも動き、正転逆転も切り替わります。 powを使ったプログラムは、パソコンに赤外線センサの値すら送信してきません。 モータも全く動かないので、正転逆転以前の問題です。 センサの値はだいたい10~800くらいです。