Ошибка: символьный аргумент '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
,