Per utilizzare Fortran nelle funzioni personalizzate
Creare la libreria Fortran
1. Creare un nuovo progetto Fortran Static Library in Compaq Visual Fortran 6.6B e quindi aggiungere i file al progetto.
2. Nel menu Build scegliere Set Active Configuration e quindi selezionare Release.
3. Compilare e generare la libreria. La sottocartella Release del progetto Fortran contiene ora [myfortranlib].lib.
Modificare il codice C per la funzione personalizzata
Quando si dispone della libreria Fortran, è necessario aggiungere il codice 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;
}
Collegare la libreria
1. In un progetto C esistente in MS Visual C++ o Visual Studio selezionare la scheda Linker, quindi scegliere Input (singolo) dal menu Categoria. Immettere [myfortranlib].lib nella casella di testo Object/library modules alla fine dell'elenco.
2. Immettere libc.lib nella casella di testo Ignore libraries.
3. Immettere il percorso del file [myfortranlib].lib nella casella di testo Additional Library Path, ad esempio C:\temp.
4. Compilare e generare la DLL.
Ulteriori informazioni
• Il codice Fortran deve essere eseguito come thread separato anziché direttamente come funzione. In questo modo, se il processo viene terminato, ad esempio premendo Esc, è possibile terminare l'intero thread senza identificare la subroutine Fortran attualmente attiva.
• È utile sostituire tutte le istruzioni STOP nel codice Fortran con una speciale funzione che restituisca un codice di errore al codice C chiamante, che terminerà il thread in modo appropriato.
• Se il codice Fortran contiene istruzioni PRINT per la console, queste possono essere convertite riassegnando la console a un file, in modo che l'output venga restituito a un file anziché allo schermo. Se la routine Fortran termina con un errore, è possibile programmare il front-end C++ perché legga questo file di log e lo visualizzi come finestra. Ad esempio:
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
• Se si desidera distribuire una DLL basata su Fortran, nel computer che la esegue devono essere installate le librerie di runtime Fortran appropriate. È possibile utilizzare le librerie di runtime Fortran indicate di seguito.
◦ DFORRT.DLL
◦ DFORRTD.DLL
◦ DFORMD.DLL
◦ DFORMDD.DLL
◦ DFDLG100.DLL
◦ MSVCRT.DLL
Se queste DLL risultano mancanti, vengono restituiti errori. Il pacchetto delle DLL viene creato con il compilatore Fortran. È necessario installare le DLL nella directory Windows/system32/ o WINNT/system32/.