我正在修改一些旧的 Fortran 代码(我想是 F77),用 Intel 编译器编译。我遇到了一些这种形式的 SLATEC 例程:
subroutine cffti (n,wsave)
dimension wsave(1)
iw1 = n+n+1
iw2 = iw1+n+n
call cffti1 (n,wsave(iw1),wsave(iw2))
return
end subroutine cffti
subroutine cffti1 (n,wa,ifac)
....
....
end subroutine cffti
Wsave 是一个数组,它的第一部分应该存储浮点数,而第二部分(来自 iw2)存储整数。
所有变量都是隐式的,因此当 wsave(iw2) 传递给 ifac 时,会被解释为整数,而 ifac 中的值没有意义。
我很困惑:所有这些东西怎么能正常工作?
我该如何克服这个问题?
最佳答案
这种正确填充数据的转换可以使用 EQUIVALENCE
来完成。在 Fortran 77 中。Fortran 95 提供 TRANSFER
出于同样的目的。
wsave(iw2:) = transfer(some_integer_array, wsave)
接收数据不是问题,因为隐式接口(interface)只传递指针而不检查类型。如果您需要内部使用显式接口(interface),您也可以在内部使用相同的接口(interface)。
在现代代码中,只需使用 2 个不同类型的不同数组,并远离这些技术。
关于Fortran 隐式更改类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16009528/