Я задерживаюсь на этом уже около недели, и искал форум за форумом в поисках четкого объяснения того, как отправить char* из C в ФОРТРАН. Чтобы сделать ситуацию еще более неприятной, отправка аргумента 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)
При попытке использовать аналогичную логику для возврата char* из 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
(я не могу буквально использовать DIMENSION(*), поэтому я увеличил размер до 255.)
Это долженвозвращать указатель на массив из 255 символов в стиле C, но если это так, мне не удалось преобразовать его в осмысленную строку. На практике он возвращает случайный набор символов, от Wingdings до символа «звонок»...
Я также пытался вернуть:
Если кто-нибудь может привести пример того, как это сделать, я был бы очень признателен...
С уважением,
Майк