Gfortran复杂的实际虚拟参数

时间:2015-05-11 05:51:51

标签: fortran fft gfortran complex-numbers real-datatype

我正在尝试将fftpack与gfortran一起使用,但我得到的错误与我认为与虚拟参数被声明为真实时传递复杂数组有关。

我在intel fortran页面上阅读了评论,可以禁用“检查例程界面”。有谁知道gfortran是否有类似的选择?

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

[详细说明并满足评论......] 因此,在从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 个答案:

答案 0 :(得分: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 )