2013-12-18 163 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 –