Ruby Fiddle-Pass数组到C函数
我试图使用Fiddle(2.0.0-p247)将数组传递给C函数。这是我的ruby脚本Ruby Fiddle-Pass数组到C函数,c,ruby,fiddle,C,Ruby,Fiddle,我试图使用Fiddle(2.0.0-p247)将数组传递给C函数。这是我的ruby脚本 require 'fiddle' clib = Fiddle.dlopen('sum_array') f = Fiddle::Function.new(clib['sum_array'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT], Fiddle::TYPE_INT) a = [1,2,3] ptr = Fiddle::Pointer.new(a.object_id) p
require 'fiddle'
clib = Fiddle.dlopen('sum_array')
f = Fiddle::Function.new(clib['sum_array'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT], Fiddle::TYPE_INT)
a = [1,2,3]
ptr = Fiddle::Pointer.new(a.object_id)
puts "Sum is #{f.call(ptr,3)}"
我还尝试将指针
定义替换为
ptr = Fiddle::Pointer.new(a.object_id, 3 * Fiddle::SIZEOF_INT)
C功能如下所示:
int sum_array(int a[], int num_elements)
{
int i, sum=0;
for (i=0; i<num_elements; i++)
{
sum = sum + a[i];
}
return(sum);
}
int sum_数组(int a[],int num_元素)
{
int i,和=0;
对于(i=0;我懒得检查,但您必须使用Array#pack
:a.pack('i3')
。对象ID不是地址,即使是地址,数据也不会是预期格式(int[3]
)。谢谢@cremno,您的评论帮助我解决了这个问题。我应该将指针定义为Fiddle::pointer[a.pack('i*)]
这将返回一个指针,然后我可以传递给函数。我懒得检查,但您必须使用数组#pack
:a.pack('i3')
。对象ID不是地址,即使是地址,数据也不会是预期格式(int[3]
)。谢谢@cremno,您的评论帮助我找到了答案。我应该将指针定义为Fiddle::pointer[a.pack('I*')]
,然后返回一个指针,我可以将其传递给函数。