Fortran:固定格式源中的整个数组操作

时间:2012-12-19 16:31:02

标签: module segmentation-fault fortran

我一遍又一遍地收到“Segmentation Fault”错误,同时使用我的子程序(我已将所有这些程序放在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

1 个答案:

答案 0 :(得分:4)

稍微扩展我已经过长的评论:

Fortran程序中的分段错误通常来自(a)尝试访问数组边界外的数组元素,或(b)不匹配的过程实际参数和伪参数。

幸运的是,智能地使用编译器可以帮助您发现这两种情况。对于(a),您需要打开运行时数组边界检查,对于(b),您需要打开编译时子程序接口检查。您的编译器手册将告诉您需要设置哪些标志。

现代Fortran的一个优点,特别是modules的优点是,您可以按原样检查的程序接口,编译器在编译时会仔细检查虚拟和实际参数匹配。

所以我认为你的问题并不直接源于以固定源形式编写现代Fortran。但我确实认为以固定源形式编写现代Fortran以避免重写你的makefile并避免升级一些FORTRAN77是一个充分反常的活动,你会发现它在短期内很痛苦,并且从长远来看它很遗憾你继续开发降级代码。

正视它,现在重构。