如何使用iso_c_绑定声明指针的指针?
我正在用Fortran编写一个iso_c_绑定,用下面的原型调用一个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
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