首页 文章

Gfortran复杂的实际到真正的虚拟参数

提问于
浏览
1

我试图使用fftpack与gfortran,但我得到的错误,我认为与虚拟参数被声明为真实时传递复杂数组的一些例程有关 .

我在intel fortran页面上阅读了一条评论,可以禁用“ check routine interface ” . 有谁知道gfortran是否有类似的选择?

我想不必编辑fftpack ...(我想这是因为内存中的复杂由两个实数表示,数组参数作为引用传递但如果我错了请纠正我:))

[详细说明并满足评论...]所以在从netlib下载dfftpack并作为独立文件编译(f77 I pressume)与同一文件中的所有子例程后,我得到一个警告,例如在

SUBROUTINE DFFTF (N,R,WSAVE)
   IMPLICIT DOUBLE PRECISION (A-H,O-Z)
   DIMENSION       R(1)       ,WSAVE(1)
   IF (N .EQ. 1) RETURN
   CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
   RETURN
   END

呼叫 CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1)) 时出现警告 . RFFTF1的开头看起来像这样......

SUBROUTINE RFFTF1 (N,C,CH,WA,IFAC)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION       CH(*)      ,C(*)       ,WA(*)      ,IFAC(*)

并且来自编译的警告命中实际参数 WSAVE(2*N+1) - 到伪参数 IFAC :(从代码::块构建日志窗口输出)

mingw32-gfortran.exe -Jobj\Debug\  -Wall -g     -c
 C:\... \dfftpack.f -o obj\Debug\dfftpack.o
 C:\... \dfftpack.f:345.40:
 CALL RFFTB1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))                   
                                   1 Warning: Type mismatch in argument 
'ifac' at (1); passed REAL(8) to INTEGER(4)

我认为这将导致不正确的结果..(传递一个真实到整数似乎不会转换/舍入到最接近的整数,但其他东西 . 有人知道它是否应该在调用中舍入,如: NINT(WSAVE(2*N+1))

1 回答

  • 1

    当我从FORTRAN 77重构FFTPACK 5.1到Fortran 2008时遇到了这个问题 . 我执行了C语言样式转换,没有复制如下:

    use ISO_C_binding, only: c_f_pointer, c_loc
    
    integer, parameter :: N = 42
    complex, target    :: c(N) ! Also works for the allocatable attribute
    real, pointer      :: r(:) => null()
    
    ! Pass memory address from complex array to real array
    call c_f_pointer(c_loc(c), r, shape=[2*size(c)])
    
    call procedure_expecting_real_arg(r, ....)
    
    ! Terminate association
    nullify( r )
    

相关问题