Очень странная ошибка в Фортране при сравнении целых чисел - PullRequest
0 голосов
/ 05 января 2011

Я пытаюсь проверить, сколько раз определенные строки выполняются за несколько шагов, вот часть моего кода: 1) каждый раз пишите "countd":

real(kind=8) function dergfm(jp,ip,lp)
integer :: jp,ip,lp,countd
real(kind=8) press
    .
    .
    .
   countd=countd+1
   !if (countd < 5) then 
   print*, "countd= ", countd
   !endif
    .
    .
    .
end function dergfm

результат:

countd=            1
.
.
.
countd=            21504

2) напишите сначала "countd" 4 раза:

    real(kind=8) function dergfm(jp,ip,lp)
integer :: jp,ip,lp,countd
real(kind=8) press
    .
    .
    .
   countd=countd+1
   if (countd < 5) then 
   print*, "countd= ", countd
   endif
    .
    .
    .
end function dergfm

Результаты:

countd=            1
countd=            2
countd=            3
countd=            4

3) написать "countd" больше 5

    real(kind=8) function dergfm(jp,ip,lp)
integer :: jp,ip,lp,countd
real(kind=8) press
    .
    .
    .
   countd=countd+1
   if (countd > 5) then 
   print*, "countd= ", countd
   endif
    .
    .
    .
end function dergfm

Результаты:

[none]

Похоже, что сравнение этих целых чисел работает для .lt. но не для .gt. (ни. экв.)

Ответы [ 2 ]

2 голосов
/ 05 января 2011

countd является локальной переменной для функции.Таким образом, его значение не обязательно сохраняется между вызовами, если только вы не добавите атрибут «save» в объявление.Попробуйте это и посмотрите, начинает ли код себя вести.А как вы инициализируете countd?Я бы использовал следующее:

integer, save :: countd = 0

В этом случае «save» является необязательным, поскольку подразумевается инициализацией в объявлении.

0 голосов
/ 12 января 2011

Если переменная не была SAVE'd, поведение не определено и могут происходить странные вещи. Для некоторых компиляторов значение COUNTD будет инициализировано равным нулю, а код будет работать как положено. Для других компиляторов вы будете получать полный мусор каждый раз Вы называете эту подпрограмму.

В других случаях (я подозреваю, это ваш случай), переменная помещается в стек и МОЖЕТ присваивать одну и ту же память каждый раз, когда вызывается подпрограмма. Или это может получить присваивают одну и ту же память первые 4 или 5 раз, затем некоторые другие подпрограммы повреждают стек в 6-й раз и значение COUNTD становится мусором.

Правильный ответ - СОХРАНИТЬ переменную и инициализировать ее оператором данных. Это портативно и будет работать на любой системе.

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