错误:字符参数' a'在(1)必须是长度1,因为程序是BIND(C)

时间:2015-09-30 17:01:53

标签: fortran gfortran fortran-iso-c-binding

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 个答案:

答案 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对其进行分隔。