3

我有以下内联 C 函数,它有助于比较两个数组。我必须将数组 1 中的每个元素与数组 2 进行比较并获得计数。

    builder.c '
      VALUE arr_distance(VALUE arr1, VALUE arr2){            
        long arr1_len = RARRAY_LEN(arr1);
        long arr2_len = RARRAY_LEN(arr2);            
        if(arr1_len == 0 || arr2_len == 0){
          return 0.0;
        }
        else{
          long i, j;
          VALUE count = 0;
          VALUE *c_arr1 = RARRAY_PTR(arr1);
          VALUE *c_arr2 = RARRAY_PTR(arr2);

          for(i = 0; i < arr1_len; i++){
            for(j = 0; j < arr2_len; j++){
              if(c_arr1[i] == c_arr2[j]){ //This comparison does not work
                count++;
              }
            }
          }
          return count;
        }            
      }'

如何比较两个字符串以检查它们是否与内联 C 代码相同?

4

1 回答 1

1

使用 将 Ruby 字符串转换为 C 字符串RSTRING_PTR,然后用于strcmp比较字符串是否相等。

使用rb_str_cmp

require 'inline'

class Hello
  inline(:C) do |builder|
    builder.c '
      VALUE arr_distance(VALUE arr1, VALUE arr2){            
        long arr1_len = RARRAY_LEN(arr1);
        long arr2_len = RARRAY_LEN(arr2);            
        if(arr1_len == 0 || arr2_len == 0){
          return INT2NUM(0);
        }
        else{
          long i, j;
          int count = 0;
          VALUE *c_arr1 = RARRAY_PTR(arr1);
          VALUE *c_arr2 = RARRAY_PTR(arr2);

          for(i = 0; i < arr1_len; i++){
            for(j = 0; j < arr2_len; j++){
              if(rb_str_cmp(c_arr1[i], c_arr2[j]) == 0){
                count++;
              }
            }
          }
          return INT2NUM(count);
        }            
      }'
  end
end

p Hello.new.arr_distance(['1', '2', '3'], ['2', '4', '8', '1']) # => 2

不要忘记Fixnum使用. 将 C int 转换为 Ruby INT2NUM

更新

您还可以使用rb_str_equal

if (rb_str_equal(c_arr1[i], c_arr2[j])) ...
于 2013-11-07T05:22:47.450 回答