2010-12-12 2 views
1

Когда я создаю скалярный INTEGER, s и передаю его подпрограмме, его значение преобразуется в float и ужасно неточно. Например, если я установил s = 2 и CALL print_my_int (s), где он будет писать (,), он будет отображаться на консоли, это значение отображается как 2.80259693E-45. Другие скалярные целые числа ведут себя аналогично, за исключением случая, когда s = 0, и в этом случае выход равен 0,0000000. Но даже это по-прежнему не так, поскольку целое число должно, очевидно, не отображать десятичную и мантиссу. Это НЕ проблема выходного формата, так как я могу заставить другие целые числа отображаться правильно при отображении на локальном компьютере.Помощь! Передача целых чисел FORTRAN превращает их в неточные поплавки?

Любые подсказки относительно того, что здесь происходит? Нужно ли принудительно вводить тип данных аргумента в определение подпрограммы? Можно ли это сделать?

Пример код:

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

Результирующий выход:

2.80259693E-45 

ответ

1

Хорошо, преждевременный пост, но я оставлю это для тех, кто работает в то же самое. Я не привык к синтаксису для применения типов параметров в FORTRAN. В определении подпрограммы тип данных параметра ниже имени и списка параметров. Если не включено, компилятор GNU не предупреждает или не сквозит. Я полагаю, что по умолчанию это отличает какой-то другой тип. Итак, мой пример выше следует читать, как это ...

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    INTEGER x 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 
+1

Он также работал бы, если вы изменили имя параметра с 'x' на' i' или 'j', потому что FORTRAN имеет вывод типа на основе начальных символов имен переменных. Но не делайте этого - это плохая практика. – JasonFruit

+0

Спасибо, сэр. Удобный совет, но я буду помнить, чтобы избежать злоупотребления служебным положением. –

+3

полезно использовать оператор «implicit none» в начале каждой программы/подпрограммы, если вы хотите, чтобы компилятор задушил неперечисленные переменные. – steabert

2

ничего нового, просто хотел указать на использовании интерфейса, обеспечивая некоторый код, который не укладывался в комментарии:

Как было сказано вы можете поместить implicit none везде в начале раздела декларации, или в качестве альтернативы вы можете поместить интерфейс в программе, которая использует подпрограмму, то компилятор выдаст ошибку несоответствия типов:

PROGRAM print_int 
INTERFACE 
    SUBROUTINE print_my_int(x) 
    END SUBROUTINE 
END INTERFACE 
INTEGER s 
s = 2 
CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
WRITE(*,*) x 
END SUBROUTINE print_my_int 
3

Еще один дополнительный комментарий , проще, чем @steabert «S:

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 

CONTAINS 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

END PROGRAM print_int 

К, содержащий подпрограмму в программе вы принуждать компилятор в создание явного интерфейса, сохраняя 3 строк кода. Оставляя объявление x внутри подпрограммы неявным, компилятор указывает на ошибку.

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