2009-11-10 61 views
1

我正在使用SWIG在Ruby中包裝C接口。鑑於兩個結構從C與SWIG使用Ruby塊

typedef struct Vertex { 
    int color, discoverd, finished; 
    struct Vertex *next; 
} Vertex; 

typedef struct Graph { 
    struct Vertex *vertex; 
} Graph; 

我怎麼可以創建一個#each方法,它生成當前頂點,這樣我就可以在Ruby中處理它。目前我的SWIG接口文件包含類似於

%extend Graph { 
    void each() { 
    Vertex *v; 

    v = self->vertex; 
    while(v) { 
     rb_yield(Qnil); // how do I yield a vertex? 
     v = v->next; 
    } 
    } 
}; 

在此先感謝您的幫助。

--t6d

回答

1

一種方法是頂點轉換爲與痛飲功能的值。將C結構包裝爲ruby/swig對象的swig函數是SWIG_NewPointerObj。

rb_yield(SWIG_NewPointerObj(SWIG_as_voidptr(v), SWIGTYPE_p_Vertex, 0 | 0)); 

SWIG_NewPointerObj/SWIGTYPE_p_ *定義爲在紙上出現的宏,所以你需要調用從包裝(當你使用擴展%將發生)上面的代碼。