Fortran Coder

查看: 19033|回复: 17
打印 上一主题 下一主题

[混编] 求助:关于iso_c_binding中C端多重指针参数接口的写法

[复制链接]

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
楼主
发表于 2021-7-30 08:24:48 | 显示全部楼层
本帖最后由 布衣龙共 于 2021-7-30 08:27 编辑

[buyi@OLCC ~]$ gfortran a.f90 a.c -o x
[buyi@OLCC ~]$ ./x
fcode
[buyi@OLCC ~]$

[Fortran] 纯文本查看 复制代码
use ISO_C_Binding
implicit none
interface
  integer(c_int) function get_table(val) bind(c)
    import
    type(c_ptr) :: val
  end function
end interface
character(8) ,target :: Results(3,10)
type(c_ptr) , target :: val
integer :: i
val = c_loc(Results)
i =  get_table(c_loc(val))
write(*,*) Results(1,1)
end

[C] 纯文本查看 复制代码
#include <stdio.h>

int get_table(char ***Results){
  (**Results)[0] = 'f';
  (**Results)[1] = 'c';
  (**Results)[2] = 'o';
  (**Results)[3] = 'd';
  (**Results)[4] = 'e';
}

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
沙发
发表于 2021-7-30 17:04:41 | 显示全部楼层
我用 windows , VS + Ifort 试了,也是OK的啊


54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
板凳
发表于 2021-7-30 17:07:41 | 显示全部楼层
第13行,是的, val 已经是地址了,还必须套一个 c_loc
因为 C 语言的接口是 ***Results,而不是 **Results

C 语言不是“不需要”指定大小,而是根本不知道大小(除非你额外传递给他)
所以,C 语言是很容易越界的。

int get_table(char ***Results );
这个函数,必须要求调用者分配好足够的大小。

没有自动分配的方法。

Results 可以是可分配的,但也必须分配好大小,再 get_table

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
地板
发表于 2021-8-16 16:14:56 | 显示全部楼层
本帖最后由 布衣龙共 于 2021-8-16 16:17 编辑

原来是 sqlite。sqlite3_get_table 的参数,你给他一个指针,由它内部分配空间,最后把它分配的空间的地址告诉 Fortran。
我们之前的思路,都是由 Fortran 分配空间,构建好,然后交给 C 去填充。

这两者的思路是不同的。

[Fortran] 纯文本查看 复制代码
type(c_ptr),target :: val
type(c_ptr),pointer:: p1(:)
istat = sqlite3_get_table(db,"select * from MY_TABLE",val,nRow,nColumn,ErrMsg)
  call c_f_pointer(val,p1,[nRow*nColumn])
  Do i = 1 , nRow
    Do j = 1 , nColumn
      call c_f_pointer( p1( (i-1)*nColumn + j ),cRes)
      k = index(cRes,c_null_char)
      Results(j,i) = cRes(:k-1)
    End Do
  End Do

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
5#
发表于 2021-8-16 17:44:23 | 显示全部楼层
可以,没关系的。

Fortran 的指针不需要释放,C那边你找找,可能有别的函数来释放。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-3 08:32

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表