在默认类型和 C 互操作类型之间转换 Fortran 字符和逻辑数组

我将一些遗留的 F77 代码(我无法更改)包装在 C 接口中。假设遗留代码有

subroutine foo(s, l)
  character*10  s
  logical       l(10)
  …

我正在编写一个小的 F2008 包装器foo_wrapper,它打算通过 公开与 C 兼容的接口ISO_C_BINDING,进行任何必要的类型转换,调用foo,最后再次进行类型转换。我的理解是我应该从

subroutine foo_wrapper(c_s, c_l) bind(C, name="foo_wrapper")
  use ISO_C_BINDING, only: C_CHAR, C_BOOL
  character(kind=C_CHAR, len=1), dimension(10) :: c_s
  logical(kind=C_BOOL)                            c_l(10)
  …

但是我实际上如何进行从c_s到 a的转换character*10,同样为c_l到 a logical(并在调用后返回)?

回答

具有默认种类参数的类型不一定不能互操作。互操作性基于种类编号,而不是kind=c_kind声明中,的具体用途。如果种类编号(如果有的话,长度类型参数)匹配,则类型相同。

对相同内在类型的表达式的内在类型变量的内在分配根据需要“转换”种类类型参数。

复制输入/复制输出机制就像

<type>(kind=f_kind) f
<type>(kind=c_kind) c
c = f
call foo(c)
f = c

wherefc也可以是彼此相同形状的数组。

这总是复制。如果您想更花哨,可以在相关问题的答案中使用这些技术,使用指针,仅在默认类型和可互操作类型不同时才进行复制。

对于实数和整数内部类型,人们可能期望默认种类参数(或双精度real(kind=c_double))是可互操作的参数。默认逻辑不太可能是可互操作的:Fortran 的默认逻辑具有与默认实数相同的存储大小,这可能不是 C 的布尔类型所具有的。

字符自然也可能有可互操作的默认类型,但您还必须担心标量和数组之间的转换。同样,复制/关联链接答案中的技术在处理种类转换的同时处理这个问题。

考虑程序

  use, intrinsic :: iso_c_binding
implicit none
print 1, "float", KIND(0e0)==c_float
print 1, "double", KIND(0d0)==c_double
print 1, "int", KIND(1)==c_int
print 1, "char", KIND('')==c_char
print 1, "bool", KIND(.TRUE.)==c_bool
1 format (A,":",T10,L1)
end program

以上是在默认类型和 C 互操作类型之间转换 Fortran 字符和逻辑数组的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>