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