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)
请告诉我如何摆脱这些消息?
答案 0 :(得分:3)
Fortran 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)
请注意,字符数组将以null分隔。
如果您正在调用C并在那里传递字符数组,则您有责任通过c_char_null
对其进行分隔。