返回fortran中未知长度的字符串

Vol*_*orm 3 string fortran

对于相当简单的问题道歉,我似乎无法找到任何好的fortran文档.

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

character(*) function readCString()
  character*512 str
  read(1, *) str
  readCString = TRIM(str)//char(0)
  return
end function readCString
Run Code Online (Sandbox Code Playgroud)

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

TRIM(str)//char(0)
Run Code Online (Sandbox Code Playgroud)

与我代替恒星的数字长度不同.我对fortran很新,但我试图将一些fortran代码与C接口(因此为null终止符).

谢谢你的帮助.

M. *_* B. 7

使用字符(星号)作为函数返回不是一个好主意.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
Run Code Online (Sandbox Code Playgroud)

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