Я пытаюсь сделать библиотеку полезных функций. Я еще не знаю много об этом, но, очевидно, большинство из них, если не все, должны быть включены в модуль (или в интерфейс внутри программы, но, поскольку цель этого состоит в том, чтобы создать библиотеку, которая не кажется, нет выбора), иначе программы, в которых я буду их использовать, не распознают их.
Я мог бы сделать длинный файл с одним модулем, включающим в себя все эти функции, но я хотел бы сохранить разные функции в разных коротких файлах. Однако, если я сделаю это, мне придется создать разные модули для каждой функции, и если я захочу использовать их все в программе, у меня будет очень длинный список объявлений USE
(не говоря уже о числе. мод файлы, которые будут производиться).
Единственное возможное решение, которое я мог придумать, - это создать еще один модуль с объявлениями USE
для всех остальных модулей, но я думаю, что должен быть другой способ иметь библиотеку, содержащую функции, которые не так притянуто за уши.
Кроме того, почему у меня такая проблема с функциями, а не с подпрограммами? Это потому, что команда CALL
сразу идентифицирует строку как вызов подпрограммы, тогда как функции вызываются просто по имени, без команды, чтобы сказать компилятору «эй, это функция», поэтому она должна знать, что такое функция и что не заранее?
Я включил пример (следуя инструкциям в http://www.oceanographers.net/forums/showthread.php?378-How-to-make-a-FORTRAN-library, и используя правильный «путь»).
TestFunc.F90
FUNCTION SumNum(nNum1,nNum2) RESULT(nResult)
IMPLICIT NONE
INTEGER,INTENT(IN) :: nNum1,nNum2
INTEGER :: nResult
nResult=nNum1+nNum2
RETURN;END FUNCTION
TestProg.F90
PROGRAM TestProg
IMPLICIT NONE
WRITE(6,*) SumNum(2,2)
STOP;END PROGRAM
Командная строка
> gfortran -c TestFunc.F90 -o TestFunc.o
> ar ruv libmylib.a *.o
> gfortran TestProg.F90 -o Test.x -L/path -lmylib.a
TestProg.F90:6.12:
WRITE(6,*) SumNum(2,2)
1
Error: Function 'sumnum' at (1) has no IMPLICIT type