C RubyLine:错误:参数太少,无法运行

C RubyLine:错误:参数太少,无法运行,c,ruby,inline,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++

我有以下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]);
    ....
  }
}
值查找索引(值arr、值num元素、值元素){
....
}
....
值数组_距离(值arr1,值arr2){
长arr1_len=RARRAY_len(arr1);
值*c_arr2=RARRAY_PTR(arr2);
龙我;
对于(i=0;i
编译此文件时,出现以下错误:

In function ‘VALUE array_distance(VALUE, VALUE, VALUE)’: error: too few arguments to function ‘VALUE find_index(VALUE, VALUE, VALUE, VALUE)’ 在函数“值数组_距离(值、值、值)”中: 错误:函数“VALUE find_index(VALUE,VALUE,VALUE,VALUE)”的参数太少
有人能帮你解决问题吗?

如果你想在里面的其他C代码中使用你的C函数,你需要使用
builder.C\u raw
而不是
builder.C
,因为RubyLine实际上试图通过更改代码来简化你的生活,这样你就可以快速编写简单的函数。然而,这是误导性的,并阻止您从其他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
类测试
内联:C do | builder|

builder.c_原始…名称冲突?从find_index中尝试一个不同的名称,看看是否有效?我能想到的另一件事是,它在其中插入了一个隐含的
self
,这是在较低级别上实现OO的方法之一。@Narfanator谢谢!不同的名字没有帮助。如果它插入了一个隐含的自我,你知道我们如何调用这个函数吗?@p11y不知道。。不在数组中确保函数原型正确。
VALUE[]find_index_argv={arr1,arr1_len,c_arr2[i]}工作不正常。它表示
错误:在“[”标记之前应为非限定id