Fortran 避免数组索引的浮点和整数之间的隐式转换

Fortran 避免数组索引的浮点和整数之间的隐式转换,fortran,intel-fortran,Fortran,Intel Fortran,我正在寻找一种方法,当我在不应该使用实数的情况下使用实数时,强制Fortran编译器给出错误消息 比如说, Real :: i1,i2 Real :: A(1000,1000) , B(2000,2000) A(i1:i2,:) =B(i1:i2,1:1000) 我有一个这样的代码,我没有意识到我的i1和i2声明。 有时我会因此而遇到问题,直到我意识到这一点。很明显,Fortran进行了隐式转换,我更愿意被告知 Fortran编译器是否无法看到数组未被预期索引引用?Fortran语言规范要求

我正在寻找一种方法,当我在不应该使用实数的情况下使用实数时,强制Fortran编译器给出错误消息

比如说,

Real :: i1,i2
Real :: A(1000,1000) , B(2000,2000)

A(i1:i2,:) =B(i1:i2,1:1000)
我有一个这样的代码,我没有意识到我的i1和i2声明。 有时我会因此而遇到问题,直到我意识到这一点。很明显,Fortran进行了隐式转换,我更愿意被告知


Fortran编译器是否无法看到数组未被预期索引引用?

Fortran语言规范要求数组下标为(标量)整数表达式。此外,这是语言的一部分,要求有效的Fortran编译器能够检测并报告违反此约束的尝试

某些编译器会选择在默认情况下将实际数组索引的使用报告为错误。其他人可能会接受它作为扩展,并可能提供诊断警告。英特尔编译器(当前)默认默认接受此作为扩展。即使在没有进行诊断的情况下,也应该有一个选项来启用这种报告(使编译器符合Fortran规范)

对于ifort,选项
-stand

警告#6187:Fortran 2008在此上下文中需要整数数据类型


您甚至可以将其与
-diag error=6187
结合使用,将诊断升级为错误。

阅读您使用的特定编译器的文档。我使用或曾经使用过的所有编译器都有一些选项,告诉编译器在接受什么方面要相当严格。例如,使用gfortran,您可以执行
gfortran-std=f2003
来获得Fortran 2003语义,这将拒绝您的程序。在没有任何选项的情况下,gfortran只会发出关于扩展的警告。在这种情况下,Fortran不会进行隐式转换。事实上,Fortran明确禁止在这里使用实索引。从你的编译器标签上,我们可以假设你想知道如何让ifort抱怨吗?或者使用A(NINT(i1):NINT(i2)…编译器不抱怨有点奇怪,但是在过去的日子里你遇到了更多的问题,