- ベストアンサー
セグメンテーションエラーが発生する行列の積計算プログラム
- C言語で行列の積の計算を行うプログラムで、セグメンテーションエラーが発生しています。
- プログラムは1200x1200の行列Aと行列Bを読み込み、行列の積を計算しています。
- 計算結果は1200x1200の行列Cとしてans1200C.datに出力されます。
- みんなの回答 (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等の整数型を使う方がよいです。
その他の回答 (6)
- trapezium
- ベストアンサー率62% (276/442)
既に書かれてるけど、fopen() に失敗すれば fscanf() や fclose() に NULL ポインタ渡すから、簡単に segmentation fault するよ。 だからエラーチェックはちゃんとやろうぜ。 > fp1 = fopen("1200A.dat", "r"); if (fp1 == NULL) { perror("1200A.dat"); exit(1); }
- m0r1_2006
- ベストアンサー率36% (169/464)
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; とかにした方が良いんでないの?
- Tacosan
- ベストアンサー率23% (3656/15482)
「ファイルオープンした後に動作が停止する『みたい』です」「読み込む時にエラーになってるのではないのかと『思います』」「デバックのモード『みたいなもの』を使って確かめました」ってどういうこと? 「みたい」「思います」「みたいなもの」と, 相手に正確な情報が伝わらないような表現をなぜわざわざする? とりあえず, 動作環境 (少なくとも OS とコンパイラ) の情報は出してください. それから, 実際にどのような操作をしてどのような出力が得られたのか, 「一字一句正確に」書いてほしい. それができて, ようやく「質問としての出発点」だ.
補足
すいません。 動作環境はwindows7でcygwinを使ってます。 コンパイラの情報はわかりません。 gcc ファイル名 でコンパイルは成功しました。 ./a.exe としたときに segmentation fault (core dumped) とでました。 デバックモードみたいなものとはオプションとして -gdb をつけて実行しました。 ファイルの読み込み時に実行停止しました。 望んでいる結果としては 1200A,1200Bのファイルを読み込み ans1200のファイルに行列の積を結果として書き込む。 ということをしたいです。
- Wr5
- ベストアンサー率53% (2173/4061)
>fp1 = fopen("1200A.dat", "r"); ファイルオープンねに失敗しても突っ走るぜ!イェイ!! とか、 >for(i=0;i<am;i++){ ループなんて実行しないぜ。うらぁ!! ですか? まぁ、既に書かれている通りスタック食いつぶすのが先っぽいですけど。
- D-Matsu
- ベストアンサー率45% (1080/2394)
ソースコードだけ貼り付けても何を聞きたいかわかりませんが、とりあえず > #define MN 1200 > double A[MN][MN],B[MN][MN],C[MN][MN]; segmentation faultより先にstack overflowが出るんでは?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
…それで?
補足
an,am,bn,bmはint型の宣言が正しいですね。 an,am,bn,bmには1200の値をいれるつもりでした。 stackエラーになってるのではなく、ファイルオープンした後に動作が停止するみたいです。 読み込む時にエラーになってるのではないのかと思います。 ↑デバックのモードみたいなものを使って確かめました。