Почему индекс цикла Fortran DO больше верхней границы после цикла? - PullRequest
1 голос
/ 27 марта 2012

Я смотрю в код модели качества воздуха, написанной на фортране, и у меня есть несколько вопросов относительно того, как фортран передает переменные из циклов do.

Этот очень простой пример иллюстрирует то, что я имею в виду:

   PROGRAM carla
   IMPLICIT NONE
   !
   INTEGER, PARAMETER :: LM = 24, DEZASSEIS = 16
   INTEGER            :: L, VARIAVEL, SOMA
   !
   DO L=1,LM
   WRITE(*,*) 'L = ', L
   END DO
   !
   WRITE(*,*) 'I am now ouside of the DO loop.'
   WRITE(*,*) 'I would expect L=LM=24... And SOMA=40'
   WRITE(*,*) 'L = ', L
   SOMA = DEZASSEIS + L
   WRITE(*,*) 'SOMA = ', SOMA
   END PROGRAM carla

Я бы ожидал, что L = LM = 24 ... И SOMA = 40 ... Но вместо этого я получаю:

   L =           25
   SOMA =           41

Я не понимаю, почему, когда мы на улицев цикле DO L не сохраняет последнее предполагаемое значение (таким образом, SOMA будет равно 40) и продолжает увеличиваться ...

Может кто-нибудь дать мне подсказку?

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Фортран так не работает. (это не Матлаб: P)

Соблюдайте осторожность при использовании индексной переменной вне цикла DO потому что переменная увеличивается в конце цикла, то есть она будет размер шага больше, чем окончательное значение.

http://www.oc.nps.edu/~bird/oc3030_online/fortran/do/do.html

Что объясняет, почему L=25 после цикла.

Редактировать: следующее неверно. См. Комментарий М.С.Б. ниже

В Фортране никогда нельзя ссылаться на переменную DO вне цикла без предварительного явного присвоения ей значения. - http://www.esm.psu.edu/~ajm138/fortranexamples.html

1 голос
/ 27 марта 2012

Цикл от 1 до 24, поэтому, когда он дойдет до 25, цикл завершится.

Think of it as 
(pseudocode)
LL = 1
While LL < 25
 LL = LL + 1;

Как заявил GummiV, не делайте этого.Циклы являются основными целями для оптимизации компилятора, нет гарантии того, что там после выполнения цикла.С таким же успехом могло бы быть 0, одна оптимизация меняет счет, потому что обнаружение LL = 0 быстрее, чем LL> 24 на некоторых машинах.Не намного быстрее, но у парней с компиляторами есть реальная проблема, с этим справится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...