Структуры с Fiddle в Ruby немного вводят в заблуждение, поскольку являются прямым аналогом своего аналога C.Многие функции, которые делают структуры простыми и удобными для пользователя, отсутствуют в его представлении Ruby.
Основной принцип, который следует иметь в виду, заключается в том, что Fiddle::CStruct
на самом деле является не чем иным, как прославленным Fiddle::Pointer
, ина самом деле подкласс этого.Основные ограничения заключаются в том, что вы можете объявлять только примитивные типы внутри него.В отличие от языков C, где, если вы определяете структуру, вы можете использовать ее в качестве типа в другой структуре, возвращаемом значении и т. Д.
Это все еще может быть выполнено в Ruby, хотя документация на него легкавопрос.Как я уже говорил ранее, имея в виду, что структура Ruby происходит от Fiddle::Pointer
, вы просто используете void*
в объявлении подписи (или Fiddle::TYPE_VOIDP
в зависимости от того, используете ли вы CParser или нет).
В приведенном выше примере, после того как вы объявили свою структуру, вы должны определить сигнатуру вашего метода следующим образом:
float* xtpredict(void* tinn, const float* in)
Замените ваши типы структуры на void*
вместо именитипа, и вы можете затем передать структуру непосредственно ему и получить желаемое поведение, которое вы ожидаете.
Точно так же происходит получение структуры, возвращаемой из метода.Еще раз используйте void*
в подписи, которую Ruby затем вернет объект Fiddle::Pointer
.Этот указатель содержит адрес, по которому структура находится в памяти.Поскольку структуры принимают адрес в своем методе инициализации, используйте возвращенный указатель для инициализации вашей структуры, и он будет создан в этом месте в памяти.
ptr = getMyStruct
MyStruct.new(ptr.to_i)
И наоборот, если память мне не изменяет, я вам верюможно также использовать это так:
ptr = getMyStruct
MyStruct.new(ptr.ptr)