我有以下内联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代码相同?
答案 0 :(得分:1)
使用 RSTRING_PTR
将Ruby字符串转换为C字符串,然后使用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])) ...