Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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

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

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

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

lua
10.12.2011

Ответы:


1

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

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

10.12.2011

2

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

11.12.2011
  • Библиотека игр, которую я использую, использует LuaJIT! Мне показалось интересным, что я получаю сообщение об ошибке после вашего комментария. 11.12.2011
  • Какую версию LuaJIT вы используете? 12.12.2011
  • В игровом движке используется LuaJIT 1.1.6. 12.12.2011
  • Тогда, возможно, этот ответ относится к вам. Используйте lua_newcthread() вместо lua_newthread(). Или используйте LuaJIT 2, но я не уверен, что он готов к работе. 12.12.2011
  • Хотя, похоже, это относится к коду C. Все это делает игровой движок, поэтому у меня нет к нему доступа :( Я посмотрю, смогу ли я уговорить создателя внести это изменение. Спасибо. 12.12.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..