Пользовательские функции > Использование Fortran > Использовать Fortran в пользовательских функциях
  
Использовать Fortran в пользовательских функциях
Создайте библиотеку Fortran
1. Создайте новый проект Fortran Static Library в Compaq Visual Fortran 6.6B и добавьте свои файлы в проект.
2. В меню Build щелкните Set Active Configuration и выберите Release.
3. Выполните компиляцию и сборку. Подпапка Release проекта Fortran теперь содержит [myfortranlib].lib.
Измените код C для пользовательской функции
Когда имеется библиотека Fortran, необходимо добавить в код C:
extern void __stdcall FORTRANFUNCTION(const double *array1, const double *scalar1 [, etc.]);
// Since FORTRAN typically expects arguments by reference, arguments are passed
// as pointers. To pass values, the FORTRAN code must contain a compiler directive
// telling the function to expect a value rather than an address.
LRESULT mcadfunction(LPCOMPLEXARRAY array1, LPCCOMPLEXSCALAR scalar1, etc.)
// this defines the function before FUNCTIONINFO, using the same variable names
// called by the external FORTRAN function.
{
// some error checking goes here, followed by the
// actual call to the FORTRAN function. For example,
FORTRANFUNCTION(&array1->hReal[0][0], &scalar1->real [, etc.]);
// Either the function call must be in UPPERCASE, or you will have to set
// Settings->FORTRAN->External procedures->External name implementation
// to "Upper case" in your FORTRAN compiler. Any other C functionality follows...
return 0;
}
Выполните компоновку библиотеки
1. В существующем проекте C в MS Visual C++ или Visual Studio выберите вкладку Компоновщик (Linker), а затем команду Ввод (Input) в меню Категория (Category). Введите [myfortranlib].lib в текстовое поле Object/library modules в конце списка.
2. Введите libc.lib в текстовое поле Ignore libraries.
3. Введите путь к файлу [myfortranlib].lib в текстовое поле Additional Library Path, например C:\temp.
4. Выполните компиляцию и сборку DLL.
Дополнительные сведения
Код Fortran должен выполняться как отдельный поток, а не непосредственно как функция. Таким образом, если процесс закончен, например нажатием Esc, может быть прекращен целый поток без проверки, какая подпрограмма Fortran является в это время активной.
Полезно заменить все операторы STOP в коде Fortran специальной функцией, возвращающей код ошибки в вызывающую программу C, которая прекратит поток корректно.
Если код Fortran содержит инструкции PRINT для консоли, они могут быть преобразованы путем переназначения консоли файлу, чтобы выходные результаты поступали в файл вместо экрана. Если процедура Fortran заканчивается с ошибкой, внешний интерфейс C++ может быть запрограммирован на чтение этого файла журнала и отображение его в виде окна. Например:
SUBROUTINE INIT_STDOUT ()
c this subro which redirects FORTRAN output to file
use dfwin
integer res
c CALL close_stdout
res=SETENVQQ("FOR_PRINT=C:\FORT_OUT.TXT")
c PRINT *, 'Print a character to initialize '
PRINT *,' '
RETURN
END
Если требуется распространять DLL на основе Fortran, на компьютере, который выполняет эту библиотеку, должны быть установлены соответствующие библиотеки времени выполнения Fortran. Можно использовать следующие библиотеки времени выполнения Fortran:
DFORRT.DLL
DFORRTD.DLL
DFORMD.DLL
DFORMDD.DLL
DFDLG100.DLL
MSVCRT.DLL
Если эти DLL отсутствуют, будут возникать ошибки. DLL упаковываются вместе с используемым компилятором Fortran. Необходимо установить их в папку Windows/system32/ или WINNT/system32/.