Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用iso_c_绑定声明指针的指针?_C_Fortran_Interop_Fortran Iso C Binding - Fatal编程技术网

如何使用iso_c_绑定声明指针的指针?

如何使用iso_c_绑定声明指针的指针?,c,fortran,interop,fortran-iso-c-binding,C,Fortran,Interop,Fortran Iso C Binding,我正在用Fortran编写一个iso_c_绑定,用下面的原型调用一个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 ); 我的问题是如何在此接口中声明unsi

我正在用Fortran编写一个iso_c_绑定,用下面的原型调用一个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功能内部分配)

我目前起草了这个模块,但还没有测试它(我怀疑它会起作用)


尝试类型(C_PTR),意图(out)。然后需要使用Fortran函数c_f_pointer将c指针与Fortran指针关联起来。可能是C_CHAR类型。

至少
字符指针(C_ptr)
不是Fortran语言。你能重温一下你起草的Fortran代码块,让它在你认为合适的语法上更加正确吗?是的,我知道那是无效的,只是一个占位符。谷歌搜索,但只找到指针的例子,而不是指针的指针。谢谢,它的工作!这是我的,这是我的。然而,剩下的唯一问题是如何在fortran端“释放”数据
valgrind
在此测试代码中检测到内存泄漏。另一个后续问题-使用fortran本机类型与使用iso_c_绑定相比是否存在任何风险?例如,对于
c\u size\t
,我在fortran端使用了
整数(kind=8)
,这会导致任何副作用吗?类似地,对于
character(kind=c_char)
与本机
character
类型,关于释放c分配的缓冲区,我添加了一个c函数以释放调用,并将其添加到接口中。不使用
ISO_C_BINDING
中声明的种类值的风险在于编译器的种类值可能与C不匹配。为什么不使用
C\u SIZE\T
kind=8
本质上是不可移植的。正如您所做的,由于内存是在C端分配的,因此最好在C端释放内存。您可以选择将Fortran指针置零。
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