Benutzerdefinierte Funktionen > Fortran verwenden > So verwenden Sie Fortran in angepassten Funktionen
  
So verwenden Sie Fortran in angepassten Funktionen
Fortran-Bibliotheken erstellen
1. Erstellen Sie ein neues Fortran Static Library Projekt in Compaq Visual Fortran 6.6B, und fügen Sie Ihre Dateien dem Projekt hinzu.
2. Klicken Sie unter dem Menü Build auf Set Active Configuration, und wählen Sie Release aus.
3. Kompilieren und erstellen Sie den Code. Der Unterordner Release des Fortran-Projekts enthält jetzt [myfortranlib].lib.
Den C-Code für die angepasste Funktion ändern
Wenn Sie die Fortran-Bibliothek haben, müssen Sie Ihren C-Code hinzufügen:
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;
}
Bibliotheken verknüpfen
1. Wählen Sie in einem vorhandenen C-Projekt in MS Visual C++ oder in Visual Studio die Registerkarte Linker und dann Input im Menü Category aus. Geben Sie [myfortranlib].lib in das Textfeld Object/library modules am Ende der Liste ein.
2. Geben Sie libc.lib in das Textfeld Ignore libraries ein.
3. Geben Sie den Pfad der Datei [myfortranlib].lib in das Textfeld Additional Library Path ein, z.B. C:\temp.
4. Kompilieren und erstellen Sie die DLL.
Zusätzliche Informationen
Der Fortran-Code muss als ein unabhängiger Thread, aber nicht direkt als Funktion ausgeführt werden. Auch wenn der Prozess z.B. durch das Drücken von Esc abgebrochen wird, kann auf diese Weise der gesamte Thread beendet werden, ohne zu prüfen, welche Fortran-Subroutine derzeit aktiv ist.
Es ist hilfreich, alle STOP-Anweisungen im Fortran-Code durch eine spezielle Funktion zu ersetzen, die an den aufrufenden C-Code einen Fehlercode zurückgibt, wodurch der Thread ordnungsgemäß beendet wird.
Wenn der Fortran-Code PRINT für Konsolenanweisungen enthält, können diese konvertiert werden, indem die Konsole einer Datei neu zugewiesen wird; dann wird die Ausgabe in eine Datei und nicht auf den Bildschirm geleitet. Wenn die Fortran-Routine mit einem Fehler beendet wird, kann das C++-Front-End so programmiert werden, dass diese Protokolldatei gelesen und als Fenster angezeigt wird. Beispiel:
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
Wenn Sie eine Fortran-basierte DLL verteilen möchten, müssen auf dem Computer, auf dem sie ausgeführt wird, die entsprechenden Laufzeitbibliotheken von Fortran installiert sein. Sie können die folgenden Fortran-Laufzeitbibliotheken verwenden:
DFORRT.DLL
DFORRTD.DLL
DFORMD.DLL
DFORMDD.DLL
DFDLG100.DLL
MSVCRT.DLL
Wenn diese DLLs fehlen, kommt es zu Fehlern. Die DLLs sind im Paket des Fortran-Compilers enthalten. Sie müssen sie im Verzeichnis Windows/system32/ oder WINNT/system32/ installieren.