2009-12-29 5 views
4

У меня есть объекты C++, и у меня есть Lua объектов/таблиц. (Также есть SWIG C++ привязок.)Отслеживание таблиц Lua в C

Что мне нужно, чтобы быть в состоянии сделать, это связать два объекта так, что если я говорю

CObject* o1 = getObject(); 
o1->Update(); 

он будет делать эквивалент Lua:

myluatable1.Update(); 

до сих пор я могу себе представить, что CObject :: Update будет иметь следующий код:

void CObject::Update(){ 
    // Acquire table. 

    // ??? 

    // Do the following operations on the table. 
    lua_getfield(L, -1, "Update"); 
    lua_pcall(L, 0, 0, 0); 
} 

Как я бы сохранил/установил таблицу Lua, которая будет использоваться, и что будет дальше в // ???, чтобы сделать работу с Update?

+0

Можно ли назначить объект C++ целочисленным id и сохранить связанную таблицу в глобальной таблице lau aka globaltable [tableID] = relatedTable? –

ответ

17

Я не могу поверить, что никто этого не заметил!

http://www.lua.org/pil/27.3.2.html

Секция по API Lua для хранения ссылок на объекты Lua и таблицы и возвращения ссылки для целей, хранящихся в структурах C !!

+0

Не могли бы вы продолжить использование этого раздела. Я пытаюсь сделать именно это, но немного борюсь с реализацией. У вас есть краткий пример, который вы можете показать? Я был бы благодарен! Благодарю. – crush

+0

См. Https://github.com/Tarendai/Shard/blob/master/src/TestAI.cpp#L154 –

+0

Эта строка кода по существу вызывает lua: ai: Init() из C++-контекста –

2

Я любопытна причина этого «обратный SWIG» ...

Объектов в Lua живут в контекстах Lua, так как минимум вам нужно будет хранить «L» внутри объекта.

Проблема с передачей «указателя таблицы» немного более тонкая - хотя Lua позволяет извлекать указатель из стека Lua (используя lua_topointer()), нет способа вернуть это обратно. Понятно, что в противном случае нужно было бы также проверить, указывает ли указатель на действительный объект и т. Д. И т. Д.

Однако вы можете хранить ссылки на таблицы в глобальной таблице, причем индекс является lightuserdata является указателем на ваш объект. Затем, имея состояние Lua и имя глобального массива, вы можете получить ссылку на таблицу и нажать ее в стек Lua для этого контекста.

Это отрывочно, и я даже не затронул вопрос сбора мусора с помощью этой конструкции.

Но в любом случае это не будет быстрым гонщиком по производительности, и для меня это похоже на много кода C++. Я попытаюсь пересмотреть подход и нажать на часть того, что вы хотите сделать в домене Lua.

p.s. похоже, что это третий вопрос, который кажется почти обманом предыдущих двух, here и here являются предыдущими. Если бы на них не ответили полностью, было бы лучше их отредактировать/добавить щедрость, чтобы собрать ответы.

+0

3 вопроса имеют свои отличия, хотя у них есть одна и та же конечная цель, я могу переместить все это в чистую lua в одном проекте, решая проблему, но для другого проекта мне потребуется переписать большие фрагменты проекта. –

+0

Ну ладно, спасибо. Nevermind my p.s. то и удачи! –

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