• 締切済み

FORTRAN: WIN SalfordFTN77 → LINUX g77 (セグメントエラー)

今まで、Salford FTN77 を使用していたのですが、 この度、LINUXのg77でプログラムを動かすことになりました。 Salford FTN77で正常に動作していたのですが、g77では、実行時に「セグメント違反」が発生してしまいます。 現在わかっていることを列挙しますと… ・Salford FTN77では、問題なく動作する ・g77で、コンパイルまでは成功する ・Salford FTN77からの書き換えはおそらく成功(同種のプログラムで確認済み) ・プログラムをループ(=50)させているのですが、特定のループ回数(=13)でセグメントエラーになる。 ・エラー前の計算は正しく行われている ・ループ回数(=10)を引き下げると実行可能になる ・ループ毎にファイルのcloseも行っている ・スタックを限界まで引き上げて実行したが、同様のエラーが発生 ・特定のループ回数(=13)から、ある特定の変数(ここでは b)を、表示(write( , ) b )もしくは代入(a=b)しようとするとエラーが発生する。 ・エラーが発生する直前までは、ある特定の変数(b)は正しく出力でき、値に異常もない。 元々、簡単な数値計算をおこなう程度にしかプログラムを扱っていない生粋の初心者です。 ネットでセグメントエラーについて検索し、手当たり次第試してみたのですが、うまくいかず困っています。 ソースは公開できないのですが、何か心当たりのある方は、回答していただけると嬉しいです。 よろしくお願いします。

みんなの回答

  • nineexit
  • ベストアンサー率100% (8/8)
回答No.5

g77は久しく使っていませんが、参考になれば…。 コンパイルオプションに -fbounds-check を入れてみてはいかがでしょうか? これで領域外参照は防げると思います。 g77のバージョンが古けなければ使えるはずです。 それと、implicit noneがプログラムに入っていなければ、宣言文の前に入れるかコンパイラオプション-Wimplicitを使ってください。 領域外参照の原因の一つに宣言してない変数の使用が考えられます。 gfortranの場合は-fimplicit-noneとなります。 以下のことは質問から多少ずれるかも知れませんが一言。 できれば、プログラムは自由形式で書いた方が良いと思います。 allocateやmoduleの機能はバッファオーバーランを予防してくれます。 >・特定のループ回数(=13)から、ある特定の変数(ここでは b)を、表示(write( , ) b )もしくは代入(a=b)しようとするとエラーが発生する。 もともとのプログラムにwrite文や式を代入すると、メモリ参照の手続きが変わるため、変数に代入されている値が変わることが多々あります。 デバグをするのであれば、gdbを使うことをお勧めします。 ただ、簡単なプログラムであればwrite文でいろいろな値を書き出すデバグ方法(いわゆるprintfデバグ)も強力な手段です。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.4

>>Salford FTN77では、問題なく動作する ということですので、ソースは目で見た限りは、エラーが無いのでしょうね。 CやC++のマニュアルを読むと、CPUの相違から、「メモリの境界合わせ」問題でセグメントエラーが発生することがあるように書かれています。(「構造体の穴」なんて言われたりします。) ただし、ループの処理で、この問題が発生することは少ないんですが、ロジックによっては発生することがあるかもしれませんね。 fortranは学生時代にちょっとやっただけなので、当たっているかどうか?ですが、構造体で、データのタイプにintやlongとcharの混在があると問題になりやすいです。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.3

fortranの場合は配列のオーバーフローですね。 writeはきっかけであって原因ではないと思います。 コンパイルオプション -g を付けて コアダンプしたら gdb ただしそこでエラー行の表示をさせるときっかけになった write を指してしまう。 やはりループ内で配列の index がどんどん繰り上(下)がってるところを見つけないと。

回答No.2

#1さんのと同意見ですね。 ソースをコンパイルしてみれば何か分かるかもしれませんが、「ソースは公開出来ない」と言うのでしたら、やっぱり分からない、としか言いようがないです。 セグメントエラーだ、って事なんで、詳細見るんだったらgdb辺り使ってトレースしてみるのが一番だ、と思います。GNUのFortranってのは確かフロントエンドだけ、なんで、背後は同じGCCでしょう。デバッガ使った方が手っ取り早い、と思いますよ。 gdbの使い方は以下のURLでも参考にしてください。

参考URL:
http://www.fireproject.jp/feature/gdb/
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

はっきり言わせてもらいますが, 「こんな質問内容で答えられる人はいない」と思ってください. デバッガを使って追いかけるなり, 周囲のよく知っている人に聞くなりして自分で解決してください.

