避免数组索引的浮点数和整数之间的隐式转换
Avoid implicit conversion between float and integer for an array index
我正在寻找一种方法,当我在不应该使用实数的情况下使用实数时,强制 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
:
warning #6187: Fortran 2008 requires an INTEGER data type in this context.
您甚至可以将其与 -diag-error=6187
结合使用以将诊断升级为错误。
我正在寻找一种方法,当我在不应该使用实数的情况下使用实数时,强制 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
:
warning #6187: Fortran 2008 requires an INTEGER data type in this context.
您甚至可以将其与 -diag-error=6187
结合使用以将诊断升级为错误。