Перекомпиляция старой программы на Фортране и получение этой ошибки

Участок кода выглядит следующим образом;

DO i = 1 , no2 + 1
   IF ( Isign.EQ.1 ) THEN
      Ans(i) = fft(i)*Ans(i)/no2
   ELSEIF ( Isign.EQ.-1 ) THEN
      IF ( ABS(Ans(i)) .EQ. 0.0 )
&           PAUSE ' deconvolving at responce zero in convlv'
      Ans(i) =  fft(i)/Ans(i)/no2
   ELSE

Компилятор выдает мне эту ошибку; ЕСЛИ (ABS(i)).EQ. 0,0) ^ Типовое несоответствие между выражениями в (^) и (^)

IF ( ABS(i)).EQ. 0.0)
            ^
invalid form for IF statement at (^)

Может ли кто-нибудь сказать мне, как правильно написать эту строку «Внутренняя функция», чтобы решить эту ошибку? Я новичок в программировании, и любая помощь будет здорово! Я использую компилятор GNU G77, если это имеет значение? Спасибо


person Mike Hansen    schedule 07.02.2011    source источник
comment
Компилятор предположительно дает вам номер строки для ошибки. Является ли эта строка номером одной из показанных строк? Внешне похож на один из них. Если нет, найдите строку с ошибкой и исправьте ее.   -  person David Thornley    schedule 07.02.2011


Ответы (2)


Я вижу больше правых скобок, чем левых во втором операторе ошибки

IF ( ABS(i)).EQ. 0.0)

Кроме того, каковы тип и вид Ans (i) и 0.0? Я помню, что fortran может быть немного странным в отношении преобразования типов.

person toochin    schedule 07.02.2011
comment
Теперь, когда исходный код отображается лучше, мы можем видеть, что скобки сбалансированы. Вероятно, ответ заключается в том, что массив Ans имеет тип, отличный от реального, тип 0.0. Измените константу, чтобы она была того же типа, что и Ans. P.S. Точное сравнение значений с плавающей запятой рискованно. - person M. S. B.; 07.02.2011
comment
Может быть, это также один и тот же тип, разные виды? Я помню, у меня было много проблем с этим в вызовах подпрограмм. - person toochin; 07.02.2011
comment
Также кажется немного странным, что компилятор заменил Ans(i) на i. Действительно ли мы смотрим на фрагмент кода, который вызывает ошибку? - person toochin; 07.02.2011

Декларации, пожалуйста. Они меняют мир!

Сравнение чего-либо с десятичным нулем — очень плохая практика. Почти всегда лучше сравнить его со значением допустимой ошибки (которое следует сделать достаточно малым).

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

person Rook    schedule 07.02.2011