2011-09-16 59 views
1

我已經實現紅寶石C擴展(從紅寶石腳本調用即C函數) 以下是從文件「cFile.c」如何檢索C中的結構成員變量,從ruby腳本傳遞?

#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); 
} 

以下用C語言實現的功能被紅寶石腳本的代碼調用functon( )方法通過傳遞struct類型變量。 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

此作品(非穩健的):

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代碼中定義的結構類型和 然後通過Data_Wrap_Struct它擴展到Ruby對象所概述在 Pickaxe, chapter 17

+0

非常感謝@undur_gongor .... – BSalunke

相關問題