アプリ版:「スタンプのみでお礼する」機能のリリースについて

知っている(ある程度のプログラミング知識がある)方にはばかばかしい内容かもしれませんが・・・。
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]も、これで良いのか「?」です・・・。
お願いします。

A 回答 (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としましょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
いろいろ指摘するとこありすぎですね(--;)
正しいやり方を教えてくださって大変参考になりました。

お礼日時:2004/11/29 16:41

>いざ実行!と思ってコンパイルすると、「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。

」と出たのですが、何が原因かわかりません。

>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/defa …
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
>x座標の値をsin関数の戻り値そのまま座標として使おうとすると、-1、0、1にしかならないんで曲線になりません
そうでした...こういうところでミスして後々悩むんですよ(汗)

お礼日時:2004/11/29 16:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!