A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
segmentation faoultはメモリ参照ミスによるエラーです。
拡張無しのfortranの場合、一般的に
・配列の添え字の設定ミス
・ファイル入出力時の変数設定ミス
・共有common初期化にcommon配列を利用した時の次元数、要素数が合っていない
・計算型gotoや算術if文で飛び先行番号の数が足りない
・etc...
ポインタ型の拡張がある場合
・ポインタ変数の値が不正
まとめると「アプリケーションのワーク領域、プログラム領域以外のメモリ領域に対する参照」が発生した場合にsegmentation faultとなります。
これは、データ参照時にプログラム領域への参照が発生した場合に起こる処理系もあります。
極端な話、32ビットアドレスでinterger*4の配列の添え字に10億を与えると確実にsegmentation faultが発生します。
プログラムの内容、動作環境が不明なのでこれくらいしかわかりません。
この回答への補足
回答ありがとうございます。
しかしあまり詳しくないので僕にかいてあることがちょっとよくわかりません。
動作環境は
IBMのRS6000のバッチシステムを利用しています。
プログラムの内容は
研究で使うデータの並べ替えです。
どの部分でとまっているのかわかりましたが、その命令のどこが間違っているかわかりません。配列の添え字、dimensionも問題ありません。
とりあえず、今自分でわかる情報はこれくらいです。
No.2
- 回答日時:
下で専門家の方が的確な答えを出されているので、補足だけ。
現象よりも
1.何故そうなったか?
2.どこでそうなったか?
3.どうしたらいいか?
知った上で正常に動かしたいのでしょ?
1.は専門家も書かれているとおりです。
2.はバッチでもコンパイル時のオプション次第で、デバッガ相当のものを動かし、どういうサブルーチン(または関数)の呼び順でエラーになったか分かるはずです。しかし、メモリ-を破壊しよぼど変な落ち方をしている場合は、それも分からない場合があります。
3.2.でどこでエラーになっているか分かったらそこを修正します。場合によっては、落ちているのはその場所でも、別のところで悪さをした結果、巡り巡ってそこで落ちていることもあります。
メモリーの参照をミスっても「segmentation fault」になるとは限りません。つまり「他人の家」を壊すと怒られるし、壊せないようになっていますが、「自分の家」なら壊しても怒られないのです。「自分の家」でも命令部は壊れないようにする処理系もあったと思います。「他人の家」は壊すだけでなく、見ることも禁止されています。
能書きは兎も角、もし上の方法で分からないなら、ソースコードを丹念に見直してください。ごくまれにコンパイラやランタイムライブラリのバグである場合もありますが、99.9%間違いなくあなたのプログラムの間違いが原因です。
回答ありがとうございます。
コンパイラはIBM版AIX用fortranコンパイラを使ってます。デバッガ相当のオプションは今調べています。
止まってい部分はどうやらこの命令のようです。
do 35 j=1,512
do 35 i=5,512
nvr((i-4),sp(j))=elepr(i,j)
35 continue
配列の大きさ、整数、実数は大丈夫です。
この部分で止まっているようですが、この命令の前後で不具合があるのでしょうか?
プログラムの見直しは何度もしています。
No.3
- 回答日時:
プログラムを途中で切ってdatファイルに計算結果を書き出して、
期待した結果どおりに数値計算されているか確かめてみるのも
いいかも知れません。
(1)問題となっているdo文の前まででプログラムを切って
elepr(i,j)の値が正しいかwrite文で書き出してみる。
(2)問題となっているdo文自体を変えてちゃんと回っているか確かめる。
open(unit=2,file='test.dat',form='formatted')
do j=1,512
do i=5,512
nvr((i-4),sp(j))=elepr(i,j)
write(2,*)i,j,nvr((i-4),sp(j)),"/n"
end do
end do
close(unit=2)
回答ありがとうございます。
いろいろwrite文で書き出してみましたところ、do文でデータを読み込む際に指定した数だけデータを読み込んでいないことがわかりました。
しかし、なぜこのようになるかわかりません。
メモリーなどが関係しているのでしょうか?
何かわかることがあったら教えてください。
No.4
- 回答日時:
どうなんでしょう?たぶんプログラム文のミスだと思うのですが。
約500×500くらいの情報量なら、g77(Debian:Linux)の駄目コンパイラーでもうちの駄目PCで一日くらいかければ計算できますが。。
(1)spはintegerになっているか確かめる。
(2)何行何列までは計算値がでているか見てみる。
(3)配列宣言で、nvr(1:508,[ここはspの整数値]),elepr(1:512,1:512)
としておくと変数のなかの行列は指定された整数値が使えます。
(4)nvr(1,sp(1))=elepr(1,5)という計算がなされているがそれは
自分のしたい計算なのかどうか?elepr(1,1)などは計算に関係しないが
それは自分がやりたいことと合っているのかどうか?
(5)計算のかかる部分はsublutineにした方が計算速度はあがる
(6)実数変数の中の整数値は6.かfloat(6)などにしていないと計算が飛ぶ可能性がある
ということを試してみてどうでしょうか?回りませんか?
eleprの値はちゃんと出ているんですよね?
この回答への補足
dimensionのサイズを倍にしてみたら計算が動きだしました。
今までぎりぎりでやっていたのですが・・・・
dimensionに余裕を持たせないとfortranはダメなものなんでしょか?
再び回答ありがとうございます。
(1)は確認してOKです
(4)は自分のやりたい計算です
(6)は直しましたが駄目です
(2)より
read文で1024個データを読み込む部分が599個しか読み込んでいません。ほかでのreadでは26万個近く読み込むはずが18万個程度のデータしか読み込んでいない状況というのがわかりました。
何かわかることありますか?
No.5
- 回答日時:
dimensionに余裕を持たせないとfortranはダメなんてことはないですよ。
suppercomputerで計算させるときのプログラムはfortranなので。逆にプログラムのどこかで、指定の配列をオーバーして計算をさせていたということは考えられます。お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- C言語・C++・C# プログラム Arduino 1 2022/07/03 11:13
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- Windows 10 Windows Updateの更新ができない場合に初期化 3 2023/01/18 20:00
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- 工学 このvhdのプログラムで50行目で エラーが出るのですがなぜでしょう?見当もつきません。わかる方教え 2 2022/11/02 22:36
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- その他(プログラミング・Web制作) invalid character in identifier 2 2022/07/18 10:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
傾いた四角形内の範囲の条件式
-
65536は2の何乗なのでしょうか?
-
60進数の四則計算
-
モジュラス103の計算とは何でし...
-
再帰呼び出しの計算量
-
Windows のlog()の計算方法
-
ReportViewerのテキストボック...
-
C言語で N行*M列 の逆行列を求...
-
CRC8を教えてください
-
EXCELなどで「返す」という表現
-
VBAの再計算が反映されない件に...
-
C# 計算処理中に実行中ウィン...
-
VBAでの勤務時間計算
-
排他的論理和 BCC(水平パリテ...
-
VBとVBAの違い
-
VBA 九九 Do While
-
pythonによる日の出日の入り計算
-
数値計算の高速化 (cos, sin, exp)
-
SNRの計算の仕方
-
Perlで時間の計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
モジュラス103の計算とは何でし...
-
EXCELなどで「返す」という表現
-
バッチファイルでウインドウを...
-
VBAでの勤務時間計算
-
数値計算の高速化 (cos, sin, exp)
-
C# 計算処理中に実行中ウィン...
-
変化させるセルが変化しない
-
VBとVBAの違い
-
CRC8を教えてください
-
引き放し法による除算アルゴリ...
-
傾いた四角形内の範囲の条件式
-
タクシー料金の問題です
-
C言語についてです。 再帰を使...
-
CとFORTRANの計算速度はどちら...
-
VB6で正確なミリ秒を計測したい...
-
Date型の範囲を超える数値について
-
電卓でmodの計算
おすすめ情報