使用gfortran编译时,是否可以使用实数作为迭代器和数组索引?以下是一些示例代码:
program test
real i
real testarray(5)
testarray = 0.
do i=1,5
write(*,*) testarray(i)
end do
end program
我想运行一些我没写过的代码。它在windows上使用intel编译器编译很好,但是我想用gfortran编译器在linux中编译并运行它。我目前正在使用实数作为数组索引获取错误并执行循环迭代器。
谢谢!
答案 0 :(得分:2)
为什么要将实数用作数组和循环索引?
如果您需要使用索引的实际值,请执行以下操作:
program test
integer i
real testarray(5)
testarray = 0.
do i=1,5
testarray(i) = REAL(i)
end do
end program
当然,如果你需要,你可以走向另一个方向,
integer j
do j = 1, INTEGER(testarray(1))
...
end do
例如,。该标准不允许非整数索引。它们也没有意义 - 数组中的1.5索引是什么?
如果使用--std=gnu
进行编译,那么真正的数组索引似乎是extension。但对此的支持并不总是存在,因为它不是标准的一部分。
答案 1 :(得分:2)
如果您不想看警告,请尝试使用--std = legacy。否则“gnu”,如已经建议的那样。 gfortran手册指出:
作为扩展,GNU Fortran允许使用REAL表达式或 变量作为数组索引。
和
std的默认值是'gnu',它指定了。的超集 Fortran 95标准,包括所支持的所有扩展 GNU Fortran,虽然会针对过时的扩展发出警告 不建议在新代码中使用。 “遗留”价值是等价的 但没有过时扩展的警告,可能会有用 对于旧的非标准程序。
使用真实变量作为循环索引已从Fortran 95的语言标准中删除。由于使用此代码的遗留代码数量很多,它可能会在编译器中保留数十年。
答案 2 :(得分:1)
另一种可能性是将其实现为函数或子例程。用户体验类似于tab(x)
或类似函数,但允许更多控制(例如,您可以检查x是否在x0的某个值的eps内,您已为其定义了一个值)。
总的来说,由于舍入错误,这个想法似乎很危险。
如果你正在处理有理数或者说整数数的srqt,那么当f(x)
作为一个函数适用时(x
bein,例如包含分子和分母)。
所以我最后的答案是:把它写成一个函数。