Fortran Coder

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

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

[复制链接]

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

楼主
发表于 2021-7-31 09:05:29 | 显示全部楼层
C函数应该是一个三维数组,你可能需要构建一个指针链给他用。

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

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

[Fortran] 纯文本查看 复制代码
Program Main
  use ISO_C_Binding
  use CLangMultiDimensionArrayLink2D
  implicit none

  interface
    integer(c_int) function get_table(val) bind(c)
      import
      type(c_ptr) , value :: val
    end function
  end interface

  Integer , parameter :: M = 6 , N = 4
  character(8) ,target :: Results(M,N)
  integer :: i
  type(CLang2DArrayLink) :: linkResults
  i =  get_table( linkResults%Set(Results) )
  write(*,"(2(a8,1x))") Results(1,1),Results(M,N)
End Program Main


以下模块可以复制粘贴,不做修改。
[Fortran] 纯文本查看 复制代码
Module CLangMultiDimensionArrayLink2D

  use , Intrinsic :: ISO_C_Binding
  Implicit None
  private

  Type , public :: CLang2DArrayLink
    type(c_ptr) , pointer :: p1(:) , p2(:,:)
  contains
    Procedure :: Set
    Final :: Release
  End Type CLang2DArrayLink

contains

  Type(c_ptr) Function Set( this , datas ) result ( cptr )
    class(CLang2DArrayLink) :: this
    class(*) , intent(IN) :: datas(1:,1:)
    integer :: sizes(2) , i , j
    sizes = shape(datas)
    if( associated(this%p1) ) deallocate(this%p1,this%p2)
    Allocate(this%p1(sizes(2)),this%p2(sizes(1),sizes(2)))
    Do i = 1 , sizes(2)
      Do j = 1 , sizes(1)
        this%p2(j,i) = c_loc(datas(j,i))
      End Do
      this%p1(i) = c_loc(this%p2(1,i))
    End Do
    cptr = c_loc(this%p1(1))
  End Function Set

  Subroutine Release( this )
    type(CLang2DArrayLink) :: this
    if( associated(this%p1) ) deallocate(this%p1,this%p2)
  End Subroutine Release  

End Module CLangMultiDimensionArrayLink2D




1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2021-8-18 11:06:26 | 显示全部楼层
sss = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"c
istat = sqlite3_bind_text(stmt, 1, sss, 32, c_null_ptr);

这样就可以了。此处sss只能是引用,不能是表达式。
因为给 C 语言的是一个指针,而表达式结果是临时存放的,一旦整个语句结束,表达式的结果就清空了。
你试试,这样都不行:
istat = sqlite3_bind_text(stmt, 1, (sss), 32, c_null_ptr);
因为 (sss) 也是一个表达式。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2021-8-19 13:07:30 | 显示全部楼层
sqlite3_bind_text 的时候,并没有写入,只是存入地址。
等到 sqlite3_step 的时候,才会真正写入。
因为你都是用的 s_data 这个变量,所以地址相同。
最后,所有的值,都是最后一次的值

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2021-8-20 19:29:11 | 显示全部楼层
     function sqlite3_reset(stmt) bind(c)
       import
       type(c_ptr), value :: stmt
       integer(c_int) sqlite3_reset
     end function sqlite3_reset


    istat = sqlite3_step(stmt)
    write(*,"(A,I0,A,I0)") "第",i,"次sqlite3_step返回",istat
    istat = sqlite3_reset(stmt)

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-2 22:44

Powered by Tencent X3.4

© 2013-2024 Tencent

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