【问题标题】:Returning character string of unknown length in fortran在fortran中返回未知长度的字符串
【发布时间】:2010-06-29 14:37:04
【问题描述】:

为这个相当简单的问题道歉,我似乎找不到任何好的 fortran 文档。

我正在尝试编写一个从单元读取、修剪输出并附加空终止符的函数,例如:

character(*) function readCString()
  character*512 str
  read(1, *) str
  readCString = TRIM(str)//char(0)
  return
end function readCString

但是,我知道这不起作用,但它可以编译。分段错误最近不是我的朋友。如果在函数关键字之前没有“字符(*)”,它将无法编译,并且用任何值代替星号也会中断,很可能是因为:

TRIM(str)//char(0)

与我在星号处放置的数字的长度不同。 我对 fortran 很陌生,但正在尝试将一些 fortran 代码与 C 接口(因此是空终止符)。

感谢您的帮助。

【问题讨论】:

    标签: string fortran


    【解决方案1】:

    character(star) 用作函数返回不是一个好主意。 character(star) 不是动态可变长度字符串——它意味着从调用者那里获取长度。所以我建议要么使用固定长度的字符串作为函数返回,要么使用字符(*)作为子程序参数——但在这种情况下,调用者必须提前保留内存,这只是将长度固定给调用者。如果你真的不知道最大长度并且必须有一个动态可变长度的字符串,那么有办法做到这一点。有一个可变长度字符串模块。 Fortran 2003 具有可分配的缩放器,尽管这并未得到广泛实施。您可以使用单个字符的数组——可分配数组已经存在很长时间了。

    这是一个作为 Fortran 工作的方法:

    module test_func_mod
    contains
    function readCString()
      use iso_c_binding
      character (kind=c_char, len=512)  :: readCString
      character (kind=c_char, len=511) :: str
      read(1, *) str
      readCString = TRIM(str) // C_NULL_CHAR
      return
    end function readCString
    
    end module test_func_mod
    
    program test
    
    use test_func_mod
    
    open (unit=1, file="temp.txt")
    write (*, *) readCString()
    
    end program test
    

    如果您想连接 Fortran 和 C,我建议使用新的 ISO C 绑定。它提供了一种标准的、因此可移植的方法来连接 Fortran 和 C 或任何使用 C 传递约定的语言。与过去必须使用的 hack 相比,它更易于使用且更不容易破解。虽然正式成为 Fortran 2003 的一部分,但它已经被众多编译器支持。字符串过去特别困难,一些编译器具有隐藏的长度参数等。ISO C 绑定使所有这些对程序员都是透明的。我记得在 stackoverflow 上为类似问题(Fortran、C 和字符串)提供了一些示例代码,但我找不到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2015-04-27
      • 2013-01-23
      相关资源
      最近更新 更多