1

我正在使用 SWIG 在 Ruby 中包装 C 接口。给定两个结构

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

4

1 回答 1

1

一种方法是使用 swig 函数将顶点转换为 VALUE。将 C 结构体包装为 ruby​​/swig 对象的 swig 函数是 SWIG_NewPointerObj。

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

SWIG_NewPointerObj/SWIGTYPE_p_* 被定义为包装器中的宏,因此您需要从包装器中调用上述代码(这将在您使用 %extend 时发生)。

于 2010-03-01T04:51:47.683 回答