我有以下C代码:
VALUE find_index(VALUE arr, VALUE num_elements, VALUE element){
....
}
....
VALUE array_distance(VALUE arr1, VALUE arr2){
long arr1_len = RARRAY_LEN(arr1);
VALUE *c_arr2 = RARRAY_PTR(arr2);
long i;
for(i = 0; i < arr2_len; i++){
long arr1_index = find_index(arr1, arr1_len, c_arr2[i]);
....
}
}
编译时,我收到以下错误:
In function ‘VALUE array_distance(VALUE, VALUE, VALUE)’: error: too few arguments to function ‘VALUE find_index(VALUE, VALUE, VALUE, VALUE)’
有人可以帮忙解决这里的错误吗?
答案 0 :(得分:0)
如果你想在其他C代码中使用你的C函数,你需要使用builder.c_raw
而不是builder.c
,因为RubyInline实际上试图通过更改你的代码来让你的生活更轻松,这样你就可以快速编写简单的函数。但这会产生误导,并使您无法从其他C函数内部调用C函数,因为方法签名会被更改。这应该让你开始:
class Test
inline :C do |builder|
builder.c_raw <<-'EOC', :arity => 3
static VALUE
find_index(int argc, VALUE *argv, VALUE self) {
VALUE arr = argv[0];
VALUE num_elements = argv[1];
VALUE element = argv[2];
// actual code...
}
EOC
builder.c_raw <<-'EOC', :arity => 2
static VALUE
array_distance(int argc, VALUE *argv, VALUE self) {
long arr1_len = RARRAY_LEN(argv[0]);
VALUE *c_arr2 = RARRAY_PTR(argv[1]);
long i;
for(i = 0; i < arr2_len; i++){
VALUE[] find_index_argv = {arr1, arr1_len, c_arr2[i]};
long arr1_index = find_index(argc, find_indev_argv, self);
// more code...
}
// must have a return value!
return Qnil;
}
EOC
end
end