我对Fortran相当新,我无法理解为什么子程序在编译时静态定义的矩阵正常工作,但不适用于在运行时使用allocate
创建的类似矩阵
就我所知,矩阵应该非常相似:相同的类型,大小,sizeof和值。问题不在于这个具体的例子,而在于它们为什么以及什么时候会有不同的行为。
A'最低'工作示例at pastebin(updated here!),以及我认为这里必不可少的部分:
! static 'allocation'
real(dp), dimension(fN, fN) :: fH
! static call
call ZHPADM(pade_deg, fN, dt, fH, fN, fwsp, flwsp, fipiv, iexph, ns, f)
! dynamic allocation
real(dp), allocatable, dimension(:, :) :: dH
allocate(dH(dN, dN))
! dynamic call
call ZHPADM(pade_deg, dN, dt, dH, dN, dwsp, dlwsp, dipiv, iexph, ns, f) ! full dynamic call
call ZHPADM(pade_deg, fN, dt, dH, fN, fwsp, flwsp, fipiv, iexph, ns, f) ! only fH->dH to show that it is the matrix that causes the error
使任何其他(0D / 1D)参数动态工作正常。例程为ZHPADM from expokit,错误为Program received signal 8 (SIGFPE): Floating-point exception.
,但如上所述,首选一般说明。
编辑1 :我忘了提一些信息,对不起!使用所有相关参数dynamic调用ZHPADM
会产生相同的错误。我只是将一些改回静态来表明它是动态的矩阵导致问题。由于这一点,接近尾声的几行变得不一致,抱歉。静态和动态变量的值是相同的。
编辑2 :新的pastebin中的第77行发生异常,动态ZHPADM调用(注释该行停止异常)。我在Ubuntu上使用gfortran 4.6.3就像这个gfortran demo.f90 -lexpokit -lblas -llapack
(通常是一些警告标志)。
答案 0 :(得分:1)
在ZHPADM
的动态调用中,您按fN
的顺序传递H
,但您只分配了dN
个项目。如果fN .ne dN
程序可能对未分配的内存位置执行某些操作,从而导致未定义的行为。