Я задерживался на этом около недели и искал форум за форумом в поисках четкого объяснения того, как отправить 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);
И из ФОРТРАНА:
! 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 у меня возникает проблема за проблемой. Одна попытка, которая, по моему мнению, должна сработать, это:
// 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
(Я не могу буквально использовать РАЗМЕР (*), поэтому увеличил размер до 255).
Этот должен вернуть указатель на массив из 255 символов C-стиля, но если это так, мне не удалось преобразовать его в осмысленную строку. На практике он возвращает случайный набор символов, от Wingdings до символа «колокольчик» ...
Я также попытался вернуться:
- Указатель на CHARACTER (LEN = 255, KIND = C_CHAR).
- Буквально CHARACTER (LEN = 255, KIND = C_CHAR).
- INTEGER (C_SIZE_T) и попытался преобразовать его в указатель на массив строк.
- ХАРАКТЕР.
- и Т. Д.
Если кто-нибудь может дать мне пример, как это сделать, я был бы очень признателен ...
С наилучшими пожеланиями,
Майк