Как получить структурные члены переменной типа структуры в C, переданной из скрипта ruby? - PullRequest
1 голос
/ 16 сентября 2011

Я реализовал расширение Ruby C (то есть, вызывая функцию C из сценария ruby). Ниже приведена функция, реализованная в c из файла "cFile.c"

#include<stdio.h>
static VALUE cFunction(VALUE self, VALUE src)
{
   if(TYPE(str) == T_STRUCT)
   {
      printf(" variable str is of STRUCT type \n");
   }
   // here how can i get the members of structure variable "str" 

   return Qnil;
}
void Init_MyRuby()
{
    VALUE MRuby = rb_define_module("MyRuby");
    rb_define_singleton_method(MRuby, "cFunction", cFunction, 1);
} 

Ниже приведен код сценария ruby, который вызываетМетод functon (), передавая переменную типа структуры.client.rb:

require 'cFile'
customer = Struct.new( "Customer", :name, :address, :zip )
joe = customer.new( "JoeSmith", "123 Maple, Anytown NC", 12345 )
MyRuby::cFunction(joe)

Может ли кто-нибудь подсказать мне, как получить члены структуры (т.е. имя, адрес и т. д.) в cFunction ()?Заранее спасибо

1 Ответ

1 голос
/ 16 сентября 2011

Это работает (не устойчиво):

puts(STR2CSTR(rb_funcall(str, rb_intern("name"), 0)));
puts(STR2CSTR(rb_funcall(str, rb_intern("address"), 0)));
printf("%i\n", NUM2INT(rb_funcall(str, rb_intern("zip"), 0)));

Для лучшей производительности вы должны определить тип структуры в вашем C-коде и затем распространите его на объект Ruby через Data_Wrap_Struct, как описано в Кирка, глава 17

...