固定形式ソースで記述されたコード (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