2016-03-17 3 views
2

У меня есть C код, который выглядит примерно так:Как вы вызываете функции с помощью указателей функций в Lua с привязкой SWIG?

typedef int (*SIMPLEFUNC)(int); 

SIMPLEFUNC foo = NULL; 

void setup_foo(void) { 
    foo = ...; 
} 

я обернуть это с SWIG с минималистичным .i файлом, а затем использовать его в Lua. Я могу позвонить setup_foo() из Lua. Я вижу переменную foo. Но я не могу назвать foo функцией от Lua. Он отображается как userdata.

local mylib = require('mylib') 
mylib.setup_foo() 
print(mylib.foo) 
print(mylib.foo(3)) 

Я получаю вывод так:

setup_foo() has been called 
userdata: 0x1b441c8 
PANIC: [string "bootstrap0"]:86: attempt to call a userdata value (field 'foo') 
stack traceback: 
    [string "bootstrap0"]:86: in main chunk 

Вопрос

Есть ли способ вызова функции, такие как указатели foo из моего Lua кода при использовании SWIG?

Есть ли какая-то конфигурация SWIG, которая может помочь?

Если нет, то какой способ изменить свой код на C, чтобы заставить его работать?

Редактировать

На более высоком уровне, я решил эту проблему путем перехода на Селене вместо SWIG. Selene позволяет легко перезаписывать функции в состоянии Lua во время выполнения. https://github.com/jeremyong/Selene

ответ

2

Самый простой способ справиться с этим, чтобы просто выставить функцию, которая вызывает этот указатель функции:

SIMPLEFUNC foo = NULL; 

int call_foo(int i) {return foo(i);} 

Это было бы, конечно, в вашем файле .i. Вы не хотите напрямую подвергать его C; это просто вспомогательная функция для Луи.

Может быть более прямой способ обращения с SWIG. Может быть, какая-то типовая конструкция или что-то подобное. Но это самый простой способ. Кроме того, это не похоже на то, что SWIG позволит вам переместить функцию Lua в этот указатель функции.

 Смежные вопросы

  • Нет связанных вопросов^_^