Передача C-инициализированной структуры во встроенный интерпретатор Ruby - PullRequest
3 голосов
/ 19 января 2012

Я встраиваю Ruby в C, и мне нужно передать структуру, созданную в C, в скрипт Ruby, где я хочу работать со значениями struct.Я успешно сделал это с объявлением структуры rb_struct_define и инициализацией rb_struct_new, но я не могу передать структуру, определенную в стиле C (struct Address {...}).

Я получил несколько советовэто можно сделать с помощью Data_Wrap_struct, но я не могу заставить его работать.

Мой пример кода здесь: https://gist.github.com/1641269

1 Ответ

2 голосов
/ 20 января 2012

Что бы вы ни передавали методу Ruby, он должен быть объектом Ruby, вы не можете напрямую передать объект структуры C.

Что вы можете сделать, это создать объект-обертку для вашей структуры, который обеспечит доступ кода Ruby своим членам. К сожалению, насколько я знаю, нет способа автоматически сделать это на основе членов структуры. Вам придется написать код на C, чтобы определить соответствующие методы, что может быть немного утомительно, если в вашей структуре много членов.

Макрос Data_Wrap_Struct - это то, что вы используете, чтобы обернуть структуру C в объект Ruby. Затем вы можете использовать Data_Get_Struct в реализациях методов, чтобы развернуть структуру и получить данные.

Вот пример , который, мы надеемся, должен указать вам правильное направление.

...