ページ 1 / 1
Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 18:01
by くろろん
コード:
#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++言語で水の流れを解析するプログラムを作成しています。
デバックしたところ、エラーメッセージとして
「引数を取り込む関数には評価されません」
「構文エラー : ';' が ')' の前にありません。」
が表示されてしまいます。解決方法を教えて頂きたいです。
プログラム経験はほとんどない初心者です。よろしくおねがいします。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 18:06
by h2so5
配列の添字を指定するには( ) ではなく [ ] を使用します。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 18:23
by くろろん
素早い返信ありがとうございます。
そうですね。うっかりしていました・・
修正したところ、先ほど投稿していた際に見落としていたと思われる以下のようなエラーが出ました。
(37): error C2440: '=' : 'double' から 'double [100]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインターから配列への変換があります。
(49): error C2664: 'printf' : 1 番目の引数を 'double' から 'const char *' に変換できません。
これはいったいどういうことなのでしょうか?
(const charは書き換えできない文字列とありましたが、よく理解できませんでした><)
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 18:31
by へにっくす
くろろん さんが書きました:素早い返信ありがとうございます。
そうですね。うっかりしていました・・
修正したところ、先ほど投稿していた際に見落としていたと思われる以下のようなエラーが出ました。
(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 文)の書式
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 18:38
by box
C言語の配列の添字が0始まりであることを理解できていないと思います。
この定義で
くろろん さんが書きました:コード:
for(i=1;i<=1000;i++){
u1(i)=0;
}
これはまずいです。
ところで、
くろろん さんが書きました:コード:
double dx,dt,a,pri,vis,time,pi();
ここにあるpi()とは何でしょうか?
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 18:55
by くろろん
コード:
#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ファイルが停止してしまったので。。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月01日(日) 19:09
by へにっくす
くろろん さんが書きました:配列についてですが、すっかり配列の添え字が0始まりであることを失念していました。for文の中身をfor(i=o;i<1000;i++)
にすれば大丈夫ということで良いでしょうか。
i=oってなんですかね。
for(i=0;i<1000;i++)でokですけど。ここだけでなく1始まりになってるところは全て直して下さいよ?
くろろん さんが書きました:いま、デバックしたところエラーはでなかったのですが、実行時にexeファイルが停止してしまったので。。
デバッグうんぬん関係なく、それはなおすべきところです。
うまく実行できるからOKではないのです。仕事でそんなこと言ったら雷が落ちますよ。
あと、printfも修正はしたようですが、まだD[0,0]という指定がありますね。
ちゃんと全部見直して下さい。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月02日(月) 01:48
by くろろん
コード:
#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回で終わってしまいます。
なにかうまい改善策はないでしょうか。。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月02日(月) 02:42
by YuO
80MBのスタックの要求があるため,スタックオーバーフローで動きませんね……。
まぁ,Dをstaticにすれば実行可能にはなるわけですが……。
# コピペしただけではコンパイル通らない (U+3000が入っている)
くろろん さんが書きました:しかし、二次元配列Dに値が格納されません><
デバッグしましょうよ。
ちなみに,デバッグとは[デバッグ]メニュー - [デバッグ開始]で実行することではないですよ。
オフトピック
2011-07-01T18:55+09:00の投稿にデバック (デバッグの間違い?) したと書いてあったので。
というか,最初の投稿を見るに,デバッグとビルドを間違えている?
- の行にカーソルを移動する
- [デバッグ]メニュー - [ブレークポイントの設定/解除] を選び,ブレークポイントを設定する
- [デバッグ]メニュー - [デバッグ開始] を選び,デバッグ実行を開始する
- 設定したブレイクポイントで止まったら,[デバッグ]メニュー - [ウィンドウ]にある,
- [自動変数]
- [ローカル]
- [ウォッチ] - [ウォッチ1] ~ [ウォッチ4]
の各ペインを表示したり,対象を追加したりして,変数の値を見る
- ステップ実行して,意図した経路を辿り,かつ意図した変数の値になっているかを調べる
- [デバッグ]メニュー - [ステップ イン]
関数呼び出し時に呼ばれる関数の中へステップ実行していく
- [デバッグ]メニュー - [ステップ オーバー]
関数呼び出し時に呼ばれる関数の中はステップ実行しない
- [デバッグ]メニュー - [ステップ アウト]
現在実行中の関数から出るまでステップ実行を飛ばす
- 4. - 5.を繰り返す
が,VC++におけるデバッグの基本となります。
# ブレイクポイントを適宜設定して,そこまで[続行]することもよくありますが。
で,元の質問は,ステップ実行すればわかる話ですが,
と,必ず最初のi++の評価で偽になるために,Dへの代入が無くなっています。
くろろん さんが書きました:最後のif文によって、どうしてもループが100回で終わってしまいます。
この「ループ」とはどのループを指しているのですか。
とりあえず,28行目のforによって生成されるループについて,終了直後のtの値は100001でした。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月02日(月) 03:15
by くろろん
返信ありがとうございます。
ブレークポイントを設定してデバッグ開始を行ってみたところ、確かに28行目から始まるループの回数は
100001回でした。これについては私の勘ちがいのようなので、ループ回数については解決しました。
で必ず最初のi++の評価で偽になるとはどういうことでしょうか?
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月02日(月) 06:09
by box
くろろん さんが書きました:
で必ず最初のi++の評価で偽になるとはどういうことでしょうか?
ここは、本当は
こうしたかったのではないのでしょうか。
質問者さんのコードは、
1)iに0を代入し、続いてniとの大小を比較している。結果は偽。
2)i++のところでは、まずiを評価している。ここで、iの値は0なので、評価結果は偽。よって、このfor文のループは一回も回らない。
という指摘を受けているように思います。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月02日(月) 09:53
by くろろん
なるほど。。そういうことだったんですね。
指摘された点を修正した結果、しっかりとプログラムが回りました!
こんな無知な私の質問に丁寧に回答して頂きありがとうございました。
Re: Microsoft Visual C++2010で作成したプログラムのエラーについて
Posted: 2012年7月02日(月) 09:54
by くろろん
解決にするのを忘れていました。
みなさん本当にありがとうございました!