Funciones personalizadas > Utilización de Fortran > Procedimiento para utilizar Fortran en las funciones personalizadas
  
Procedimiento para utilizar Fortran en las funciones personalizadas
Creación de la biblioteca de Fortran
1. Cree un nuevo proyecto de Fortran Static Library en Compaq Visual Fortran 6.6B y añada sus ficheros al proyecto.
2. En el menú Build, pulse en Set Active Configuration y seleccione Release.
3. Genere la compilación. La subcarpeta Release del proyecto de Fortran contiene ahora [myfortranlib].lib.
Modificación del código C de la función personalizada
Cuando tenga la biblioteca de Fortran, deberá añadir su código 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;
}
Enlace de la biblioteca
1. En un proyecto C existente en MS Visual C++ o Visual Studio, seleccione la ficha Vinculador y, a continuación, Entrada del menú Categoría. Introduzca [myfortranlib].lib en el cuadro de texto Object/library modules al final de la lista.
2. Introduzca libc.lib en el cuadro de texto Ignore libraries.
3. Introduzca la ruta del fichero [myfortranlib].lib en el cuadro de texto Additional Library Path, por ejemplo, C:\temp.
4. Genere la compilación del fichero DLL.
Información adicional
El código Fortran debe ejecutarse como un subproceso aparte, en lugar de directamente como una función. De este modo, si se termina el proceso, por ejemplo, pulsando Esc, se puede terminar todo el subproceso sin verificar la subrutina Fortran que se encuentra activa actualmente.
Resulta útil reemplazar todas las sentencias STOP del código Fortran por una función especial que devuelva un código de error a la C de llamada, que terminará el subproceso de manera correcta.
Si el código Fortran contiene PRINT para las sentencias de la consola, estas se pueden convertir mediante la reasignación de la consola a un fichero, por lo que la salida se genera en un fichero en lugar de en la pantalla. Si la rutina Fortran termina con un error, el front-end de C++ se podrá programar para la lectura de este fichero de registro y su visualización como una ventana. Por ejemplo:
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
Si desea distribuir una DLL basada en Fortran, el ordenador que la ejecute deberá tener instaladas las bibliotecas de tiempo de ejecución de Fortran adecuadas. Se pueden utilizar las siguientes bibliotecas de tiempo de ejecución de Fortran:
DFORRT.DLL
DFORRTD.DLL
DFORMD.DLL
DFORMDD.DLL
DFDLG100.DLL
MSVCRT.DLL
Si estas DLL faltan, se producirán errores. Las DLL se empaquetan con el compilador de Fortran. Deben instalarse en el directorio Windows/system32/ o WINNT/system32/.