Ошибка: символьный аргумент 'a' в (1) должен иметь длину 1, потому что процедура BIND(C)

subroutine func01( a ) bind(C,name="func01")
  implicit none
  character(len=30), dimension(3) , intent(in) :: a

    print *
    print *, "char length = ", len(a(1)), len(a(2)), len(a(3))
    print *, "raw a(1) : [", a(1), "]"
    print *, "raw a(2) : [", a(2), "]"
    print *, "raw a(3) : [", a(3), "]"
    print *, "trim     : [", trim(a(1)), "] [", trim(a(2)), "]  [", trim(a(3)), "]"
end

Когда я пытаюсь скомпилировать приведенный выше код, я получаю следующие сообщения:

gfortran source3.f90

source3.f90:1.20:

subroutine func01( a ) bind(C,name="func01")
                    1
Warning: Variable 'a' at (1) is a parameter to the BIND(C) procedure 'func01' bu
t may not be C interoperable
source3.f90:1.20:

subroutine func01( a ) bind(C,name="func01")
                    1
Error: Character argument 'a' at (1) must be length 1 because procedure 'func01'
 is BIND(C)

Подскажите, пожалуйста, как избавиться от сообщений?

1 ответ

Символьный аргумент Фортрана bind(C) совместимая процедура должна иметь длину 1.

Но можно использовать тот же подход, что и в C, использовать массивы символов.

Если у вас есть

char ch[5]

использование

character(kind=c_char) :: ch(5)

Если у вас есть

char* ch;
int n;

ch = malloc(n);
fortran_sub(ch, n);

использование

subroutine fortran_sub(ch, n) bind(C, name="fortran_sub")
  integer(c_int), value :: n
  character(kind = c_char) :: ch(n)

Обратите внимание, что массив символов будет разделен нулем.

Если вы вызываете C и передаете туда массив символов, вы обязаны разграничить его: c_char_null,

Другие вопросы по тегам