2011-02-07 2 views
0

Раздел кода выглядит следующим образом;Перекомпиляция старой программы Fortran и получение этой ошибки

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 

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

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

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

+1

Компилятор предположительно дает вам номер строки для ошибки. Является ли эта строка номером один из строк? Это поверхностно похоже на один из них. Если нет, найдите строку с ошибкой и исправьте ее. –

ответ

1

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

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

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

+1

С улучшенным отображением исходного кода теперь мы можем видеть, что баланс в скобках. Вероятно, ответ заключается в том, что массив «Ans» имеет тип, отличный от реального, тип «0.0». Измените константу на тот же тип, что и «Ans». Постскриптум Точные сравнения значений с плавающей запятой являются рискованными. –

+0

Может ли он быть того же типа, разных видов? Я помню, что у меня было много проблем с вызовами подпрограмм. – toochin

+2

Также кажется немного странным, что компилятор заменит 'Ans (i)' на 'i'. Действительно ли мы смотрим на фрагмент кода, который вызывает ошибку? – toochin

0

Заявления, пожалуйста. Они создают мир разницы!

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

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