Как бороться с указателями массива в рубиновой Fiddle

Я пытаюсь переключиться с Ruby FFI на Fiddle, который теперь является частью Ruby std lib.

Это довольно недокументировано, и мне трудно разобраться, как обращаться с массивами и указателями. В частности, как я могу написать интерфейс Fiddle для функции C следующим образом:

void my_func(double *, size_t len)

Сопоставить его с Ruby довольно просто:

module Test
  extend Fiddle::Importer
  dlload './lib/libTest.dylib'
  extern 'void my_func(double *, size_t)'
end

Но тогда как я могу построить указатель на массив, который будет передан в качестве первого аргумента? Спасибо!

1 ответ

Решение

Вы имеете в виду построить массив c и указатель этого массива в ruby?

Вы можете попробовать так:

free = Fiddle::Function.new(Fiddle::RUBY_FREE, [TYPE_VOIDP], TYPE_VOID)
p = Pointer.malloc(SIZEOF_DOUBLE*len, free)

и звоните так:

my_func(p,len)

ruby GC вызовет функцию free, когда этот блок памяти не будет использоваться.

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