RubyInline:错误:函数的参数太少

时间:2013-12-18 06:47:48

标签: c ruby inline

我有以下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)’

有人可以帮忙解决这里的错误吗?

1 个答案:

答案 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