Следует ли объявлять внешнюю рутину всегда на фортране? - PullRequest
1 голос
/ 12 марта 2010

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

d = dnrm2(n, ax, 1)

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

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

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

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

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

0 голосов
/ 12 марта 2010

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

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