• ベストアンサー

変数宣言にいらないの入れると正確な出力になる(なんかおかしいです

main関数の中の double x,y; のままだと出力のout.txtは間違った答えになるのに double x,y,n;とか関係ない変数を宣言に足すと、 正解な値が出ます。 ソースはRunge-Kuttaの計算をするものです。 他はまったく変えてないのになぜ結果がちがくなるのでしょうか? おかしいとおもって友達などにも実行してもらったんですが同じ症状がでます。 環境はVC++6.0でOSはMEと2kとXPで試したんですが、同じ結果でした。 ソースは↓です。よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #define X0 0.0 #define Y0 1.0 #define XEND 0.5 #define XSTEP 0.1 double func(double xx,double yy); main() { double x,y; double k[3]; FILE *fp1; if(!(fp1=fopen("out.txt","w"))){ printf("ファイルを開けません\n"); exit(1); } x=X0; y=Y0; for(x=X0;x<=XEND;x=x+XSTEP){ fprintf(fp1,"%f\t%f\t\n",x,y); k[0]=XSTEP*func(x,y); k[1]=XSTEP*func(x+XSTEP/2,y+k[0]/2); k[2]=XSTEP*func(x+XSTEP/2,y+k[1]/2); k[3]=XSTEP*func(x+XSTEP,y+k[2]); y=y+(k[0]+2*k[1]+2*k[2]+k[3])/6; } return 0; } double func(double xx,double yy) { return yy; }

質問者が選んだベストアンサー

  • ベストアンサー
noname#5537
noname#5537
回答No.1

> double k[3]; この宣言で使用できるのは k[0] ~ k[2] の 3 個の要素です。 k[3] を読み書きしてはいけません。 k[3] を使いたければ、  double k[4]; です。

sin11
質問者

お礼

さっそくの回答ありがとうございます。 それにしても、まぬけなミスをしてました。 k[4]にしたら正確に動きました。

その他の回答 (2)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

推測ですが、k[3]に相当する場所にたまたまnが配置されていてk[3]の役目をし、 他のデータを壊さずにうまく動いていたのでしょうね。 珍しいケースですね。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.2

double k[3]; と宣言されているのに k[3]=XSTEP*func(x+XSTEP,y+k[2]); となっているのがまずいのでしょう。 k[3]だとk[0]~k[2]までの配列確保ですよ。 double k[4]; にすれば動くと思います。

関連するQ&A