我正在尝试将一些 C 代码桥接到 Fortran 中。但是,我无法将 C API 返回的可变长度 C 字符串转换为 Fortran API 所需的固定长度字符串。
这是无法编译的代码的简化版本 - 我得到数组表达式的形状不符合
。
character*200 function getValueFromC()
use cbridge
implicit none
type(c_ptr) :: resultString
integer(kind=c_int) :: resultLength
character, pointer, dimension(:) :: string
call c_bridge_getValue(bridge, resultString, resultLength)
call c_f_pointer(resultString, string, (/ resultLength /) )
getValueFromC = string
call c_bridge_releaseString(resultString)
end function getValueFromC
cbridge
只是包含 c_bridge_getValue()
和 c_bridge_releaseString
定义以及 bridge
指针(只是一个 void*
)
c_bridge_getValue()
只是 malloc
建立一个新字符串并返回它,然后 c_bridge_releaseString()
free
是内存。
所以我的问题是,我需要做什么才能将 string
变量分配给 getValueFromC
?
最佳答案
一种解决方案是循环并分配给字符串切片。我尚未验证这是否 100% 正确,但它可以为我编译...
character*200 function getValueFromC()
use cbridge
implicit none
type(c_ptr) :: resultString
integer(kind=c_int) :: resultLength
character, pointer, dimension(:) :: string
call c_bridge_getValue(bridge, resultString, resultLength)
call c_f_pointer(resultString, string, (/ resultLength /) )
do i = 1, min(200, resultLength)
getValueFromC(i:i) = string(i)
end do
call c_bridge_releaseString(resultString)
end function getValueFromC
关于c - 将可变长度字符串分配给固定长度字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35862604/