プロが教えるわが家の防犯対策術!

行列の積の計算のプログラムです

#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;
}

A 回答 (7件)

さて、それで何を聞きたいのでしょうか?


タイトルにある「セグメンテーションエラー」というのが正確にはどんなエラーなのかわかりません。
実行した環境の説明も、エラーメッセージの詳細も無いのですから。

考えられることとして。
> 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エラーになってるのではなく、ファイルオープンした後に動作が停止するみたいです。
読み込む時にエラーになってるのではないのかと思います。
↑デバックのモードみたいなものを使って確かめました。

補足日時:2010/12/22 09:48
    • good
    • 0

既に書かれてるけど、fopen() に失敗すれば fscanf() や fclose() に NULL ポインタ渡すから、簡単に segmentation fault するよ。



だからエラーチェックはちゃんとやろうぜ。

> fp1 = fopen("1200A.dat", "r");
if (fp1 == NULL) {
perror("1200A.dat");
exit(1);
}
    • good
    • 0

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;

とかにした方が良いんでないの?
    • good
    • 0

「ファイルオープンした後に動作が停止する『みたい』です」「読み込む時にエラーになってるのではないのかと『思います』」「デバックのモード『みたいなもの』を使って確かめました」ってどういうこと? 「みたい」「思います」「みたいなもの」と, 相手に正確な情報が伝わらないような表現をなぜわざわざする?


とりあえず, 動作環境 (少なくとも OS とコンパイラ) の情報は出してください. それから, 実際にどのような操作をしてどのような出力が得られたのか, 「一字一句正確に」書いてほしい. それができて, ようやく「質問としての出発点」だ.

この回答への補足

すいません。
動作環境はwindows7でcygwinを使ってます。
コンパイラの情報はわかりません。

gcc ファイル名
でコンパイルは成功しました。
./a.exe
としたときに
segmentation fault (core dumped)
とでました。

デバックモードみたいなものとはオプションとして
-gdb
をつけて実行しました。
ファイルの読み込み時に実行停止しました。

望んでいる結果としては
1200A,1200Bのファイルを読み込み
ans1200のファイルに行列の積を結果として書き込む。
ということをしたいです。

補足日時:2010/12/22 17:38
    • good
    • 0

>fp1 = fopen("1200A.dat", "r");



ファイルオープンねに失敗しても突っ走るぜ!イェイ!!
とか、

>for(i=0;i<am;i++){

ループなんて実行しないぜ。うらぁ!!
ですか?

まぁ、既に書かれている通りスタック食いつぶすのが先っぽいですけど。
    • good
    • 0

ソースコードだけ貼り付けても何を聞きたいかわかりませんが、とりあえず



> #define MN 1200
> double A[MN][MN],B[MN][MN],C[MN][MN];

segmentation faultより先にstack overflowが出るんでは?
    • good
    • 0

…それで?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!