Создание интерфейса 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), и попытался изобразить это в указатель на массив строк.ХАРАКТЕР.и т.п.

Если кто-нибудь может дать мне пример того, как это сделать, я был бы очень признателен ...

С уважением,

Майк

Ответы на вопрос(7)

Ваш ответ на вопрос