如何将已赋值Fortran指针的值复制到目标Fortran数组中
问题解决
错误根因
你混淆了Fortran两类操作的作用:
- 指针关联操作符
=>:作用是修改指针的指向目标,你写的f_p => Solution会让f_p直接放弃原本指向的C函数返回的数组,转而指向未初始化的本地数组Solution,所以后续打印才会出现乱码 - Fortran中只要指针已经和目标内存正确关联,直接写指针变量名就等价于访问指向内存的存储值,不需要类似C语言的
*p取值语法
修复方案
你要做的是把C数组里的值复制到Solution数组,不需要修改f_p的指向,直接用普通赋值操作即可。同时建议把Solution的类型改为和C返回数组一致的integer(c_int),避免跨语言类型不匹配隐患。
修改后的Fortran主程序如下:
program Test use, intrinsic :: iso_c_binding, only : c_ptr, & c_f_pointer, & c_int USE FTN_C type(c_ptr) :: c_p integer(c_int), pointer :: f_p(:) ! 类型和C返回数组对齐,避免隐式类型转换问题 integer(c_int), target :: Solution(10) c_p = C_LIBRARY_FUNCTION() call c_f_pointer(c_p, f_p, [10]) !c_f_pointer assigns the target, cptr, to the Fortran pointer fptr, and specifies its shape. ! 去掉指针关联,直接赋值:把f_p指向的C数组值复制到Solution数组 Solution = f_p print *, f_p print *, Solution end program Test
运行结果
修改后两个数组的输出完全一致,都是C函数中赋值的0~9:
./a.out 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
内容的提问来源于stack exchange,提问作者HSSH
相关产品推荐
相关产品推荐

