Fortran 隐式更改类型

标签 fortran implicit-conversion implicit fortran77

我正在修改一些旧的 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/

相关文章:

scala - 为什么不能优化这种隐式转换的情况?

python - 在 Python C API 代码中引发异常并停止执行

format - 将 REAL 的数组行转换为逗号分隔的字符串

c++ - 仅针对二元运算符防止隐式转换运算符

c++ - gcc 是否将 uint8_t 转换为单个值的 int?

mysql - SQL 中 IMPLICIT JOIN 的目的是什么?

c++ - 使用 COMMON 语句编译 C++(包括 Fortran 库)

optimization - 为什么打开 gfortran 编译器优化后 matmul 变慢?

c++ - 在 vector 构造函数中从 initializer_list<const char*> 转换为 initializer_list<string>

从 Integer#times 内调用的 Ruby yield 不返回评估 block