Как использовать ruby FFI для чтения массива статических структур

#ruby #ffi

#ruby #ffi

Вопрос:

У меня есть статический массив структур на C, который я хотел бы прочитать на Ruby.

Структура данных C выглядит следующим образом:

 typedef struct myStruct {
  char *name;
  int val;

} myStruct;

myStruct myData[] = {
 {"First", 0},
 {"Second", 1},
 {"Third", 2}
};
 

Как я могу прочитать массив myData из Ruby, используя FFI и attach_variable?

У меня есть этот код ruby:

 module MyLib

  class MyStruct < FFI:Struct
    layout :name, :string,
           :val, :int
  end

  attach_variable :myData, :myData, :pointer


  def self.readDataArray
    pointer = myData
    ??? how to use this with MyStruct to iterate through the array ???
  end
end
 

Ответ №1:

Боюсь, что нет особенно хорошего способа. read_array_of_type не работает для структур.

Вы можете добиться этого, используя простую арифметику указателей:

 def self.readDataArray
    pointer = myData
    array_of_structs = 3.times.map { |idx| 
        MyStruct.new(pointer   idx * MyStruct.size)
    }
    # Do your business
end