Ошибка сопрограммы Lua: искушение уступить через границу метаметода / C-вызова - PullRequest
4 голосов
/ 11 декабря 2011

Я использую игровой движок, который позволяет программировать на Lua. Команды игрового движка находятся в DLL, созданной из C. В C есть исполняемый файл, который вызывает файл Lua. В этом файле Lua вы помещаете весь код игры, включая основной цикл. Там нет возврата туда и обратно с exe, но вы можете вызывать функции из DLL.

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

Затем я создаю сопрограмму с этой функцией в качестве параметра. В основном цикле игры я возобновляю эту сопрограмму.

Когда я запускаю свой код, я получаю сообщение об ошибке: соблазн уступить метаметоду / границе C-вызова

Я читал кое-что в Интернете, но не совсем понял, в чем здесь проблема. Как только exe вызывает файл Lua, он вообще не возвращается к exe, пока файл Lua не будет завершен, и, поскольку у меня есть основной цикл в файле Lua, он никогда не заканчивается в моем тестовом примере.

Какие у меня варианты с этим тогда?

Ответы [ 2 ]

8 голосов
/ 11 декабря 2011

Ошибка говорит вам, что вы пытаетесь получить изнутри кода Lua, где есть некоторая функция C между кодом Lua, выполняющим выдачу, и кодом Lua, который возобновил сопрограмму.Чтобы устранить эту ошибку, вам нужно вызвать некоторую функцию C из Lua, которая возвращает код Lua, который затем вызывает coroutine.yield().

Вы не можете этого сделать.Вместо этого вы должны реструктурировать свой код, чтобы избежать этого.Поскольку вы не предоставили какой-либо код, мало что можно предложить.

4 голосов
/ 11 декабря 2011

Есть несколько вещей, которые вы можете сделать, если не можете изменить свой код, чтобы избежать границы мета-метода C /:

  • Если вы используете стандартный Lua и собираете его самостоятельно, попробуйтеисправление его с помощью Coco - True C-сопрограммы для Lua .

    True C-сопрограмма семантики означает, что вы можете выйти из сопрограммы через границу вызова C и вернуться к ней.*

  • Попробуйте использовать LuaJIT вместо стандартного интерпретатора Lua.Он использует полностью возобновляемую виртуальную машину , что означает, что граница не является проблемой.

  • Попробуйте использовать Lua 5.2 .Он имеет доходный pcall и метаметоды , что означает, что он может решить вашу проблему.Однако есть некоторые изменения и несовместимости между Lua 5.1 и Lua 5.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...