将可变长度字符串分配给固定长度字符串

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