関連するQ&A

  • セグメントエラー

    Cプログラムを実行した時に発生する、セグメントエラー は何が原因なのでしょうか? コンパイルはちゃんとととっているのに、 なぜエラーがでるのでしょうか? C言語の本を見たのですが、 のってません。 お願いします。

  • Fortran90/Fortran95→Fortran77

    大学の授業でFortranを使ったプログラミングを勉強しています。 以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます) 大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^; 家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい) Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです 前置きが長くなりましたが、エラーが出る文は以下のところです open(8,file='freq_ex13.dat',action='write',status='replace') ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

  • c++ セグメントエラー

    あるプログラムをつくっていて、コンパイルはできたのですが、セグメントエラーというランタイムエラーが取り除けません。 エラーの発生している行は特定できました。 その行は、以下のようなものです。 AAA aaa[4][64][4]; AAAは型名、aaaは配列名です。3次元配列の宣言でエラーが発生していました。 エラーの発生している行はこの行で、代入などを行っている部分ではありません。配列の大きさを考えてみても、メモリが足りなくなっているとは考えづらいのですが、他になにか原因はあるのでしょうか? 考えられる原因を教えてください。

  • FortranプログラムからC言語で実装された関数を呼ぶには?

    Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか? ユーザーガイドによれば、「Fortranプログラム中に、C_EXTERNALという宣言をした関数は、Cの関数と同じくアクセスできるようになり、C側では、#extern <返り値>関数名(引数)を与えれば、Cの関数として呼び込むことができる。」とのことがかかれています。 実際に使っているファイルをいくつか書き出します。 <D:\fortran\sample.f> C_EXTERNAL WRITE 'WriteFile' : INTEGER*4 INTEGER*4 RESULT RESULT=WRITE() write(*,*) result return end <D:\fortran\sample.c> #extern int Writefile(int); <C:\Program Files\Silverfrost\FTN95\ftn95c.bat> ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 /link ちなみに、「Cpad for Salford FTN77」での実行/設定/実行/コンパイル時のパラメータは「/link /dreal」です。もちろんftn95.exeへのパスは通してあります。何が問題でしょうか? 何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

  • FORTRANコンパイル時について

    土木の設計でFORTRANで書かれたプログラムを使用しているのですが,コンパイルする際に下記内容のエラー(?)が出ていますが,コンパイル自体は完了しています。 これって何かオカシイのでしょうか。 ■C:\Documents and Settings\ETP5\デスクトップ\programs_2D> ftn77 /link elastc.f [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998] Licensed to: FTN77 Personal Edition Department: Non-commercial use only 0130) END COMMENT - STXY has not been used COMMENT - SSIY has not been used COMMENT - SSIX has not been used NO ERRORS,3 COMMENTS [<ELASTC2D>FTN77 Ver 4.03] NO ERRORS [<DATA_IN>FTN77 Ver 4.03] NO ERRORS [<FIX>FTN77 Ver 4.03] NO ERRORS [<INIT>FTN77 Ver 4.03] NO ERRORS [<CALC_SIG>FTN77 Ver 4.03] 0391) IF((TK(K,I-K+1).EQ.0.D0).OR.(X(K).EQ.0.D0)) GOTO 2 WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results NO ERRORS,2 WARNINGS [<LEQ>FTN77 Ver 4.03] NO ERRORS [<LEQ1>FTN77 Ver 4.03] NO ERRORS [<MAKE_GAMX>FTN77 Ver 4.03] NO ERRORS [<CALC_TF>FTN77 Ver 4.03] NO ERRORS [<MAKE_TK>FTN77 Ver 4.03] NO ERRORS [<WRITE_SUB>FTN77 Ver 4.03] Creating executable: elastc.exe 宜しくお願い致します。

  • FortranのG95コンパイルエラー

    お世話になります。 先日業務の参考に技術書を購入しました。 その技術書には計算するためのFotranのソースプログラムが付属されており、それを実行するためコンパイラのG95をインストールしました。 ですがコンパイルを実行すると以下のエラーが出てしまいます。 c:/g95/bin/../lib/gcc-lib/i686-pc-mingw32/4.1.2//libf95.a(main.o):(.text+0x32):undefined reference to `_MAIN_' このエラーをグーグルで「libf95.a(main.o)」をキーワードに調べてみましたが英語のページに当たり、まるで理解できませんでした。 G95は技術書の付属CDに入っていたので出来るはずなのですが。 このエラーの原因をご存知の方がいらしたらよろしくお願いします。 [追記] OSはXPのSP3です。

  • SolarisとLinuxのグローバル変数の扱いについて

    Solaris用のソースをLinuxで使えるように変更したいのですが、 グローバル変数について以下のようなことが発生していて困っています。 なにか、コンパイルオプションなどで対応はできないものでしょうか? Solaris (CC)では 特にextern宣言しなくても同じシンボルの外部変数はコモンセグメントに1つだけ作成しコンパイル自体は正常である。 しかし、Linux (g++)では externを宣言しないと同じシンボルを再定義したことになりエラーとなる。 これにより、グローバル変数を多用しているプログラムはLinuxでうまくコンパイルができない。 しかし、単純にextern宣言での対応は難しい。 extern宣言は外部で定義してあるグローバル変数を参照する というものだがLinux では 1つの定義を意外は全てexternしなければ、2重定義エラーになってしまう。 つまり、実体が1つであとはそれを参照しているという形でなければいけない。 ところが、その実体をどこにするか特定することができない。 例えば、gというグローバル変数を仮定する。 A.c,B.c,C.cはその3つのソースよりAA.aという静的ライブラリを構成する。 gはA.cで定義してありB.c,C.cはそれを参照する。 ところが C.cは個別にC.oというオブジェクトで他からの呼び出しがあり 別LMにリンクされる。 その時C.c内のgは実体を失うことになり未定義となる。 つまり、どれが実体になるかは何にリンクするかで決まるため 実態を特定できない。 また、共通のヘッダにグローバル変数が定義されている場合も、重複するというエラーを起こすため、 共通ヘッダからグローバル変数を分離し、何れかのソースにグローバル変数の実態を定義させる必要がある。 共通ヘッダを使っている他のソースはそのグローバル変数の実態を参照するようにexternの宣言をする。

  • データ・BSS セグメントが分かれている理由

    実行可能プログラムのデータ領域に データセグメントと BSS セグメントがありますが、 初期値が設定されているかどうかでこれら 2 つを分ける理由がいまいちわからず悩んでいます。 下記ページを見ると、 「初期値のある変数の場合、初期値を実行ファイルに書き込んでおく必要があるのに対し、 初期値のない変数は実行ファイルに書き込んでおく必要がない」 と書かれているのですが、どうも 「初期値のない変数は実行ファイルに書き込んでおく必要がない」 についてよくわかっていません。 どなたか補足いただけると嬉しいです。よろしくお願いします block started by symbol - 辞書にない英語 - livedoor Wiki(ウィキ) http://wiki.livedoor.jp/yushinhozumi/d/block%20started%20by%20symbol .bss - Wikipedia http://ja.wikipedia.org/wiki/.bss

  • ftn77のコンパイルエラー

    ftn77でfortranのプログラムをコンパイルしたところ、 文字情報のみでテストしたらコンパイルに成功したのですが、 数値計算の入ったものをコンパイルしたら、 実行時に以下のようなエラーが起こりました。 ーーーーーーーーーーーーーーーーーーーーーーーー RUN-TIME ERROR 00401000 main [+00c5] [recur= 1] メッセージ WARNING the following symbols are missing: IMAG C:\fortran\(ファイル名).obj (C:\FORTRAN\(ファイル名).FOR) ーーーーーーーーーーーーーーーーーーーーーーーーー 元々別のパソコンでコンパイルが成功したものを、 まったく書き換えずにftn77でコンパイルしてみたのにもかかわず、 UNTIME EROORと表示されました。 原因が何か分からないので、どなたか教えてください。 ちなみに10行程度の単純なプログラムなら、数値計算をしてもエラーは怒りませんでした。

  • 10gで動いていたSELECT文が11gでエラー

    お世話になります。 10gR2データベースで動かしていたPL/SQLプログラム内の、とあるSELECT文が、11gR2環境ではエラーが発生してしまい、動きません。 そのSELECT文をそのまま掲載するのは難がありますので、初期サンプルDBでも動くSELECT文に直したものを掲載させて頂きます。 (本物のSELECT文と同じ構文であることに重点を置いているため、掲載するSELECT文の意味不明さは無視して頂ければ幸いです) ----------- 10g環境:Database10g Enterprise Edition 10.2.0.1.0 11g環境:Database11g Enterprise Edition 11.1.0.6.0 10g:まったく問題なく動作する 11g:エラー(下記エラーメッセージ) 行2でエラーが発生しました。 ORA-03113:通信チャネルでend-of-fileが検出されました。 SELECT文: SELECT A.LAST_NAME FROM (EMPLOYEES A FULL OUTER JOIN DEPARTMENTS B ON (A.DEPARTMENT_ID = B.DEPARTMENT_ID AND ((A.SALARY >11000 AND COMMISSION_PCT IS NULL) OR B.MANAGER_ID = 100))); ----------- エラー番号をインターネットで調べるとオラクルサポートに連絡しなければならないようもののようですが・・・接続や通信関係ではなく、オプティマイザや実行計画に問題がある(仕様変更?)のではないかと思います。 結合内の追加条件を外に出し、SELECT文本体のWHERE句に移動すると動きますが、この現象の原因をご存知の方、ご教示いただければ幸いです。

専門家に質問してみよう