首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gfortran复杂的实证性论证

Gfortran复杂的实证性论证
EN

Stack Overflow用户
提问于 2015-05-11 05:51:51
回答 1查看 879关注 0票数 1

我试图在gfortran中使用fftpack,但我认为与此相关的错误是,当虚拟参数声明为the时,某些例程被传递为复杂数组。

我在一个英特尔fortran页面上读到一条评论,它可以禁用"check例程接口“。有没有人知道gfortran是否有类似的选择?

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

详细说明并接受评论..。因此,在从netlib下载dfftpack并将其编译为独立文件(f77,我预先假定)之后,在同一个文件中包含所有子程序后,我会收到一个警告,例如

代码语言:javascript
复制
   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的开头是这样的.

代码语言:javascript
复制
SUBROUTINE RFFTF1 (N,C,CH,WA,IFAC)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION       CH(*)      ,C(*)       ,WA(*)      ,IFAC(*)

编译的警告会击中实际的参数WSAVE(2*N+1) -到虚拟参数IFAC:(代码::块构建日志窗口的输出)

代码语言:javascript
复制
 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))

EN

回答 1

Stack Overflow用户

发布于 2016-07-16 17:38:56

当我将FFTPACK5.1从FORTRAN 77转换到Fortran 2008时,我遇到了这个问题。我执行了C语言样式的强制转换,没有复制如下所示:

代码语言:javascript
复制
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 )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30160456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档