gpt4 book ai didi

c - ruby FFI : multi-dimensional array

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:19 26 4
gpt4 key购买 nike

我试图从 Ruby 调用的 C 函数是这样的:

void foo(double *in_array, double *out_array)

哪里:

  • in_array 是一组数组,“foo”将使用这些数组来计算并返回:
  • out_array 也是一个数组数组,C 函数会改变它的内容。

我的包装看起来像这样:

module FooLib
extend FFI::Library
ffi_lib "foo.so"
attach_function :Foo, [:pointer, :pointer], :void
end

我正在用 Ruby 做以下事情:

# Allocate the objects and prepare them    
in_array = Matrix.build(10, 3) { rand }.to_a
out_array = Matrix.build(10, 3) { 0 }.to_a
FooLib.Foo(in_array, out_array)

但是我得到以下错误:

:pointer argument is not a valid pointer (ArgumentError)

我能理解我需要使用指向这些数组的指针而不是数组对象,但我不确定该怎么做。这是否意味着我需要使用 LibC 包装器在 C 中创建这些结构?

最佳答案

根据 Momer 的回答,看起来您确实需要使用 LibC 包装器。将多维数组转换为正确的指针并不简单,所以我想我会把它放在这里以防它对其他人有帮助:

in_array = Matrix.build(10, 3) { rand }.to_a
in_array_flattened = in_array.transpose.flatten # Just flatten your multi-dim array
in_array_ptr = LibC.malloc(FFI.type_size(FFI::TYPE_FLOAT64) * in_array_flattened.size) # Watchout the type you want to use.
in_array_ptr.write_array_of_double(in_array.flatten)

# Same for out_array

FooLib.Foo(in_array_ptr, out_array_ptr)

# Convert back to Ruby
values = in_array_ptr.read_array_of_double(in_array_flattened.length)
values = values.enum_for(:each_slice, 10).to_a.transpose # Might be the C lib I am using but you do need to do this conversion in my case to get the multi-dim array you are expecting

关于c - ruby FFI : multi-dimensional array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22642408/

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