知っている(ある程度のプログラミング知識がある)方にはばかばかしい内容かもしれませんが・・・。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- 数学 複雑な三角関数の周期の求め方 2 2022/10/04 16:44
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- 数学 数学の問題です。回答よろしくお願いします。 sinが無限に続く関数f(X)=sin(sin(sin( 3 2022/09/21 10:40
- 物理学 物理の問題です。 1 2022/12/20 23:04
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- 数学 sin(45°-x)=sin(x+135°)が成り立つと思うのですが、 これを加法定理を使わずに(三 4 2023/05/25 12:34
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- 数学 三角関数の和 4 2023/06/17 18:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
3次元空間上の2つの座標から...
-
閉図形の座標の配列が右回りか...
-
ダイアログ内コントロールの位...
-
エクセルである点からの距離で...
-
ピクチャボックスの座標取得
-
交差する2線分の交点座標の求め方
-
エクセルシート上のマウスポイ...
-
一番近い点を見つけたい。
-
c言語でキーボードから2点の座...
-
ビットマップ画像の座標を小数...
-
VBで、開いているExcelシートの...
-
マインクラフト(pc版)で座標...
-
Tiny Basicでのグラフィック。。
-
ワード上Shapeの位置情報を統一...
-
最小二乗平面
-
エクセルで回転する座標の出し方
-
座標A(X,Y)の線分(aX,aY)(b...
-
空間上の二点を結ぶ直線上に任...
-
ClientToScreen
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マインクラフト(pc版)で座標...
-
グラフの交点の求め方(Excel)
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
求積表の計算方法
-
ダイアログ内コントロールの位...
-
空間上の二点を結ぶ直線上に任...
-
始点、終点の二つの座標と半径...
-
図形が重なりあっているかどうか
-
ワード上Shapeの位置情報を統一...
-
以下のプログラムは重心を求め...
-
シーケンサー(PLC?)で制...
-
ピクチャボックスの座標取得
-
多角形の内部かどうか判定する方法
-
Excel VBA で自在に図形を変化...
-
選択範囲の座標値の抽出
-
座標を持った平面範囲に座標を...
-
VBで、開いているExcelシートの...
おすすめ情報