知っている(ある程度のプログラミング知識がある)方にはばかばかしい内容かもしれませんが・・・。
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]も、これで良いのか「?」です・・・。
お願いします。
No.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としましょう。
回答ありがとうございました!
いろいろ指摘するとこありすぎですね(--;)
正しいやり方を教えてくださって大変参考になりました。
No.1
- 回答日時:
>いざ実行!と思ってコンパイルすると、「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。
」と出たのですが、何が原因かわかりません。>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 …
回答ありがとうございました!
>x座標の値をsin関数の戻り値そのまま座標として使おうとすると、-1、0、1にしかならないんで曲線になりません
そうでした...こういうところでミスして後々悩むんですよ(汗)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
虚数は我々日常生活の身近なと...
-
Pythonを使ってヒートマップを...
-
スクリーン座標からワールド座...
-
エクセルでの座標計算の質問
-
画像ファイルに座標が記録され...
-
マインクラフト(pc版)で座標...
-
VB.netでSTLファイルの分離
-
FORTRAN でBMP画像の値の取得
-
円弧の描画について
-
ビットマップ画像の座標を小数...
-
コントロールのドラック&ドロップ
-
交差する2線分の交点座標の求め方
-
隣接行列の表示
-
matlab-図形表示
-
差分法による数値解析でヤコビ...
-
vba Typeステートメント
-
エクセルで作った新しいウイン...
-
コントロールの書式設定で、“コ...
-
フォントの大きさ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
3次元空間上の2つの座標から...
-
ダイアログ内コントロールの位...
-
エクセルである点からの距離で...
-
画像ファイルに座標が記録され...
-
始点、終点の二つの座標と半径...
-
直線上にある点の座標の求め方
-
エクセルで回転する座標の出し方
-
以下のプログラムは重心を求め...
-
閉図形の座標の配列が右回りか...
-
シーケンサー(PLC?)で制...
-
座標を持った平面範囲に座標を...
-
円弧の描画について
-
多角形の内部かどうか判定する方法
-
図形が重なりあっているかどうか
-
ガウシアンフィルタのCプログラム
-
ワード上Shapeの位置情報を統一...
-
ピクチャボックスの座標取得
-
交差する2線分の交点座標の求め方
おすすめ情報