Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Ruby Fiddle-Pass数组到C函数_C_Ruby_Fiddle - Fatal编程技术网

Ruby Fiddle-Pass数组到C函数

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

我试图使用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)
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*')]
,然后返回一个指针,我可以将其传递给函数。