
行列の積の計算のプログラムです
#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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GlobalAlloc生成メモリの開放で...
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
C言語にてXMLファイルから任意...
-
ファイルの特定行の抽出
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
-
既定のコンストラクタがありま...
-
CTabCtrl:TABインデックス単位...
-
charと%c , %s の関係について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
C言語の課題です
-
ファイル出力で改行を入れたい!
-
fgets( ) の返り値は何?
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
ファイルに行番号を追加
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語についてアドバイスをくだ...
-
同時にファイル読み込み 書き込み
-
初心者のc言語
-
大量の入力ファイルを扱うとき...
-
【C言語について】ファイル名の...
-
C言語 共用体の構造体の引数設定
-
C言語でのCSVソートとデータ抽...
-
エラーがわかりません、、
-
プログラムの内で、何か画面表...
-
「コマンドライン引数チェック...
-
プログラミングのデータの読み込み
おすすめ情報