Передача 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
Подробнее об упаковке и распаковке разных типов данных читайте в этом посте.