今まで、Salford FTN77 を使用していたのですが、
この度、LINUXのg77でプログラムを動かすことになりました。
Salford FTN77で正常に動作していたのですが、g77では、実行時に「セグメント違反」が発生してしまいます。
現在わかっていることを列挙しますと…
・Salford FTN77では、問題なく動作する
・g77で、コンパイルまでは成功する
・Salford FTN77からの書き換えはおそらく成功(同種のプログラムで確認済み)
・プログラムをループ(=50)させているのですが、特定のループ回数(=13)でセグメントエラーになる。
・エラー前の計算は正しく行われている
・ループ回数(=10)を引き下げると実行可能になる
・ループ毎にファイルのcloseも行っている
・スタックを限界まで引き上げて実行したが、同様のエラーが発生
・特定のループ回数(=13)から、ある特定の変数(ここでは b)を、表示(write( , ) b )もしくは代入(a=b)しようとするとエラーが発生する。
・エラーが発生する直前までは、ある特定の変数(b)は正しく出力でき、値に異常もない。
元々、簡単な数値計算をおこなう程度にしかプログラムを扱っていない生粋の初心者です。
ネットでセグメントエラーについて検索し、手当たり次第試してみたのですが、うまくいかず困っています。
ソースは公開できないのですが、何か心当たりのある方は、回答していただけると嬉しいです。
よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
はっきり言わせてもらいますが, 「こんな質問内容で答えられる人はいない」と思ってください.
デバッガを使って追いかけるなり, 周囲のよく知っている人に聞くなりして自分で解決してください.
No.2
- 回答日時:
#1さんのと同意見ですね。
ソースをコンパイルしてみれば何か分かるかもしれませんが、「ソースは公開出来ない」と言うのでしたら、やっぱり分からない、としか言いようがないです。
セグメントエラーだ、って事なんで、詳細見るんだったらgdb辺り使ってトレースしてみるのが一番だ、と思います。GNUのFortranってのは確かフロントエンドだけ、なんで、背後は同じGCCでしょう。デバッガ使った方が手っ取り早い、と思いますよ。
gdbの使い方は以下のURLでも参考にしてください。
参考URL:http://www.fireproject.jp/feature/gdb/
No.3
- 回答日時:
fortranの場合は配列のオーバーフローですね。
writeはきっかけであって原因ではないと思います。
コンパイルオプション -g を付けて
コアダンプしたら gdb
ただしそこでエラー行の表示をさせるときっかけになった write を指してしまう。
やはりループ内で配列の index がどんどん繰り上(下)がってるところを見つけないと。
No.4
- 回答日時:
>>Salford FTN77では、問題なく動作する
ということですので、ソースは目で見た限りは、エラーが無いのでしょうね。
CやC++のマニュアルを読むと、CPUの相違から、「メモリの境界合わせ」問題でセグメントエラーが発生することがあるように書かれています。(「構造体の穴」なんて言われたりします。)
ただし、ループの処理で、この問題が発生することは少ないんですが、ロジックによっては発生することがあるかもしれませんね。
fortranは学生時代にちょっとやっただけなので、当たっているかどうか?ですが、構造体で、データのタイプにintやlongとcharの混在があると問題になりやすいです。
No.5
- 回答日時:
g77は久しく使っていませんが、参考になれば…。
コンパイルオプションに -fbounds-check を入れてみてはいかがでしょうか?
これで領域外参照は防げると思います。
g77のバージョンが古けなければ使えるはずです。
それと、implicit noneがプログラムに入っていなければ、宣言文の前に入れるかコンパイラオプション-Wimplicitを使ってください。
領域外参照の原因の一つに宣言してない変数の使用が考えられます。
gfortranの場合は-fimplicit-noneとなります。
以下のことは質問から多少ずれるかも知れませんが一言。
できれば、プログラムは自由形式で書いた方が良いと思います。
allocateやmoduleの機能はバッファオーバーランを予防してくれます。
>・特定のループ回数(=13)から、ある特定の変数(ここでは b)を、表示(write( , ) b )もしくは代入(a=b)しようとするとエラーが発生する。
もともとのプログラムにwrite文や式を代入すると、メモリ参照の手続きが変わるため、変数に代入されている値が変わることが多々あります。
デバグをするのであれば、gdbを使うことをお勧めします。
ただ、簡単なプログラムであればwrite文でいろいろな値を書き出すデバグ方法(いわゆるprintfデバグ)も強力な手段です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
C2146を回避するにはどうしたら...
-
win32api構造体引数の型指定に...
-
visual C++ でaruduinoとシリア...
-
レコードセットをcloseする所で...
-
適切な変換関数が存在しない???
-
入れ子になっている構造体配列...
-
BCC・stdio.h・_stddef.hのエラー
-
visual C++ でビルドの中止がで...
-
ビルドが失敗してしまいます
-
Excelのエラーで困ってます。
-
fortranでプログラムを実行する...
-
error C2143: 構文エラー の対処法
-
配列の初期化時に出たエラーの...
-
Visual Studioのstrcpy_sについて
-
Cabの解凍プログラム
-
Fortran コンパイルエラーについて
-
ビルド失敗 指定されたファイ...
-
不正なメモリ領域へのアクセス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
Excelのエラーで困ってます。
-
バッチからsqlplusの接続エラー...
-
fortranでプログラムを実行する...
-
HEWを使用しているのですが、こ...
-
コンパイルできません。
-
デバッグ中のエラーのことで教...
-
visual C++ でビルドの中止がで...
-
BC30002: 型 'ListItem' が定義...
-
Handlesについて
-
sys/time.hのインクルードがで...
-
ビルド失敗 指定されたファイ...
-
VB2008で定数に色の設定をした...
-
RightとLeft関数のライブ...
-
multiple definitionというエラー
-
WindowsからLinuxへの移植
-
HANDLEの宣言でのエラー
-
レコードセットをcloseする所で...
おすすめ情報