2017-02-19 14 views
0

У меня есть следующие функцииКак вызвать внешнюю функцию?

REAL FUNCTION myfunction(x) 

    IMPLICIT NONE 
    REAL, INTENT(IN) :: x 
    myfunction = SIN(x) 

END FUNCTION myfunction 

в файле myfunction.f90

Я хочу использовать эту функцию в другом файле F90. Как я могу это сделать?

ответ

1

Рекомендуемым способом сделать это в современном Fortran было бы создание модуля, назовем его, например. "MyMath". В этом случае, вы можете создать один файл mymath.f90, содержащий что-то вроде этого:

module mymath 
contains 
    function myfunction(x) result(r) 
    real, intent(in) :: x 
    real    :: r 

    r = sin(x) 
    end function 
end module 

Тогда другой файл main.f90 так:

program main 
    use :: mymath 

    print *,myfunction(3.1416/2) 
end program 

Тогда вы просто компилировать исходные файлы вместе:

gfortran mymath.f90 main.f90 

Результирующий исполняемый файл должен работать должным образом.

EDIT:

Если вы действительно предпочитают держаться подальше от модулей, то вы можете сделать mymath.f так:

function myfunction(x) result(r) 
    real, intent(in) :: x 
    real    :: r 

    r = sin(x) 
end function 

И сделать main.f90 так:

program main 
    real, external :: myfunction 

    print *,myfunction(3.1416/2) 
end program 

Он компилируется и работает как другое решение. Обратите внимание, что если вы решите использовать external вместо module, компилятор обычно не проверяет, что аргументы, которые вы даете myfunction, имеют правильное количество, типы и размеры, что может осложнить отладку в будущем.

+0

Спасибо, я подожду, если кто-то укажет прямолинейный способ вызова функции без среды модуля. –

+2

Хотя, возможно, хорошая практика, «внешний» здесь не требуется. – francescalus

1

Просто используйте внешний ...

... 
REAL, EXTERNAL :: myfunction 
REAL   :: X, Y 
... 

Y = myfunction(x) 

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

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

  • Нет связанных вопросов^_^