2013-12-18 164 views
0

我有下面的C代码:了RubyInline:错误:参数太少运作

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

...名称冲突?尝试一下find_index的不同名称,看看是否有效?我能想到的另外一件事是,它在这里插入一个隐含的“自我”,这是(更低级别的)OO的一种方式。 – Narfanator

+0

@Narfanator谢谢!不同的名字没有帮助。如果它插入隐含的自我,我们怎么称呼这个函数? –

+0

@ p11y否..不在'Array'类内 –

回答

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 
+0

'VALUE [] find_index_argv = {arr1,arr1_len,c_arr2 [i]};'工作不正常。它说'错误:预期在'['token'之前的非限定id –