Ruby:取消引用指针

时间:2015-02-26 09:34:57

标签: c++ ruby-on-rails ruby pointers

如何在Ruby中取消引用指针?

我正在使用FFI调用一些C / C ++ DLL函数。其中一个函数返回一个int数组(int *)。

extern "C" WIN32PROJECT3_API int* TestData()
{
    int* v;

    v = (int*)malloc(sizeof(int)* 1000);

    v[3] = 123456;

    return v;
}

我在Ruby中有指针,但是当我尝试

v = TestModule.TestData();
puts v[3]

我得到的是:

#<FFI::Pointer address=0x700f5e>

这是完全正常的,因为这是指针的实际值。我只需要解除它以获得值“123456”

3 个答案:

答案 0 :(得分:3)

使用read_int

示例:

v = TestModule.TestData();
puts v[3].read_int

答案 1 :(得分:2)

您正在寻找AbstractMemory#get_array_of_int32方法。

  

#get_array_of_int32(偏移量,长度)⇒数组&lt; Fixnum&gt;

     

从偏移offset获取内存中的32位整数。

v = TestModule.TestData.get_array_of_int32(0, 1000) # first convert your memory pointer to array
puts v[3] #=> 123456 

您也可以使用AbstractMemory#get_int32方法:

size_of_int = 4 # size of int32 in bytes
offset = 0
v = TestModule.TestData
v[3 * size_of_int].get_int32(offset) #=> 123456

答案 2 :(得分:1)

我自己从未用Ruby调用过C / C ++,但基于文档看起来你必须调用read_string然后将其转换为int:

v[3].read_string.to_i

希望这有帮助。