Следует ли всегда объявлять внешнюю процедуру в Fortran?

В своем коде на Фортране я сделал следующий вызов процедуры dnrm2:

d = dnrm2(n, ax, 1)

Просто простой вызов, который вернул бы мне результат double precision.

Вопрос в том, должен ли я объявить функцию в начале моего скрипта? Я обнаружил, что если я не объявлю это, то при компиляции кода в 32-битной Windows результат будет правильным.

Но если я скомпилирую код в 64-битной Windows, результат будет неверным.

Почему это так? Должна ли внешняя подпрограмма всегда объявляться в Фортране?


person Graviton    schedule 12.03.2010    source источник
comment
Какая? Понижение? В чем проблема с моим вопросом?   -  person Graviton    schedule 27.03.2010
comment
+1: Это интересный вопрос - для меня отрицательный голос не имеет смысла.   -  person ire_and_curses    schedule 28.03.2010


Ответы (2)


Если вы неправильно описываете свои подпрограммы (подпрограммы и функции) вызывающей программе, компилятор может неправильно их вызывать. Фортран компилирует каждую единицу отдельно, поэтому компилятор по умолчанию не «знает» о характеристиках других подпрограмм. Есть несколько способов описать/объявить подпрограмму в Fortran 90/95/2003.

Самый простой и лучший способ — поместить ваши подпрограммы в модуль, а затем «использовать» этот модуль в вызывающей программе. Это автоматически делает интерфейс известным компилятору и позволяет компилятору проверять согласованность фактических аргументов (в вызове) и фиктивных аргументов в подпрограмме. Также будет известен возвращаемый тип функции. Различные подпрограммы в модуле имеют свои интерфейсы, известные друг другу.

Вы также можете написать «интерфейс», содержащий объявление подпрограммы, которое соответствует объявлениям фактической подпрограммы. (Этот метод может быть очень похож на стиль включения файлов заголовков в C.) Этот метод более трудоемок и подвержен ошибкам, поскольку вам нужно вручную поддерживать согласованность между фактической подпрограммой и интерфейсом всякий раз, когда вносятся изменения. Метод интерфейса полезен, когда у вас нет кода подпрограммы или подпрограмма написана на языке, отличном от Fortran.

Или вы можете просто объявить имя функции, чтобы указать возвращаемый тип функции, но это не даст вам никакой проверки аргументов. На мой взгляд, этот метод слабее, поскольку наличие проверки согласованности аргументов компилятора устраняет основной класс ошибок программирования.

person M. S. B.    schedule 12.03.2010

Я не работаю на Фортране, но в C размер указателя и размер длинного целого числа различаются между 32- и 64-битными ОС, а размер целого числа — нет. Возможно, программа использует целые числа для выполнения арифметических операций с указателями?

person Arthur Kalliokoski    schedule 12.03.2010
comment
Хорошо, но какое это имеет отношение к моему вопросу? - person Graviton; 12.03.2010