4

固定形式ソースで記述されたコード (fortran77 日間) でサブルーチン (すべてを MODULE に入れました) を使用しているときに、「Segmentation Fault」エラーが何度も発生します。

元の make ファイル (Linux プラットフォーム) はめちゃくちゃで、".f" ソースしかコンパイルしないので、ファイルの拡張子を ".f90" から ".f" に変更する必要があり、最初の 7 列を空白のままにしました。私のモジュール。私のモジュールは、配列全体の操作と配列セクションでの操作を広く使用しており、F90 スタイルで変数を宣言しています。それらの多くは想定サイズの配列です。

私の質問:-コンパイラーはこれらのモジュール (配列全体/配列セクション操作を持つ) を警告/エラーなしでコンパイルしますが、配列全体/配列セクション操作を持つモジュールの使用によるこの「セグメンテーション違反」です ( .f ファイルに保持されます) レガシー コードで?

たとえば、「algebra.f」モジュールに次のコードを記述しました。

    function dyad_vv(v1,v2)     !dyadic product of two vectors
    real*8, dimension(:)::v1,v2
    real*8, dimension(size(v1,1),size(v2,1))::dyad_vv
    integer i,j
    do i=1,size(v1,1)
    do j=1,size(v2,1)
    dyad_vv(i,j)=v1(i)*v2(j)
    end do 
    end do
    end function
    !==================================        
    function dot_mv(m,v)   !dot product of a matrix and a vector
    real*8, dimension(:,:)::m
    real*8, dimension(:)::v
    real*8, dimension(size(m,1))::dot_mv
    integer i,j
    do i=1,size(m,1)
    dot_mv(i)=0.0000D0
    do j=1,size(v,1)
    dot_mv(i)=dot_mv(i)+m(i,j)*v(j)
    end do 
    end do        
    end function
    !==================================        
    function dot_vm(v,m)  !dot product of a vector and a matrix
    real*8, dimension(:)::v
    real*8, dimension(:,:)::m
    real*8, dimension(size(m,2))::dot_vm
    integer i,j
    do i=1,size(m,2)
    dot_vm(i)=0.0000D0
    do j=1,size(v,1)
    dot_vm(i)=dot_vm(i)+v(j)*m(j,i)
    end do 
    end do                
    end function
4

1 に答える 1

4

私のすでに長すぎるコメントを少し拡張するには:

Fortran プログラムでのセグメンテーション違反は、通常、(a) 配列の範囲外の配列要素にアクセスしようとするか、(b) 手続きの実引数と仮引数の不一致が原因で発生します。

幸いなことに、コンパイラを賢く使用すると、これらの両方の状況を特定するのに役立ちます。(a) の場合は実行時の配列境界チェックをオンにする必要があり、(b) の場合はコンパイル時のサブルーチン インターフェイス チェックをオンにする必要があります。どのフラグを設定する必要があるかは、コンパイラのマニュアルに記載されています。

現代の Fortran の利点の 1 つは、特にmodulesプロシージャ インターフェイス チェックを無料で利用できることです。コンパイラは、コンパイル時に、仮引数と実引数の一致をチェックします。

したがって、あなたの問題が、最新の Fortran を固定ソース形式で記述したことに直接起因するとは思いません。しかし、makefile の書き直しや一部の FORTRAN77 のアップグレードを回避するために固定ソース形式で最新の Fortran を作成することは、短期的には苦痛であり、長期的には後悔する、十分にひねくれた活動だと思います。劣化したコードを開発し続けます。

それに直面して、今すぐリファクタリングしてください。

于 2012-12-19T17:23:40.170 に答える