Создание интерфейса FORTRAN для функции C, которая возвращает char*

Я задерживаюсь на этом уже около недели, и искал форум за форумом в поисках четкого объяснения того, как отправить 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 до символа «звонок»...

Я также пытался вернуть:

  • Указатель на CHARACTER(LEN=255, KIND=C_CHAR) .
  • Буквально CHARACTER(LEN=255, KIND=C_CHAR).
  • Целое число (C_SIZE_T) и попытался преобразовать его в указатель на массив строк.
  • ХАРАКТЕР.
  • и т.д.

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

С уважением,

Майк

11
задан M. S. B. 3 January 2013 в 06:36
поделиться