我试图在gfortran中使用fftpack,但我认为与此相关的错误是,当虚拟参数声明为the时,某些例程被传递为复杂数组。
我在一个英特尔fortran页面上读到一条评论,它可以禁用"check例程接口“。有没有人知道gfortran是否有类似的选择?
我不想编辑这个文件.(我猜这是因为内存中的复杂由两个reals表示,数组参数作为引用传递,但如果我错了,请纠正我:)
详细说明并接受评论..。因此,在从netlib下载dfftpack并将其编译为独立文件(f77,我预先假定)之后,在同一个文件中包含所有子程序后,我会收到一个警告,例如
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))
发布于 2016-07-16 17:38:56
当我将FFTPACK5.1从FORTRAN 77转换到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 )https://stackoverflow.com/questions/30160456
复制相似问题