将可变长度字符串分配给固定长度字符串
Assign variable length string to fixed length string
我正在尝试将一些 C 代码桥接到 Fortran 中。但是,我无法将 C API 返回的可变长度 C 字符串转换为 Fortran API.
所需的固定长度字符串
这是无法编译的代码的简化版本 - 我得到 The shapes of the array expressions do not conform
。
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
建立一个新字符串和 returns 它,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 代码桥接到 Fortran 中。但是,我无法将 C API 返回的可变长度 C 字符串转换为 Fortran API.
所需的固定长度字符串这是无法编译的代码的简化版本 - 我得到 The shapes of the array expressions do not conform
。
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
建立一个新字符串和 returns 它,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