string - 在 Fortran 中分配字符数组

标签 string fortran fortran-iso-c-binding character-arrays

我必须编写一个可以被 C 和 Fortran 调用的子程序。该子例程将文件名作为其参数之一。我知道要与 C 很好地互操作,ISO C 绑定(bind)建议使用字符数组进行互操作。

我的问题是:是否存在易于编写的字符数组文字之类的东西?我有一个像这样的子程序:

subroutine my_sub(char_array)
  use iso_c_binding, only: c_char
  char(kind=c_char, len=1), dimension(:), intent(in) :: char_array
  ...
end subroutine my_sub

是否可以通过以下方式调用它:
call my_sub('Hello World!')

还是我必须做一些可怕的事情,例如:
call my_sub((/ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' /))

我的主要问题似乎是它不喜欢假定形状的数组,并且给它一个集合(大)大小也会输出所有后来碰巧被拾取的垃圾内存。

有没有更好的方法来做到这一点?

最佳答案

序列关联规则允许类似的情况。您可以使用

call my_sub('Hello World!')

但前提是您将数组设为假定大小 dimension(*)或明确的形状。

通常,在 Fortran 2008 中,您不能将假定的形状数组用于 C 互操作过程。这将改变我的 future ,但会更加复杂。

另一个重要的评论。只需使用 iso_c_binding模块不会使过程 C 互操作。 您必须使用 bind(C) ,可能带有绑定(bind)名称。这才是最重要的。即使没有模块,您也可以创建可互操作的程序(仅限有限的程序)。传递字符串而不是 1 字符数组的特性也取决于此。

这就是为什么我不喜欢说“使用 iso_c_binding 创建可互操作的过程”。

该过程的接口(interface)必须在 Fortran 中显式。

关于string - 在 Fortran 中分配字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386963/

相关文章:

interop - 为什么使用 BIND(C, NAME ="name") 属性时我的 fortran 函数没有导出

C++:没有 <cstring> 的字符串函数

java - 当我们有字符串池时为什么要进行字符串重复数据删除

filter - 在 Fortran 中是否可以确定两个多态对象是否是相同的派生类型?

python - Fortran 类似于 python 的 super()?

fortran - 尝试使用 f2py 围绕两个 C 对象编写 Fortran 包装器时出现段错误

c# - 用空字符串替换可变字符串

Java - 按数字和字母拆分字符串

c++ - 尝试将我的 C++ 可执行文件与 Fortran 库(Cygwin 环境)链接起来

c - 如何在 C 的 fortran 例程 "called"中分配一个数组