【问题标题】:Error: Character argument 'a' at (1) must be length 1 because procedure is BIND(C)错误:(1) 处的字符参数“a”的长度必须为 1,因为过程是 BIND(C)
【发布时间】:2015-09-30 17:01:53
【问题描述】:
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)

你能告诉我如何摆脱这些消息吗?

【问题讨论】:

  • 正如您在 stackoverflow.com/tags/fortran-iso-c-binding/info 中看到的那样,a 不是可互操作的东西(它的长度不是 1).. 您将能够找到许多其他关于从C 到 Fortran。
  • 用 ifort intel 编译器编译就好了
  • 是的,英特尔允许这样做,但这是他们的非标准选择。
  • 如何修复它以使用 gfortran 运行
  • 您将不得不对其进行重组以使用 character(1) 数组。我们不能说更多,因为我们看不到其余的代码,但必须对其进行重组,而不仅仅是更改一行。

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


【解决方案1】:

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)

请注意,字符数组将以空值分隔。

如果您正在调用 C 并在那里传递字符数组,则您有责任用 c_char_null 分隔它。

【讨论】:

  • 也许我在这里遗漏了一些东西,但是你如何在 C 和 Fortran 之间进行干净的互操作。看来您需要先将所有数组 ch(n) 转换为 character(len=n) :: new_ch 才能在 Fortran 中正常工作。
  • @kvantour 请参阅 Fortran 2015 草案中的注释 18.17 和 18.21(最终 F2018 中的数字可能不同)。 “Fortran 的序列关联规则 (15.5.2.11) 允许字符标量实际参数对应于虚拟参数数组。这使得将 Fortran 字符串与 C 字符串关联起来成为可能。注释 18.21 有一个示例Fortran 和 C 字符串之间的互操作。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多