Вызов указателя на функцию C через Swig из Lua - PullRequest
0 голосов
/ 17 декабря 2011

У меня есть эта структура (из библиотеки 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 хочет, чтобы read и write были пользовательскими данными, что имеет смысл, если они непрозрачны и могут быть переопределены Однако я хочу иметь возможность вызывать их больше, чем я хочу иметь возможность переназначить их, и я не знаю как. (В идеале я хотел бы иметь возможность сделать оба.)

1 Ответ

2 голосов
/ 17 декабря 2011

Вам нужно передать объекту NrrdEncoding функции-члены через SWIG (то есть: функции 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 объект, вы можете вызвать read на нем так: object:read(...).

...