2014-10-28 4 views
2

Я был удивлен, что вы не можете поместить элемент массива в качестве управляющей переменной сделать петлю, как это:Использование элемента массива в качестве управляющей переменной сделать петлю в Фортран

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 против 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

Не могли бы вы привести источник вашего заявления? –

+0

Я использовал ifort v 11.1 и gfortran 4.5.1 и 4.8.3 для компиляции кода выше. Я скоро добавлю сообщение об ошибке в вопрос – user3136376

ответ

2

Извините за мой первый неправильный ответ.

Ограничение следует из правил языка:

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

R818 петли управленияявляется, сделать переменную = ...

R819 сделать переменныйявляется, scalar-int-variable-name

C812 (R819) Доменная переменная должна быть переменной типа integer.

Поэтому да, в позиции переменной управления контуром разрешено только имя переменной скаляра.

Если вы спросите, почему правила языка подобны этому, вы должны спросить авторов стандарта SC22/WG5 и X3J3, но я бы предположил, что это связано с необходимостью синтаксической однозначности в фиксированном -source. В фиксированном источнике формы пространства несущественны, и трудно придумать недвусмысленную грамматику.

+0

Поскольку это в основном синтаксическая проблема, как вы думаете, будет ли лучшая работа для этой проблемы? (например, делать с ручным приращением, назначать массив для каждого шага, указатель, если он когда-либо работает) – user3136376

+0

Все три будут работать. Какой из них выбрать - это вопрос стиля, и он будет зависеть от конкретного фрагмента кода. –

 Смежные вопросы

  • Нет связанных вопросов^_^