我正在尝试将ruby数组从一个C函数传递到另一个C函数但我一直收到以下错误
error: too few arguments to function ‘c_sum’
这是我的代码
require 'inline'
class ArrayMath
inline do |builder|
builder.c_singleton "
static VALUE c_sum(VALUE arr){
double result = 0;
long i, len = RARRAY_LEN(arr);
VALUE *c_arr = RARRAY_PTR(arr);
for(i=0; i<len; i++) {
result += NUM2DBL(c_arr[i]);
}
return rb_float_new(result);
}"
builder.c_singleton "
static VALUE c_avg(VALUE arr){
double sum, result, len = RARRAY_LEN(arr);
// c_sum returns a ruby float
sum = NUM2DBL(c_sum(arr));
result = sum / len;
return rb_float_new(result);
}"
end
class << self
alias sum c_sum
alias avg c_avg
end
end
我在尝试
时遇到错误ArrayMath.avg([2,3.4,5.24])
答案 0 :(得分:0)
我决定稍微改变一下。以下是我开展工作的方式。
我在/ lib文件夹中创建了一个名为array_math.rb的文件(我在rails应用程序中使用它),它从application.rb初始化了
config.after_initialize do
require "#{Rails.root}/lib/arr_math.rb"
end
这里是array_math.rb
class Array
require 'inline'
inline do |builder|
builder.c <<-EOC
static VALUE
rb_ary_sum(){
double result = 0;
long i, len = RARRAY_LEN(self);
VALUE *c_arr = RARRAY_PTR(self);
for(i=0; i<len; i++) {
result += NUM2DBL(c_arr[i]);
}
return rb_float_new(result);
}
EOC
builder.c <<-EOC
static VALUE
rb_ary_avg(){
double result = 0;
double sum, len = RARRAY_LEN(self);
sum = NUM2DBL( rb_ary_sum(self) );
result = sum/len;
return rb_float_new(result);
}
EOC
end
def sum
rb_ary_sum
end
def avg
rb_ary_avg
end
end
现在我们可以这样做:
arr = [2,3,6.7,3.49]
arr.sum => 15.19
arr.avg => 3.7975