module - Fortran:固定形式源中的整个数组操作

标签 module segmentation-fault fortran

我一遍又一遍地收到“段错误”错误,同时使用我的子例程(我已将它们全部放在 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

最佳答案

扩展一下我已经过长的评论:

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

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

现代 Fortran 的优势之一,尤其是 modules是您可以免费进行过程接口(interface)检查,编译器会在编译时检查虚拟参数和实际参数是否匹配。

所以我不认为你的问题直接源于以固定源代码形式编写现代 Fortran。但我确实认为以固定源代码形式编写现代 Fortran 以避免重写您的 makefile 并避免升级某些 FORTRAN77 是一种非常不正当的事件,您会发现它在短期内很痛苦,从长远来看会后悔你继续开发退化的代码。

正视它,现在重构。

关于module - Fortran:固定形式源中的整个数组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956834/

相关文章:

c - 如何从内核模块打开/写入/读取 uart 设备?

python - 我不明白python日志模块如何读取其执行代码

c++ - boost 文件系统中的段错误?

fortran - 向 Fortran 程序添加声音

list - Fortran:如何在模块中赋值

Fortran READ(*,*), WRITE(*,*) 参数

无法从 C 程序安装某些驱动程序模块

.net - 为什么模块中的这个公共(public)函数无法访问

c - Valgrind C : Accessing by reference and unitialized value

c++ - 合并排序 - 段错误