3

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

谢谢!

4

3 回答 3

2

如果您不想看到警告,请尝试 --std=legacy。否则“gnu”,正如已经建议的那样。gfortran 手册指出:

作为扩展,GNU Fortran 允许使用 REAL 表达式或变量作为数组索引。

std 的默认值是 'gnu',它指定了 Fortran 95 标准的超集,其中包括 GNU Fortran 支持的所有扩展,尽管对于不建议在新代码中使用的过时扩展会给出警告。'legacy' 值是等效的,但没有过时扩展的警告,并且可能对旧的非标准程序有用。

使用实变量作为循环索引已从 Fortran 95 的语言标准中删除。由于使用它的遗留代码的数量,它可能会在编译器中保留数十年。

于 2012-12-18T21:07:33.257 回答
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. 但对它的支持可能并不总是存在,因为它不是标准的一部分。

于 2012-12-18T19:20:43.657 回答
1

另一种可能性是将其实现为函数或子例程。用户体验将类似于tab(x)数组或函数,但允许更多控制(例如,您可以检查 x 是否在您定义了值的 x0 的某个值的 eps 内)。

一般来说,由于舍入错误,这个想法似乎很危险。

如果您正在研究有理数,或者说整数的 srqt,那么当f(x)作为函数应用时(x例如包含分子和分母的派生类型),这又是理想的情况。

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

于 2012-12-19T12:04:52.977 回答