Передача RUBY Array в C DLL с помощью Fiddle

Во-первых, я знаю, что мой вопрос похож на тот, который был опубликован ниже. Как бороться с указателями массива в рубиновой Fiddle

Но на этот вопрос действительно нет ответа. Моя проблема состоит в том, чтобы написать функцию в ruby, которая будет принимать массив ruby ​​в качестве входных данных и возвращает Fiddle::Pointer, который может быть обработан в C DLL. Вот

# transform an ruby array of double to Fiddle::Pointer and processed as double* in C DLL
# @param [Array] array the ruby array, e.g. [1.0, 2.0, 3.0]
# @return [Fiddle::Pointer] fiddle pointer that could be processed as double * in C
def double_array_to_ptr(array)
  length = array.length
  ptr = Fiddle::Pointer.malloc(length * Fiddle::SIZEOF_DOUBLE)

  # initialize the ptr with numbers in array
  for i in 0..length-1
    # how to initialize the ptr
    # maybe ptr[start, length] would help, I have tried but no success

  end
  return ptr
end

И функция C может выглядеть так

/**
 * \brief       H2OSetGlobalOffset set the global offset of data
 * \param[in]   H2OProjectH project project manager, this one has been initialized
 * \param[in]   double * offset offset data, the buffer is initilized in ruby 
*/
H2O_EXPORT void H2OSetGlobalOffset(H2OProjectH project, double* offset);

Функция была обёрнута с помощью Fiddle::Importer, что аналогично предыдущему вопросу. Итак, вопрос в том, как я могу инициализировать Fiddle::Pointer в коде ruby.

Спасибо!

1 ответ

arr = [1.0, 2.0, 3.0]
ptr = Fiddle::Pointer[arr.pack('E*')]

E* для порядка байтов с прямым порядком байтов,

Получил выше по этой ссылке на форуме Ruby

Подробнее об упаковке и распаковке разных типов данных читайте в этом посте.

Другие вопросы по тегам