代码之家  ›  专栏  ›  技术社区  ›  Kyle_S-C

在Fortran中指定字符数组

  •  4
  • Kyle_S-C  · 技术社区  · 12 年前

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

    我的问题是:有没有像字符数组这样的文字很容易写?我有一个这样的子程序:

    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', '!' /))
    

    我的主要问题似乎是它不喜欢假设的形状数组,并且给它一个设置(大)的大小也会输出所有的垃圾内存。

    有更好的方法吗?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Vladimir F Героям слава    12 年前

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

    call my_sub('Hello World!')
    

    但前提是假设阵列的大小 dimension(*) 或显式形状。

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

    还有一句重要的话。仅使用 iso_c_binding 模块不能使程序C互操作。 你必须使用 bind(C) ,可能具有绑定名称。这是最重要的。即使没有模块,也可以创建可互操作的过程(仅限于有限的过程)。传递字符串而不是1字符数组的特性也取决于此。

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

    过程的接口必须在Fortran中显式。

        2
  •  3
  •   yamajun    12 年前

    您可以使用传递函数。下面是一个示例代码。

    program string0
      implicit none
      character, allocatable :: string(:)
      character(len = :), allocatable :: text
    
      text = 'this is a pen'
      string = transfer(text, ' ', size = len_trim(text))
      string = achar(iachar(string) - 32)
      text = transfer(string, text)
      print *, text
    
      stop
    end program string0
    
    推荐文章