どうしても分からなくて悩んでいます。
以下に示すプログラムをビルドしますと debug assertion failed!という警告が出て実
行することができません。
どうしてでしょうか?どなたかご教授願えませんか。
プログラミング環境はwindows vc++ 6.0です。
#include stdafx.h
#include <stdio.h>
#define M 4
main(int argc, char *argv[])
{
double a[M][M];
double b[M];
double c[M];
double l[M][M];
double u[M][M];
double x[M];
int i,j,k;
FILE *fp;
fp = fopen(argv[1], r); /* ファイルより入力行列を読み込む*/
for(i = 0; i < M; i++){
for(j = 0; j < M; j++){
fscanf(fp,%lf,&a[i][j]);
}
fscanf(fp,%lf,&b[i]);
}
fclose(fp);
for(i = 0; i < M; i++){ /* L行列、U行列を1と0で初期化*/
for(j = 0; j < M; j++){
u[i][j] = 0;
if(i == j)
l[i][j] = 1;
else
l[i][j] = 0;
}
}
for(i = 0; i < M; i++){
for(j = i; j < M; j++){ /* U行列の生成*/
u[i][j] = a[i][j];
for(k = 0; k < i; k++){
u[i][j] -= u[k][j] * l[i][k];
}
}
for(j = i+1; j < M; j++){ /* L行列の生成*/
l[j][i] = a[j][i];
for(k = 0; k < i; k++){
l[j][i] -= u[k][i] * l[j][k];
}
l[j][i] /= u[i][i];
}
}
for(i = 0; i < M; i++){ /* c行列の生成*/
c[i] = b[i];
for(j = 0; j < i; j++){
c[i] -= l[i][j] * c[j];
}
}
for(i = M-1; i >= 0; i--){ /* x行列の生成*/
x[i] = c[i];
for(j = M-1; j > i; j--){
x[i] -= u[i][j] * x[j];
}
x[i] /= u[i][i];
}
printf(入力行列\n); /* 入力行列の出力*/
for(i = 0; i < M; i++){
for(j = 0; j < M; j++){
printf(%10.5lf ,a[i][j]);
}
printf(%10.5lf\n,b[i]);
}
printf(\nL行列\n); /* L行列の出力*/
for(i = 0; i < M; i++){
for(j = 0; j < M; j++){
printf(%10.5lf ,l[i][j]);
}
printf(\n);
}
printf(\nU行列\n); /* U行列の出力*/
for(i = 0; i < M; i++){
for(j = 0; j < M; j++){
printf(%10.5lf ,u[i][j]);
}
printf(\n);
}
printf(\n);
for(i = 0; i < M; i++){ /* 解の出力*/
printf(x%d = %10.5lf\n,i,x[i]);
}
}
入力データを格納したファイル名を与えていますか?
レスありがとうございます。
入力データを格納したファイル名は与えていません。
>入力データを格納したファイル名は与えていません。
だとしたら fp =fopen(argv[1], r); での argv[1] は何を指しているでしょうか?
もし、fopen に失敗していたら、 fscanf(fp, %lf, &a[i][j]); はどういう動きを
すると思いますか?
デバッガーの使い方は判りますか?
このプログラムにおいてc言語ではargv[1]を用いて実行することが可能のようです。
僕の考えですとargv[1]は入力を格納する配列だと?思います。
デバッガーの使い方は分かりません。
すいません。
> 僕の考えですとargv[1]は入力を格納する配列だと?思います。
だから、そいつにファイル名が格納されていないと
ファイルのオープンに失敗します。
επιστημη様
このプログラムですとどこでファイル名を指定すればよろしいですか?
このプログラムが prog.exe、
データファイルが data.txt だとすると、
コマンドラインから
prog data.txt
と入力します。
貴方のプログラム名が hoge.exe だったとして、引数としてのファイル名を指定せずに
hoge
とだけで起動した場合、argv[1] にはどういう文字列があるのでしょうか?
ファイル名を指定しないでも argv[1] にはどこからか(天から降(ふ)るか、地から湧(わ)
くかで、)文字列(入力のファイル名)がやって来ると思っていますか?
もう一度訊ねますが
>>もし、fopen に失敗していたら、 fscanf(fp, %lf, &a[i][j]); はどういう動きを
>>すると思いますか?
επιστημη様
レスありがとうございます。
たびたびすいません。
現在、vc++においてソースを実行させています。
unixなどを利用したコマンドによる操作を行っていません。
vc++で実行すると確かにコマンド画面が出てきますがプログラムの出力結果のみで
す。このソースの中での操作により、入力データを格納することはできないですか?
ご教授ください。
島様
確かにおっしゃるとおりだと思います。
引数としてデータのある位置、数値などを与えないとsscanfを用いてデータの取出しが
行う事ができないと思います。そのargv[1]とデータファイルを兼ねた与え方が分かりま
せん。
[プロジェクト][設定]で表示される「プロジェクトの設定」ダイアログの
[デバッグ]タブに[プログラムの引数]という項目があります。
そこにプログラムに渡したい文字列を記入すれば
Visual Studioのデバッグで実行できるでしょう。
επιστημη さんが掲示した例だと、
data.txt
を記入することになります。(パスに注意する必要がありますが…)
また、島さんも書かれていますが、fopen()に失敗した場合のエラー処理が無いですね…
あと………解決したらマルチポスト先にも後始末して下さいね。
http://www.net24.ne.jp/~kenji/bbs/wforum.cgi?
no=370&reno=no&oya=370&mode=msgview&page=0
プロジェクト -> 設定 -> デバッグ-tab -> プログラムの引数
瀬戸っぷ様 επιστημη様 島様
有難うございました。解決しました。
このような使い方はまだ知りませんでした。
感動しています。感謝いたします。
初心者