代码之家  ›  专栏  ›  技术社区  ›  FangQ

如何使用iso_c_binding声明指针的指针?

  •  0
  • FangQ  · 技术社区  · 5 年前

    我正在写一篇 iso_c_绑定 在Fortran中调用具有以下原型的C函数

    int zmat_run(
        const size_t inputsize,
        unsigned char *inputstr, 
        size_t *outputsize, 
        unsigned char **outputbuf,
        const int zipid, 
        int *ret, 
        const int iscompress
    );
    

    我的问题是如何申报 unsigned char **outputbuf ,在这个接口中,c函数内部用于分配输出缓冲区的指针?

    此外,我应该在Fortran中使用什么数据类型作为传递给此的实际参数 outputbuf 参数?它应该是可分配的吗?(如果它是在c函数内部分配的)?

    我目前正在起草这个模块,但还没有对其进行测试(我怀疑它是否有效)。

    module zmatlib
      use iso_c_binding, only: c_char, c_size_t, c_ptr, C_NULL_CHAR
      interface
        integer(c_int) function zmat_run(inputsize, inputbuf, outputsize, outputbuf, zipid, ret, level) bind(C, name="zmat_run")
          use iso_c_binding
          integer(c_size_t), value :: inputsize
          integer(c_int), value :: zipid, level
          integer(c_size_t),  intent(out) :: outputsize
          integer(c_int),  intent(out) :: ret
          character(kind=c_char),  intent(in)  :: inputbuf(*)
          character pointer(c_ptr),intent(out) :: outputbuf
        end function zmat_run
      end interface
    end module
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   M. S. B.    5 年前

    尝试 类型(C_PTR)、意图(out) 。然后,您需要使用Fortran函数 c_f指针 将C指针与Fortran指针相关联。可能是类型 C_CHAR .