通过Swig从Lua调用C函数指针

我有这样一个结构(来自 Teem 库):

struct NrrdEncoding {
  // ...
  int (*read)(FILE *file, void *data, size_t elementNum,
              Nrrd *nrrd, struct NrrdIoState_t *nio);
  int (*write)(FILE *file, const void *data, size_t elementNum,
               const Nrrd *nrrd, struct NrrdIoState_t *nio);
};

默认情况下,Swig 希望 readwrite 成为userdata,如果它们是不透明的并且可重新分配,这是有意义的。但是,我想能够调用这些函数,而不仅仅是重新分配它们,但我不知道该怎么做。(最理想的情况是我想同时实现这两个功能。)

原文链接 https://stackoverflow.com/questions/8542084

点赞
stackoverflow用户734069
stackoverflow用户734069

你需要通过 SWIG 来为对象 NrrdEncoding 提供成员函数 (即:将 C 函数绑定为对象成员),这些函数本身将调用函数指针。这将类似于以下示例:

struct NrrdEncoding
{
  ...
  //不要公开函数指针。该结构体将仍然拥有函数指针,但 SWIG 将不会公开它们。
};

%extend NrrdEncoding
{
  int read(FILE *file, void *data, size_t elementNum, Nrrd *nrrd, struct NrrdIoState_t *nio)
  {
    return $self->read(file, data, elementNum, nrrd, nio);
  }

  int write(FILE *file, const void *data, size_t elementNum, const Nrrd *nrrd, struct NrrdIoState_t *nio)
  {
    return $self->write(file, data, elementNum, nrrd, nio);
  }
}

在 Lua 中,如果你有一个 NrrdEncoding 对象,你可以像这样调用 readobject:read(...).

2011-12-17 02:23:59