以下函数应该将 C 字符串转换为 Fortran 字符串,并且在发布版本中工作正常,但在调试中不行:
! Helper function to generate a Fortran string from a C char pointer
function get_string(c_pointer) result(f_string)
use, intrinsic :: iso_c_binding
implicit none
type(c_ptr), intent(in) :: c_pointer
character(len=:), allocatable :: f_string
integer(c_size_t) :: l_str
character(len=:), pointer :: f_ptr
interface
function c_strlen(str_ptr) bind ( C, name = "strlen" ) result(len)
use, intrinsic :: iso_c_binding
type(c_ptr), value :: str_ptr
integer(kind=c_size_t) :: len
end function c_strlen
end interface
l_str = c_strlen(c_pointer)
call c_f_pointer(c_pointer, f_ptr)
f_string = f_ptr(1:l_str)
end function get_string
然而,似乎c_f_pointer https://gcc.gnu.org/onlinedocs/gfortran/C_005fF_005fPOINTER.html不告诉 Fortran 指针到字符串,f_ptr
,它指向的字符串的长度。在调试版本中,边界检查处于活动状态,这会导致
Fortran runtime error: Substring out of bounds: upper bound (35) of 'f_ptr' exceeds string length (0)
我在用着gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
并将标准定为2008年。
我的问题:有什么办法可以告诉f_ptr
它的长度而不改变声明或者我在这里做的事情根本上是错误的吗?
如果我指定形状,它似乎可以正确运行,但为此f_ptr
需要是一个数组:
character(len=:), allocatable :: f_string
character(len=1), dimension(:), pointer :: f_ptr
...
call c_f_pointer(c_pointer, f_ptr, [l_str])
但是,我找不到一种方法将排名 1 的字符串转换为character(len=:), allocatable :: f_string
,显然排名为 0。
第二个问题:有什么办法可以转移吗?f_ptr
数据进入f_string
在这个例子中?