C RubyLine将值数组从一个函数传递到另一个函数
我试图将一个ruby数组从一个C函数传递到另一个C函数,但我一直得到以下错误C RubyLine将值数组从一个函数传递到另一个函数,c,ruby,C,Ruby,我试图将一个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 = RAR
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
要求“内联”
类数组
内联do |生成器|
builder.c_singleton“
静态值c_和(值arr){
双结果=0;
长i,len=RARRAY_len(arr);
值*c_arr=RARRAY_PTR(arr);
对于(i=0;i我决定稍微改变一下。下面是我如何使事情正常工作的
我在/lib文件夹中创建了一个名为array_math.rb的文件(我在rails应用程序中使用它),该文件使用
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
我决定做些改变。以下是我如何让事情运转起来的
我在/lib文件夹中创建了一个名为array_math.rb的文件(我在rails应用程序中使用它),该文件使用
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