- ベストアンサー
「関数ポインタとして評価されない式」?(sin波)
知っている(ある程度のプログラミング知識がある)方にはばかばかしい内容かもしれませんが・・・。 sin波とcos波を描くものをC++でプログラミングしている途中です。 いざ実行!と思ってコンパイルすると、「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」と出たのですが、何が原因かわかりません。 プログラム内容↓ #include <stdio.h> #include <math.h> #define PAI 3.14 (中略・ペン設定など) double j=0.0, sinwave[400]; int x0=50, y0=50, i=0; while(i<400){ for(j=0.0; j<=PAI; j=j+0.1){ sinwave[i]=sin(j); ●ここが原因らしい } i++; } (後略・ペンdeleteなど) math.hもあるし、特に変なところはないと思います。 また、そのあとにMoveTo,LineToでsin波を描きたいのですが、 for文で繰り返し MoveTo(x0+sin[i],?) LineTo(x0+sin[i+1],?) の、はてなの部分に何を入れればよいかわかりません。(x0:勝手にきめた原点)x0+sin[i]も、これで良いのか「?」です・・・。 お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
色々間違っていると思います。 double j=0.0, sinwave[400]; は、たしか、double型のj=0.0と、int型の配列sinwave[400]を定義していることになってしまったと記憶しています。理由は、sinwaveの型が省略されている=省略されたときはint型、ということで、sinwaveはintの配列になるのでは?と。こういうことがないように、 double j=0.0; double sinwave[400]; とちゃんとわけて書くようにしています。 int x0=50, y0=50, i=0; while(i<400){ for(j=0.0; j<=PAI; j=j+0.1){ sinwave[i]=sin(j); ●ここが原因らしい } i++; } これは、とても無意味なことをやっているのがわかりますか?i番目について見てみると、 sinwave[i]=sin(0.0) sinwave[i]=sin(0.1) ... sinwave[i]=sin(PAI) という文を実行したのと同じことです。sinwave[i]には、PAIしか入りませんよね?つまり、iの値がいくつでも、sinwave[i]=PAIになってしまいます。正しくは、 int x0=50;int y0=50;int i=0; for(i=0;i<400;i++){ sinwave[i]=sin(PAI/400*((double)i)); } のようになります。sinwave[i]=sin(PAI/400*i)という関係ですね。で、iはint型なので、double型に直してやらないと、()内が整数値しか取らないとかそういう変なことになるので、先にキャストして、double型に直してやっています。 MoveTo(x0+sin[i],?) LineTo(x0+sin[i+1],?) まず、x座標の部分から間違っています。sinは、xの値をもらって、yの値を返す関数ですよね?ということは、sinの式がx座標の式に出てくることはありません。 正しくは、おそらく、 for(i=0;i<399;i++){ MoveTo(x0+i,sin[i]);LineTo(x0+i+1,sin[i+1]); } なのでは?と思います。 後、PAIは、英語では、PIとなりますので、PIとしましょう。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>いざ実行!と思ってコンパイルすると、「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」と出たのですが、何が原因かわかりません。 >MoveTo(x0+sin[i],?) LineTo(x0+sin[i+1],?) sinという名前の変数がいたりしませんか? >MoveTo(x0+sin[i],?) LineTo(x0+sin[i+1],?) >の、はてなの部分に何を入れればよいかわかりません。 >(x0:勝手にきめた原点)x0+sin[i]も、これで良いのか「?」です・・・。 ?には、 > for(j=0.0; j<=PAI; j=j+0.1){ ということなんで、0.1ラジアンあたり、何単位ずらして描画していくかですね。 1単位ずつずらしていくんでしたら、 MoveTo(x0+sin[i],i) LineTo(x0+sin[i+1],i) こんな感じに。 で、 >(x0:勝手にきめた原点)x0+sin[i]も、これで良いのか 原点はこれでかまいません。 Windowsの標準ではクライアント領域の左上が原点になり、x軸は下方向、y軸は右方向に進んでいきます。 通常のグラフとは上下逆になる点に注意してください。 で、MoveTo等ですが、intなんで座標は整数ですね。 MoveTo(x0+sin[i],i) LineTo(x0+sin[i+1],i) で、x座標の値をsin関数の戻り値そのまま座標として使おうとすると、-1、0、1にしかならないんで曲線になりません(^^;; 適当に大きな数字をかけてあげる必要があります。 なお、座標系ですが、ここのマップ系のメソッドを使うことで向きや1単位あたりのサイズを変更することが出来ます。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_cdc_class_members.asp
お礼
回答ありがとうございました! >x座標の値をsin関数の戻り値そのまま座標として使おうとすると、-1、0、1にしかならないんで曲線になりません そうでした...こういうところでミスして後々悩むんですよ(汗)
お礼
回答ありがとうございました! いろいろ指摘するとこありすぎですね(--;) 正しいやり方を教えてくださって大変参考になりました。