2009-07-12 105 views
5

我有一個函數比較2字符串字符char。我需要它運行得比Ruby更快,所以我使用RubyInline來重寫C中的函數。它的速度確實提高了大約100倍。功能如下所示:如何使用RubyInline將ruby數組轉換爲C數組?

require 'inline' 

    inline do |builder| 
    builder.c " 
     static int distance(char *s, char *t){ 
     ... 
     }" 
    end 

但是我需要比較unicode字符串。所以我決定使用unpack(「U *」)來比較整數數組。我無法從稀少的文檔中找到RubyInline如何將ruby數組傳遞給函數以及如何將它們轉換爲C數組。任何幫助表示讚賞!

+0

幫助沒問題,讓我知道結果如何。希望在完成時看到您的實施。 – 2009-07-13 17:38:43

+0

這裏是damerau_levenshtein距離代碼: http://gist.github.com/147023 對Ruby 1.8.7的作品就像一個魅力,但扼流圈1.9.1 – dimus 2009-07-14 15:51:20

+0

我更新的http://要點。 github.com/147023與1.9.1 ruby​​一起使用以及使用thnetos的幫助 – dimus 2009-07-15 21:30:31

回答

9

這有如何訪問紅寶石從C對象一個很好的破敗:http://rubycentral.com/pickaxe/ext_ruby.html

inline do |builder| 
    builder.c " 
    static VALUE some_method(VALUE s) { 
     int s_len = RARRAY(s)->len; 
     int result = 0; 

     VALUE *s_arr = RARRAY(s)->ptr; 

     for(i = 0; i < s_len; i++) { 
     result += NUM2INT(s_arr[i]); // example of reference 
     } 

     return INT2NUM(result); // convert C int back into ruby Numeric 
    }" 
end 

然後在Ruby中,你可以只值傳遞給它喜歡:

object.some_method([1,2,3,4]) 

希望這可以幫助你。

4

鑑於從上面的答案代碼,這裏是代碼,會爲Ruby 1.8.6 1.9.1工作:

inline do |builder| 
    builder.c " 
    static VALUE some_method(VALUE s) { 
     int s_len = RARRAY_LEN(s); 
     int result = 0; 
     int i = 0; 

     VALUE *s_arr = RARRAY_PTR(s); 

     for(i = 0; i < s_len; i++) { 
     result += NUM2INT(s_arr[i]); // example of reference 
     } 

     return INT2NUM(result); // convert C int back into ruby Numeric 
    }" 
end 

希望這也:)