Microsoft Visual C++2010で作成したプログラムのエラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
くろろん

Microsoft Visual C++2010で作成したプログラムのエラーについて

#1

投稿記事 by くろろん » 11年前

コード:

#include <stdio.h>
#include <math.h>

int main(void)
{
	int i,t,ni,nt;
	double dx,dt,a,pri,vis,time,pi();
	double u1[1000];
	double u2[1000];
	double D[100000][100];


	a=1.00;
	nt=100000;
	ni=100;
	dt=0.001;
	dx=0.0005;
	pri=10.0;
	vis=0.000001;

	for(i=1;i<=1000;i++){
		u1(i)=0;
	}
		
		for(t=1;t<=nt;t++){
			u1(1)=a*sin(((2*pi())/pri)*t*dt);
			u1(ni)=0.0;

			for(i=2;i<=ni-1;i++){
				u2(i)=vis*((u1(i+1)+u1(i-1)-2.0*u1(i))/(dx*dx))*dt+u1(i);
			}

			for(i=2;i<=ni-1;i++){
				u1(i)=u2(i);
			}
			for(i=1,i<=ni;i++){
				D(t,i)=u1(i);
			}
			if(t % 100 == 0){
				time=t*dt;
				printf("%f %f",time,u1(20));
			}
		}

		t=10000;
		printf("距離,(ωt=0,ωt=π/2,ωt=π,ωt=3π/2");

		for(i=1;i<=ni;i++){
			printf(i*dx,D(t,i),D(t+2500,i),D(t+5000,i),D(t+7500,i);
		}

		return 0;
}
今、課題としてC++言語で水の流れを解析するプログラムを作成しています。
デバックしたところ、エラーメッセージとして
「引数を取り込む関数には評価されません」
「構文エラー : ';' が ')' の前にありません。」
が表示されてしまいます。解決方法を教えて頂きたいです。
プログラム経験はほとんどない初心者です。よろしくおねがいします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#2

投稿記事 by h2so5 » 11年前

配列の添字を指定するには( ) ではなく [ ] を使用します。

くろろん

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#3

投稿記事 by くろろん » 11年前

素早い返信ありがとうございます。
そうですね。うっかりしていました・・
修正したところ、先ほど投稿していた際に見落としていたと思われる以下のようなエラーが出ました。
(37): error C2440: '=' : 'double' から 'double [100]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインターから配列への変換があります。
(49): error C2664: 'printf' : 1 番目の引数を 'double' から 'const char *' に変換できません。
これはいったいどういうことなのでしょうか?
(const charは書き換えできない文字列とありましたが、よく理解できませんでした><)

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#4

投稿記事 by へにっくす » 11年前

くろろん さんが書きました:素早い返信ありがとうございます。
そうですね。うっかりしていました・・
修正したところ、先ほど投稿していた際に見落としていたと思われる以下のようなエラーが出ました。
(37): error C2440: '=' : 'double' から 'double [100]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインターから配列への変換があります。
C/C++では二次元配列の示すのに、a[0,0]という指定はできません。
a[0][0]という形式になります。
くろろん さんが書きました:(49): error C2664: 'printf' : 1 番目の引数を 'double' から 'const char *' に変換できません。
これはいったいどういうことなのでしょうか?
(const charは書き換えできない文字列とありましたが、よく理解できませんでした><)
printfの最初の引数は、「書式文字列」を入れます。そのあとに、「書式文字列」に対応した引数を指定します。
C言語 - 書式付入出力関数(printf 文・scanf 文)の書式
written by へにっくす

box
記事: 2002
登録日時: 13年前

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#5

投稿記事 by box » 11年前

C言語の配列の添字が0始まりであることを理解できていないと思います。
くろろん さんが書きました:

コード:

	double u1[1000];
この定義で
くろろん さんが書きました:

コード:

	for(i=1;i<=1000;i++){
		u1(i)=0;
	}
これはまずいです。

ところで、
くろろん さんが書きました:

コード:

	double dx,dt,a,pri,vis,time,pi();
ここにあるpi()とは何でしょうか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

くろろん

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#6

投稿記事 by くろろん » 11年前

コード:

#include <stdio.h>
#include <math.h>
#define PI 6*asin(0.5)

int main(void)
{
	int i,t,ni,nt;
	double dx,dt,a,pri,vis,time;
	double u1[1000];
	double u2[1000];
	double D[100000][100];


	a=1.00;
	nt=100000;
	ni=100;
	dt=0.001;
	dx=0.0005;
	pri=10.0;
	vis=0.000001;

	for(i=1;i<=1000;i++){
		u1[i]=0;
	}
		
		for(t=1;t<=nt;t++){
			u1[1]=a*sin(((2*PI)/pri)*t*dt);
			u1[ni]=0.0;

			for(i=2;i<=ni-1;i++){
				u2[i]=vis*((u1[i+1]+u1[i-1]-2.0*u1[i])/(dx*dx))*dt+u1[i];
			}

			for(i=2;i<=ni-1;i++){
				u1[i]=u2[i];
			}
			for(i=1,i<=ni;i++;){
				D[t][i]=u1[i];
			}
			if(t % 100 == 0){
				time=t*dt;
				printf("%f %f",time,u1[20]);
			}
		}

		t=10000;
		printf("距離,(ωt=0,ωt=π/2,ωt=π,ωt=3π/2");

		for(i=1;i<=ni;i++){
			printf("%f %f %f %f %f",i*dx,D[t,i],D[t+2500,i],D[t+5000,i],D[t+7500,i]);
		}

		return 0;
}
みなさんご意見ありがとうございます。
指摘を受けてプログラムを修正しました。
boxさん⇒そのPIはdefineを用いて修正しました。意味不明でしたね(-_-;)
       配列についてですが、すっかり配列の添え字が0始まりであることを失念していました。for文の中身をfor(i=o;i<1000;i++)
       にすれば大丈夫ということで良いでしょうか。
      いま、デバックしたところエラーはでなかったのですが、実行時にexeファイルが停止してしまったので。。
      

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#7

投稿記事 by へにっくす » 11年前

くろろん さんが書きました:配列についてですが、すっかり配列の添え字が0始まりであることを失念していました。for文の中身をfor(i=o;i<1000;i++)
にすれば大丈夫ということで良いでしょうか。
i=oってなんですかね。
for(i=0;i<1000;i++)でokですけど。ここだけでなく1始まりになってるところは全て直して下さいよ?
くろろん さんが書きました:いま、デバックしたところエラーはでなかったのですが、実行時にexeファイルが停止してしまったので。。
デバッグうんぬん関係なく、それはなおすべきところです。
うまく実行できるからOKではないのです。仕事でそんなこと言ったら雷が落ちますよ。
あと、printfも修正はしたようですが、まだD[0,0]という指定がありますね。
ちゃんと全部見直して下さい。
written by へにっくす

くろろん

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#8

投稿記事 by くろろん » 11年前

コード:

#include <stdio.h>
#include <math.h>
#define PI 6*asin(0.5)

int main(void)
{
	int i,t,ni,nt;
	double dx,dt,a,pri,vis,time;
	double u1[1000];
	double u2[1000];
	double D[100000][100];


	a=1.00;
	nt=100000;
	ni=100;
	dt=0.001;
	dx=0.0005;
	pri=10.0;
	vis=0.000001;

	/*一次元配列u1[i]の中身を初期化*/
	for(i=0;i<1000;i++){
		u1[i]=0;

	}
	    roop1:
		for(t=0;t<=nt;t++){               
			u1[0]=a*sin(((2*PI)/pri)*(t+1)*dt);      /*初期条件*/
			u1[ni]=0;                                 /*初期条件*/
			u1[1]=u1[0]+0.0005;
			u1[2]=u1[0]+0.001;
			for(i=0;i<ni-1;i++){    
				u2[i+1]=vis*((u1[i+2]+u1[i]-2.0*u1[i+1])/(dx*dx))*dt+u1[i+1];  /*微分を行う*/
			}

			for(i=0;i<ni-1;i++){
				u1[i+1]=u2[i+1];       /*次の計算に備えて変数を更新*/
			}
			for(i=0,i<ni;i++;){    
				D[t][i]=u1[i];     
			}
			if(t % 100 == 0){      /*t/100の余りが0となったとき(tが100の倍数の時)以下を行う*/
				time=t*dt;         /*時間の更新*/
				printf("%f %f",time,u1[20]);
			}
		}
		
		t=70000;
		printf("距離,(ωt=0,ωt=π/2,ωt=π,ωt=3π/2");

		for(i=0;i<=ni;i++){
			printf("%f\n %f\n %f\n %f\n %f\n",i*dx,D[t][i],D[t+2500][i],D[t+5000][i],D[t+7500][i]);
		}

		return 0;
}
プログラムを改めて見直しました。
しかし、二次元配列Dに値が格納されません><
また、最後のif文によって、どうしてもループが100回で終わってしまいます。
なにかうまい改善策はないでしょうか。。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#9

投稿記事 by YuO » 11年前

80MBのスタックの要求があるため,スタックオーバーフローで動きませんね……。
まぁ,Dをstaticにすれば実行可能にはなるわけですが……。
# コピペしただけではコンパイル通らない (U+3000が入っている)
くろろん さんが書きました:しかし、二次元配列Dに値が格納されません><
デバッグしましょうよ。
ちなみに,デバッグとは[デバッグ]メニュー - [デバッグ開始]で実行することではないですよ。
オフトピック
2011-07-01T18:55+09:00の投稿にデバック (デバッの間違い?) したと書いてあったので。
というか,最初の投稿を見るに,デバッグとビルドを間違えている?
  1. コード:

    a=1.00;
    の行にカーソルを移動する
  2. [デバッグ]メニュー - [ブレークポイントの設定/解除] を選び,ブレークポイントを設定する
  3. [デバッグ]メニュー - [デバッグ開始] を選び,デバッグ実行を開始する
  4. 設定したブレイクポイントで止まったら,[デバッグ]メニュー - [ウィンドウ]にある,
    • [自動変数]
    • [ローカル]
    • [ウォッチ] - [ウォッチ1] ~ [ウォッチ4]
    の各ペインを表示したり,対象を追加したりして,変数の値を見る
  5. ステップ実行して,意図した経路を辿り,かつ意図した変数の値になっているかを調べる
    • [デバッグ]メニュー - [ステップ イン]
      関数呼び出し時に呼ばれる関数の中へステップ実行していく
    • [デバッグ]メニュー - [ステップ オーバー]
      関数呼び出し時に呼ばれる関数の中はステップ実行しない
    • [デバッグ]メニュー - [ステップ アウト]
      現在実行中の関数から出るまでステップ実行を飛ばす
  6. 4. - 5.を繰り返す
が,VC++におけるデバッグの基本となります。
# ブレイクポイントを適宜設定して,そこまで[続行]することもよくありますが。

で,元の質問は,ステップ実行すればわかる話ですが,
くろろん さんが書きました:

コード:

			for(i=0,i<ni;i++;){    
と,必ず最初のi++の評価で偽になるために,Dへの代入が無くなっています。
くろろん さんが書きました:最後のif文によって、どうしてもループが100回で終わってしまいます。
この「ループ」とはどのループを指しているのですか。
とりあえず,28行目のforによって生成されるループについて,終了直後のtの値は100001でした。

くろろん

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#10

投稿記事 by くろろん » 11年前

返信ありがとうございます。
ブレークポイントを設定してデバッグ開始を行ってみたところ、確かに28行目から始まるループの回数は
100001回でした。これについては私の勘ちがいのようなので、ループ回数については解決しました。

コード:

for(i=0,i<ni;i++;)
で必ず最初のi++の評価で偽になるとはどういうことでしょうか?

box
記事: 2002
登録日時: 13年前

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#11

投稿記事 by box » 11年前

くろろん さんが書きました:

コード:

    for(i=0,i<ni;i++;)
で必ず最初のi++の評価で偽になるとはどういうことでしょうか?
ここは、本当は

コード:

    for(i=0;i<ni;i++)
こうしたかったのではないのでしょうか。

質問者さんのコードは、
1)iに0を代入し、続いてniとの大小を比較している。結果は偽。
2)i++のところでは、まずiを評価している。ここで、iの値は0なので、評価結果は偽。よって、このfor文のループは一回も回らない。
という指摘を受けているように思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

くろろん

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#12

投稿記事 by くろろん » 11年前

なるほど。。そういうことだったんですね。
指摘された点を修正した結果、しっかりとプログラムが回りました!

こんな無知な私の質問に丁寧に回答して頂きありがとうございました。

くろろん

Re: Microsoft Visual C++2010で作成したプログラムのエラーについて

#13

投稿記事 by くろろん » 11年前

解決にするのを忘れていました。
みなさん本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る