使用数组成员作为控制变量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) 
+1

您能否引用您的声明来源? – 2014-10-28 07:37:10

+0

我已经使用ifort v 11.1和gfortran 4.5.1&4.8.3来编译上面的代码。我将很快在问题中添加错误消息 – user3136376 2014-10-28 08:00:24

对不起,我的第一个错误的答案。

的Fortran 2008(ISO/IEC 1539-1:2010)8.1.6.2:

该限制从语言的规则如下

R818 循环控制做变量 = ...

R819 做变量scalar-int-variable-name

C812(R819)do变量应该是一个integer类型的变量。

因此是的,在循环控制变量的位置只允许一个标量变量名称。

如果你问为什么语言的规则是这样的,你必须问标准的作者SC22/WG5和X3J3,但我想这与固定语法中的句法不歧义的必要性有关源表单。在固定的源代码中,空格不重要,很难提出明确的语法。

+0

因为这主要是句法问题,所以您认为最适合此问题的解决方案是什么? (例如,在手动增量的同时进行,为每个步骤分配阵列,如果它曾经有过指针) – user3136376 2014-10-28 08:47:07

+0

这三者都可以工作。选择哪一个是风格问题,取决于特定的代码。 – 2014-10-28 08:49:25