gfortran:使用实数作为数组索引

时间:2012-12-18 19:18:31

标签: fortran gfortran

使用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中编译并运行它。我目前正在使用实数作为数组索引获取错误并执行循环迭代器。

谢谢!

3 个答案:

答案 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,例如包含分子和分母)。

所以我最后的答案是:把它写成一个函数。