我一遍又一遍地收到“分段错误”错误,同时使用我的子例程(我已将它们全部放在 MODULE 中)和以固定格式源编写的代码(在 fortran77 天内)。
原来的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