Поскольку у вас есть встроенный Lua и он доступен, вы можете использовать его.Таблица Lua - это ассоциативный массив, который можно индексировать любым значением Lua (кроме nil
) и хранить любое значение.Строки работают как клавиши и функционируют как значения.
Вы можете легко превратить звонок, например, ObjectSet(id, "ANGLE", 45)
, в звонок, подобный actions.ANGLE(id,45)
.
. Для этого необходимо организовать actions
таблица, содержащая функции для реализации каждого действия.Самый простой способ - задействовать блок кода Lua, который инициализирует таблицу, но это, безусловно, также можно сделать со стороны C.
actions = {
ANGLE = function(id,theta)
-- do something with id and theta
end,
X = function (id, x)
-- do something with id and x
end,
}
или, возможно, более ясно, как
module("actions")
function ANGLE(id,theta)
-- ...
end
function X(id,theta)
-- ...
end
Из C вы можете реализовать ObjectSet()
что-то вроде этого (не проверено):
void ObjectSet(int id, const char *action, int arg) {
lua_getglobal(L,"actions");
lua_getfield(L,-1,action);
lua_remove(L,-2);
lua_pushinteger(L,arg);
if (lua_pcall(L,1,0,0)) {
fprintf(stderr, "Lua error: %s\n", lua_tostring(L,-1));
}
return;
}
Реальная обработка ошибок оставлена в качестве упражнения.Обратите внимание, что lua_pcall()
используется здесь, чтобы ошибки Lua не распространялись из ObjectSet()
.Если вы используете C ++, вы должны быть осторожны, потому что Lua использует setjmp()
и longjmp()
для ошибок, которые, как правило, должны переводиться в исключения C ++ путем перехвата ошибки Lua и создания подходящего исключения.
I 'Мы также естественным образом оставили ассоциирование идентификатора объекта с реальным объектом на стороне Lua в качестве упражнения.Однако вы можете реализовать все функции из таблицы actions
в C и в значительной степени избежать этой проблемы.