You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fortran默认类型与C兼容类型间转换字符、逻辑数组

完整实现方案

你只需要在包装函数内部声明和旧F77接口匹配的本地变量,做显式类型转换即可,以下是可直接使用的完整代码:

subroutine foo_wrapper(c_s, c_l) bind(C, name="foo_wrapper")
  use ISO_C_BINDING, only: C_CHAR, C_BOOL
  implicit none
  ! C兼容接口参数
  character(kind=C_CHAR, len=1), dimension(10), intent(inout) :: c_s
  logical(kind=C_BOOL), dimension(10), intent(inout) :: c_l

  ! 声明和F77子例程匹配的本地变量
  character(len=10) :: f_s
  logical :: f_l(10)
  integer :: i

  ! ========== 正向转换:C类型转Fortran默认类型 ==========
  ! 字符数组转长度为10的标量字符串
  do i = 1, 10
    f_s(i:i) = c_s(i)
  end do
  ! C_BOOL逻辑数组转默认logical类型
  do i = 1, 10
    f_l(i) = logical(c_l(i), kind=kind(.false.))
  end do

  ! 调用原始F77子例程
  call foo(f_s, f_l)

  ! ========== 反向转换:Fortran类型转C兼容类型 ==========
  ! 标量字符串转回C字符数组
  do i = 1, 10
    c_s(i) = f_s(i:i)
  end do
  ! 默认logical转回C_BOOL类型
  do i = 1, 10
    c_l(i) = logical(f_l(i), kind=C_BOOL)
  end do
end subroutine foo_wrapper

关键说明

  • 字符转换用循环逐位赋值的方式兼容性最好,所有支持Fortran 2003及以上标准的编译器都可以正常编译运行,不需要依赖编译器扩展。如果追求代码简洁也可以用transfer内置函数替代循环:
    • 正向:f_s = transfer(c_s, mold=f_s)
    • 反向:c_s = transfer(f_s, mold=c_s)
  • 逻辑类型转换必须显式指定kind,避免不同编译器对C_BOOL真假值的映射规则不同导致的逻辑错误
  • 建议给参数加上intent(inout)明确参数的读写属性,也方便编译器做语法检查

内容的提问来源于stack exchange,提问作者gspr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:48:03