Fortran隐式更改类型

时间:2013-04-15 07:09:57

标签: fortran implicit-conversion implicit fortran77

我正在重新编写一些旧的Fortran代码(我认为是F77),用英特尔编译器编译。我以这种形式遇到了一些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中的值没有意义时。

我感到困惑:这些东西怎么能正常工作? 我怎样才能克服这个问题?

2 个答案:

答案 0 :(得分:2)

这种用于正确填充数据的转换可以使用Fortran 77中的EQUIVALENCE来完成。为实现相同目的,Fortran 95提供TRANSFER

wsave(iw2:) = transfer(some_integer_array, wsave)

接收数据不是问题,因为隐式接口只传递指针而不检查类型。如果你需要内部部分使用显式接口,你也可以使用相同的内部。

在现代代码中,只使用2个不同类型的不同数组,并远离这些技术。

答案 1 :(得分:1)

详细阐述了VF的答案 - 很可能cffti1使用该整数数组作为临时空间,因此在任何其他地方都不会访问这些值。即。您可能找不到(或需要)等效或转移语句。最高级别子程序的文档可能会说" wsave应声明为4n + 1,并且您希望在前2n值中返回结果"。

在这种情况下,现代化'您可以删除ifac参数并在子例程中分配临时空间的代码。我不愿意在没有真正详细研究代码的情况下做出这样的改变。

那说什么"问题"你有吗?您可能只需要关闭一些过于激进的类型检查。


编辑,在此处找到文档http://www.maths.bris.ac.uk/~marp/slatec/routin-j.htm

 WSAVE   a work array which must be dimensioned at least 4*N+15...

"工作阵列" - >> "刮空间" - >不要关心内容..