行列の積の計算のプログラムです
#include <stdio.h>
#include <math.h>
#define MN 1200
int main()
{
double A[MN][MN],B[MN][MN],C[MN][MN];
int i,j,k;
double an=0,am=0,bn=0,bm=0;
FILE *fp1;
FILE *fp2;
FILE *fp3;
fp1 = fopen("1200A.dat", "r");
for(i=0;i<am;i++){
for(j=0;j<an;j++){
fscanf(fp1,"%lf",&A[i][j]);
}
}
fclose(fp1);
fp2=fopen("1200B.dat","r");
for(i=0;i<bm;i++){
for(j=0;j<bn;j++){
fscanf(fp2,"%lf",&B[i][j]);
}
}
fclose(fp2);
for(i=0;i<am;i++){
for(j=0;j<bn;j++){
C[i][j]=0.0;
for(k=0;k<bm;k++){
C[i][j]+=A[i][k]*B[k][j];
}
}
}
fp3=fopen("ans1200C.dat","w");
for(i=0;i<am;i++){
for(j=0;j<bn;j++){
fprintf(fp3,"%lf ",C[i][j]);
}
fprintf(fp3, "\n");
}
fclose(fp3);
return 0;
}
No.4ベストアンサー
- 回答日時:
さて、それで何を聞きたいのでしょうか?
タイトルにある「セグメンテーションエラー」というのが正確にはどんなエラーなのかわかりません。
実行した環境の説明も、エラーメッセージの詳細も無いのですから。
考えられることとして。
> double A[MN][MN],B[MN][MN],C[MN][MN];
このような場所で宣言した変数や配列は「自動変数」と呼ばれます。詳細は「自動変数」で検索。
多くの環境で、自動変数用の領域(スタック領域を使う場合が多い)はそれほど大きくありません。 1200*1200のdouble(大抵8バイト)の配列を3つ、などは通常は入りません。
・コンパイル時のオプションで自動変数用の領域を増やす
・static を付けて静的に確保する。詳しくは「静的変数」で検索。
・malloc等を使って動的に確保する。こちらは別の領域を使っていて、かなり大きなサイズが使える。
等の方法が必要です。
ただ、これが解決しても
> double an=0,am=0,bn=0,bm=0;
と初期設定しただけで、その後変更されている様子が無いのですが、それだと
> for(i=0;i<am;i++){
> for(j=0;j<an;j++){
など an,am,bn,bmを使ったforループは1つも実行されないことになります。
あと、an,am,bn,bmが行列の大きさを表しているのなら、 doubleである必要は無いはずです。むしろ、int等の整数型を使う方がよいです。
この回答への補足
an,am,bn,bmはint型の宣言が正しいですね。
an,am,bn,bmには1200の値をいれるつもりでした。
stackエラーになってるのではなく、ファイルオープンした後に動作が停止するみたいです。
読み込む時にエラーになってるのではないのかと思います。
↑デバックのモードみたいなものを使って確かめました。
No.7
- 回答日時:
既に書かれてるけど、fopen() に失敗すれば fscanf() や fclose() に NULL ポインタ渡すから、簡単に segmentation fault するよ。
だからエラーチェックはちゃんとやろうぜ。
> fp1 = fopen("1200A.dat", "r");
if (fp1 == NULL) {
perror("1200A.dat");
exit(1);
}
No.6
- 回答日時:
int i,j,k;
double an=0,am=0,bn=0,bm=0;
とりあえず,サイズ 0x0 の行列を扱ってますが,
for(i=0;i<am;i++)
int と double の比較なのでよく分からないけど,
i=0 だけ通るのでしょうか?
int an=1,am=1,bn=1,bm=1;
とかにした方が良いんでないの?
No.5
- 回答日時:
「ファイルオープンした後に動作が停止する『みたい』です」「読み込む時にエラーになってるのではないのかと『思います』」「デバックのモード『みたいなもの』を使って確かめました」ってどういうこと? 「みたい」「思います」「みたいなもの」と, 相手に正確な情報が伝わらないような表現をなぜわざわざする?
とりあえず, 動作環境 (少なくとも OS とコンパイラ) の情報は出してください. それから, 実際にどのような操作をしてどのような出力が得られたのか, 「一字一句正確に」書いてほしい. それができて, ようやく「質問としての出発点」だ.
この回答への補足
すいません。
動作環境はwindows7でcygwinを使ってます。
コンパイラの情報はわかりません。
gcc ファイル名
でコンパイルは成功しました。
./a.exe
としたときに
segmentation fault (core dumped)
とでました。
デバックモードみたいなものとはオプションとして
-gdb
をつけて実行しました。
ファイルの読み込み時に実行停止しました。
望んでいる結果としては
1200A,1200Bのファイルを読み込み
ans1200のファイルに行列の積を結果として書き込む。
ということをしたいです。
No.3
- 回答日時:
>fp1 = fopen("1200A.dat", "r");
ファイルオープンねに失敗しても突っ走るぜ!イェイ!!
とか、
>for(i=0;i<am;i++){
ループなんて実行しないぜ。うらぁ!!
ですか?
まぁ、既に書かれている通りスタック食いつぶすのが先っぽいですけど。
No.2
- 回答日時:
ソースコードだけ貼り付けても何を聞きたいかわかりませんが、とりあえず
> #define MN 1200
> double A[MN][MN],B[MN][MN],C[MN][MN];
segmentation faultより先にstack overflowが出るんでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でのfscanfについて
-
複数ファイルの同時読み込みの...
-
C言語にてXMLファイルから任意...
-
ファイルへの書込み処理が異常...
-
datファイルの読み込み
-
【C言語】ファイルを読み込んで...
-
fscanfで格納された変数がおか...
-
VisualStudioでのファイルの入...
-
ファイル出力で改行を入れたい!
-
同時にファイル読み込み 書き込み
-
差分ファイルを読み込んで解析する
-
テキストファイル内に対して, ...
-
ガンマ変換 C言語でプログラ...
-
C言語でファイル名を変数にした...
-
C言語でのCSVソートとデータ抽...
-
ファイル読み込み EOF 判定
-
fopenでファイル名に、変数を使...
-
テキストを一文字以上ずつ読み...
-
自己相関関数を求めるプログラ...
-
C言語のファイル入出力の問題です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
ファイルへの書込み処理が異常...
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
C言語にてXMLファイルから任意...
-
CRC32の計算方法
-
fgets( ) の返り値は何?
-
InternetReadFileを使ったファ...
-
【C言語】ファイルを読み込んで...
-
VisualStudioでのファイルの入...
-
commons-netでのFTP送信について
-
日本語ファイル名のFTPについて
-
fgets関数の利用 c言語
-
C言語でコマンドmvを実行
-
「コマンドライン引数チェック...
-
C言語でセグメンテーションエ...
-
構造体のメンバにファイルポイ...
-
エラー C2664
おすすめ情報