我在Ruby中使用数组,并希望通过扩展.normalize方法来处理它们。该方法应修改数组,使其所有元素的总和为1。但是,在Ruby中进行此操作过于昂贵,因此我希望通过RubyInline在C中完成。
require "rubygems"
require "inline"
class Array
inline do |builder|
builder.c_raw '
static VALUE normalize(VALUE self) {
double total_size = 0, len;
int i;
VALUE* array = RARRAY_PTR(self);
len = RARRAY_LEN(self);
for(i=0; i < len; i++){
total_size += NUM2DBL(array[i]);
}
for(i=0; i < len; i++){
array[i] = INT2NUM(NUM2DBL(array[i])/total_size);
}
return array;
}'
end
end
a = [1,2,0,0,0,0,0,3,0,4]
puts a.normalize.inspect
这将导致:
$ ruby tmp.rb
tmp.rb:29: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
Aborted (core dumped)
编辑:经过一些调试,崩溃似乎发生在 。
VALUE* array = RARRAY_PTR(self);
gem install inline
。运行您的脚本:undefined method 'inline' for Array:Class (NoMethodError)
。检查了这个宝石的RDoc,没有内联方法。看起来像是一个编辑器,而不是C编译器。 - BernardKgem install RubyInline
进行安装。 - user1939480RARRAY(<array>) -> ptr
)。我不确定Check_Type(self, T_ARRAY);
是否仍然有效。如果我把它放在块的开头==>in 'normalize': wrong argument type false (expected Array) (TypeError)
。 - BernardK