Ich habe seit etwa einer Woche hier gehalten, und Forum for Forum für eine klare Erklärung, wie man ein Zeichen * von C senden nach Fortran. Um die Sache mehr frustrierend zu machen, das Senden ein char * Argument von Fortran nach C war geradlinig ...Erstellen einer FORTRAN-Schnittstelle zu einer C-Funktion, die ein Zeichen zurückgibt *
ein char * Argument von Fortran nach C Senden (das funktioniert gut):
// The C header declaration (using __cdecl in a def file):
extern "C" double GetLoggingValue(char* name);
Und von FORTRAN:
Wenn ich versuche, analoge Logik zu verwenden, um ein char * von C zurückzugeben, bekomme ich Problem nach Problem. Ein Versuch, den ich fühlte, sollte funktionieren ist:
// The C declaration header (using __cdecl in a def file):
extern "C" const char* GetLastErrorMessage();
Und die Fortran-Schnittstelle:
INTERFACE
FUNCTION GetLastErrorMessage [C, ALIAS: '_GetLastErrorMessage']()
USE ISO_C_BINDING
CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(255), :: GetLastErrorMessage
END FUNCTION GetLastErrorMessage
END INTERFACE
(Ich kann buchstäblich nicht die Dimension (*) verwenden, also habe ich zu 255 Übermaß gegangen.)
Diese sollte einen Zeiger auf ein Array von 255 C-style-Zeichen zurückgeben - aber wenn dies der Fall ist, konnte ich dies nicht in eine sinnvolle Zeichenfolge konvertieren. In der Praxis gibt es eine zufällige Menge von Zeichen, überall von Wingdings auf den 'Glocke' Charakter ...
Ich habe auch versucht, zurückzukehren:
- Ein Zeiger auf CHARACTER (LEN = 255, KIND = C_CHAR).
- Wörtlich CHARACTER (LEN = 255, KIND = C_CHAR).
- Ein INTEGER (C_SIZE_T), und versucht, das in einen Zeiger auf ein String-Array zu verfeinern.
- A CHARACTER.
- usw.
Wenn jemand mir ein Beispiel dafür, wie dies zu tun geben kann, wäre ich sehr dankbar ...
Mit freundlichen Grüßen,
Mike
Welche Toolchains verwenden Sie? –
Ich benutze VC++ Compiler, aber kompilieren die Schnittstelle in pure C. Die FORTAN ist Visual Fortran 2011, die ich glaube, ist FORTRAN 90. Dies ist jedoch für eine veröffentlichte API, so muss es von so vielen Geschmacksrichtungen wie möglich aufrufbar sein ... –