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

标签 c fortran fortran-iso-c-binding

我正在尝试将一些 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/

相关文章:

c - LR Merc_timer_handle_t

pointers - 如何使用 c_ptr 拥有一个具有不同类型参数的 Fortran 函数?

c - 多维数组是通过临时指针访问的吗?

包括使用 Fortran 预处理器进行显示

fortran - 根据输入 i,j 从 3x3 中提取次矩阵

string - 为什么 GDB 认为我的 Fortran 字符串是 ~4GiB

c - 从 C 库头自动生成 Fortran 2003 绑定(bind)(使用 iso_c_bindings 内部模块)

fortran - 使用 c_f_pointer 是 fortran 数组是否就地 reshape

c - 如何使用连续的 malloc 函数调用增加 C 程序的内存 (RAM)

c - fork() 是否复制父级的所有内存?