使用数组成员作为控制变量FORTRAN
我感到惊讶的是,你不能把一个数组成员作为控制变量做循环do循环是这样的:使用数组成员作为控制变量FORTRAN
program test
integer, dimension(2) :: i
do i(1) = 1, 3
do i(2) = 1, 3
! anything here
write(*, *) i
end do
end do
end program
我的问题是,为什么它是不允许的?
编辑: 或者是允许的,但我做错了吗?
错误消息从ifort v 11.1:
test.f90(4): error #5082: Syntax error, found IDENTIFIER 'I' when expecting one of: (% : . = =>
do i(1) = 1, 3
-------^
test.f90(4): error #5082: Syntax error, found ',' when expecting one of: <END-OF-STATEMENT> ;
do i(1) = 1, 3
---------------^
test.f90(5): error #5082: Syntax error, found IDENTIFIER 'I' when expecting one of: (% : . = =>
do i(2) = 1, 3
-------^
test.f90(5): error #5082: Syntax error, found ',' when expecting one of: <END-OF-STATEMENT> ;
do i(2) = 1, 3
---------------^
test.f90(4): error #6535: This variable or component must be of a derived or structure type [DO]
do i(1) = 1, 3
----^
test.f90(4): error #6460: This is not a field name that is defined in the encompassing structure. [I]
do i(1) = 1, 3
-------^
test.f90(8): error #6099: An ENDDO statement occurred without a corresponding DO or DO WHILE statement.
end do
----^
test.f90(9): error #6099: An ENDDO statement occurred without a corresponding DO or DO WHILE statement.
end do
----^
从gfortran V4.5.1 & 4.8.3的错误信息是:
test.f90:4.4:
do i(1) = 1, 3
1
Error: Unclassifiable statement at (1)
test.f90:5.4:
do i(2) = 1, 3
1
Error: Unclassifiable statement at (1)
test.f90:8.7:
end do
1
Error: Expecting END PROGRAM statement at (1)
test.f90:9.7:
end do
1
Error: Expecting END PROGRAM statement at (1)
对不起,我的第一个错误的答案。
的Fortran 2008(ISO/IEC 1539-1:2010)8.1.6.2:
该限制从语言的规则如下
R818 循环控制是, 做变量 = ...
R819 做变量是,scalar-int-variable-name
C812(R819)do变量应该是一个integer类型的变量。
因此是的,在循环控制变量的位置只允许一个标量变量名称。
如果你问为什么语言的规则是这样的,你必须问标准的作者SC22/WG5和X3J3,但我想这与固定语法中的句法不歧义的必要性有关源表单。在固定的源代码中,空格不重要,很难提出明确的语法。
因为这主要是句法问题,所以您认为最适合此问题的解决方案是什么? (例如,在手动增量的同时进行,为每个步骤分配阵列,如果它曾经有过指针) – user3136376 2014-10-28 08:47:07
这三者都可以工作。选择哪一个是风格问题,取决于特定的代码。 – 2014-10-28 08:49:25
您能否引用您的声明来源? – 2014-10-28 07:37:10
我已经使用ifort v 11.1和gfortran 4.5.1&4.8.3来编译上面的代码。我将很快在问题中添加错误消息 – user3136376 2014-10-28 08:00:24