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

时间:2011-12-17 02:13:05

标签: c lua function-pointers swig

我有这个结构(来自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,如果它们不透明且可重新分配,则有意义。但是,我希望能够调用这些,而不是我希望能够重新分配它们,我不知道如何。 (理想情况下,我希望能够做到这两点。)

1 个答案:

答案 0 :(得分:2)

你需要通过SWIG给对象NrrdEncoding成员函数(即:你作为对象成员绑定的C函数),它们自己将调用函数指针。它可以这样工作:

struct NrrdEncoding
{
  ...
  //Don't expose the function pointers. The struct will still have them, but SWIG won't expose them.
};

%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(...)