gpt4 book ai didi

使用 ruby​​ FFI 在 ruby​​ 中创建静态数组类

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:40 24 4
gpt4 key购买 nike

我想在 ruby​​ 中实现我自己的静态数组类。它将是一个具有固定容量的数组,并且数组中的所有元素都是单一类型。为了直接访问内存,我使用了 FFI gem https://github.com/ffi/ffi它可以创建您自己的 C 函数并在您的 ruby​​ 程序中使用它们。我创建了一个非常简单的 C 函数,它为整数数组分配内存并返回指向内存空间的指针:

int * create_static_array(int size) {
int *arr = malloc(size * sizeof(int));
return arr;
}

这是我使用 create_static_array 的 ruby​​ static_array 类:

require 'ffi'
class StaticArray
attr_accessor :pointer, :capacity, :next_index
extend FFI::Library

ffi_lib './create_array/create_array.so'
attach_function :create_static_array, [:int], :pointer

def initialize(capacity)
@capacity = capacity
@pointer = create_static_array(capacity)
@next_index = 0
end
# adds value to the next_index in array
def push(val)
@pointer[@next_index].write(:int, val)
@next_index += 1
end
# reads value at index
def [](index)
raise IndexOutOfBoundException if index >= @capacity
self.pointer[index].read(:int)
end
# print every value in index
def print
i = 0
while (i < @capacity)
puts @pointer[i].read(:int)
i += 1
end
end
end

我添加了几个方法来与我的数组交互、推送元素、读取索引处的元素...然而,我的 static_array 实例并没有完全按预期工作......

假设我写:

// creates a static array in memory which can store 4 ints
arr = StaticArray.new(4)

现在让我们在 arr 中压入一个 int :

arr.push(20)

arr.print 会输出

20
0
0
0

这是有道理的。现在让我们将另一个 int 插入 arr :

arr.push(16)

arr.print 再次:

4116
16
0
0

20 已被 4116 取代......我真的不明白这里发生了什么?

Here's the link to the FFIPointer class doc if that helps https://www.rubydoc.info/github/ffi/ffi/FFI/Pointer

最佳答案

FFI 接口(interface)不知道你的指针的类型,所以它只是把它当作一个字节数组(参见指针类型的初始化)。请注意,虽然您确实传递了 :int,但这是针对特定的 writeread,而不是您进行索引的地方。因此,您在字节偏移量 0、1、2、3 处写入和打印,而不是在 0、4、8、12 处的整数元素。

在小端系统上,对于 32 位、4 字节的 int,20 的二进制值是 14 00 00 00,16 是 10 00 00 00

所以你分配了 4*4 个字节,所以 32 个字节,前 8 个是。

00 00 00 00 00 00 00 00

然后在偏移量 0 处写入 20

14 00 00 00 00 00 00 00

然后在偏移量1处写入16

14 10 00 00 00 00 00 00

14 10 00 000x00001014 或 4116,然后在您打印的下一个偏移处是 10 00 00 00,即 16 .

关于使用 ruby​​ FFI 在 ruby​​ 中创建静态数组类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55571127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com