Sono stato trattenuto su questo per circa una settimana, ora, e ho cercato forum dopo forum per una chiara spiegazione di come inviare un char * da C a FORTRAN. Per rendere la cosa più frustrante, l'invio di un char * argomento da FORTRAN a C era straight-forward ...Creazione di un'interfaccia FORTRAN a una funzione C che restituisce un carattere *
L'invio di un char * argomento da FORTRAN a C (questo funziona bene):
// The C header declaration (using __cdecl in a def file):
extern "C" double GetLoggingValue(char* name);
E da FORTRAN:
! The FORTRAN interface:
INTERFACE
REAL(8) FUNCTION GetLoggingValue [C, ALIAS: '_GetLoggingValue'] (name)
USE ISO_C_BINDING
CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
END FUNCTION GetLoggingValue
END INTERFACE
! Calling the function:
GetLoggingValue(user_name)
Quando si cerca di usare la logica analoga per restituire un char * da C, ottengo problema dopo problema. Un tentativo che ho sentito dovrebbe funzionare è:
// The C declaration header (using __cdecl in a def file):
extern "C" const char* GetLastErrorMessage();
E l'interfaccia FORTRAN:
INTERFACE
FUNCTION GetLastErrorMessage [C, ALIAS: '_GetLastErrorMessage']()
USE ISO_C_BINDING
CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(255), :: GetLastErrorMessage
END FUNCTION GetLastErrorMessage
END INTERFACE
(non posso letteralmente utilizzare la dimensione (*), quindi sono andato fuori misura a 255.)
Questo deve restituire un puntatore a un array di 255 caratteri in stile C, ma se lo fa, non sono riuscito a convertirlo in una stringa significativa. In pratica, restituisce un insieme casuale di caratteri, dovunque da Wingdings al carattere 'campana' ...
Ho anche tentato di tornare:
- Un puntatore a carattere (LEN = 255, TIPO = C_CHAR).
- Letteralmente CHARACTER (LEN = 255, KIND = C_CHAR).
- Un INTEGER (C_SIZE_T) e ha cercato di ridurlo a un puntatore a un array di stringhe.
- A CARATTERE.
- ecc
Se qualcuno mi può dare un esempio di come fare questo, sarei molto grato ...
Con i migliori saluti,
Mike
Quali toolchain state usando? –
Sto usando il compilatore VC++, ma sto compilando l'interfaccia in puro C. FORTAN è Visual Fortran 2011, che credo sia FORTRAN 90. Tuttavia, questo è per un'API pubblicata, quindi deve essere richiamabile da tutti gli artificieri possibili ... –