我已经为此困扰了大约一个星期,并且已经在一个又一个论坛中搜索了一个关于如何将 char* 从 C 发送到 FORTRAN 的清晰解释。为了让事情更令人沮丧,将 char* 参数从 FORTRAN 发送到 C 是直截了当的......
将 char* 参数从 FORTRAN 发送到 C(这工作正常):
// The C header declaration (using __cdecl in a def file):
extern "C" double GetLoggingValue(char* name);
来自 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)
当尝试使用类似的逻辑从 C 返回一个 char* 时,我遇到一个又一个问题。我认为应该奏效的一种尝试是:
// The C declaration header (using __cdecl in a def file):
extern "C" const char* GetLastErrorMessage();
和 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
(我不能从字面上使用 DIMENSION(*),所以我已经超大到 255。)
这应该返回一个指向 255 个 C 样式字符的数组的指针 - 但如果是这样,我无法将其转换为有意义的字符串。在实践中,它会返回一组随机字符,从 Wingdings 到“bell”字符的任何位置......
我也试图返回:
- 指向 CHARACTER (LEN=255, KIND=C_CHAR) 的指针。
- 字面意思是 CHARACTER(LEN=255, KIND=C_CHAR)。
- 一个 INTEGER(C_SIZE_T),并试图将其巧妙地转换为一个指向字符串数组的指针。
- 一个人物。
- 等等
如果有人可以给我一个如何做到这一点的例子,我将非常感激......
最好的祝福,
麦克风