Как бороться с указателями массива в рубиновой 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, когда этот блок памяти не будет использоваться.