如何在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
相关产品推荐
相关产品推荐

