Ruby: 取消引用指针
Ruby: dereferencing pointer
如何取消引用 Ruby 中的指针?
我正在使用 FFI 调用一些 C/C++ DLL 函数。其中一个函数 returns 一个整数数组 (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”
我自己从未从 Ruby 调用过 C/C++,但根据文档,您似乎必须调用 read_string
然后将其转换为 int:
v[3].read_string.to_i
希望对您有所帮助。
您正在寻找 AbstractMemory#get_array_of_int32 方法。
#get_array_of_int32(offset, length) ⇒ Array < Fixnum >
Get 32-bit ints in memory from offset offset
.
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
使用read_int
示例:
v = TestModule.TestData();
puts v[3].read_int
如何取消引用 Ruby 中的指针?
我正在使用 FFI 调用一些 C/C++ DLL 函数。其中一个函数 returns 一个整数数组 (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”
我自己从未从 Ruby 调用过 C/C++,但根据文档,您似乎必须调用 read_string
然后将其转换为 int:
v[3].read_string.to_i
希望对您有所帮助。
您正在寻找 AbstractMemory#get_array_of_int32 方法。
#get_array_of_int32(offset, length) ⇒ Array < Fixnum >
Get 32-bit ints in memory from offset
offset
.
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
使用read_int
示例:
v = TestModule.TestData();
puts v[3].read_int