对于相当简单的问题道歉,我似乎无法找到任何好的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终止符).
谢谢你的帮助.
使用字符(星号)作为函数返回不是一个好主意.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和字符串)提供了一些示例代码,但我找不到问题.