Перейти к публикации
  • 0
Aex

Странное поведение переменной.

Вопрос

Не знаю, где лучше расположить эту тему.

 

Ситуация:

Есть дом на сервере EvilCraft. В нём работает в режиме non-stop примерно 5 компьютеров (включая один сервер и одного робота).

В доме есть дверь. На которой запущена программа входного замка.

Программа (урезанная до скелета, чисто для демонстрации. В приведённой версии эффект наблюдается вполне) приведена тут:

https://pastebin.com/yzf4eRZq

 

Проблема:

Когда я выхожу с сервера, телепортируюсь в другой мир, или же просто покидаю чанк, то (не всегда!) проявляется следующий эффект:

Одна из переменных (в приведённом тексте TimeOut. Я пробовал её переименовать) перестаёт принимать значения.

То есть, для примера, когда я возвращаюсь в чанк и нажимаю на кнопку открытия дверей, вызывается функция VisitRequest, которая вызывает в свою очередь после проверки вызывает функцию OpenDoor, которая успешно отрабатывает, и вызывает в свою очередь функцию WaitMenu.

function WaitMenu(delay)
	sMode = -1;
	TimeOut = delay;
	timestamp = computer.uptime();
	gpu.fill(1,7, resX, resY, " ");
	gpu.set(8, 9, "PLEASE WAIT");
end

Которая выполняет всё успешно (судя по надписи на экране). Но переменная TimeOut не принимает значение delay, и остаётся в нуле (её значение по-умолчанию), судя по выводу на экран и дальнейшему поведению программы.

Обнуление переменной исключается, так как единственное место где она обнуляется не исполняется (меню не отрисовывается).

 

Может кто-то с таким сталкивался? Из-за чего такое возможно?

 

Update: Это наблюдается на как минимум двух компьютерах с двумя разными программами...

Изменено пользователем Aex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2 ответа на этот вопрос

Рекомендованные сообщения

  • 0

Тут какое-то сильное колдунство.

В 1.7.10 чанки дюпают это всем понятно, но в данном случае программа должна выполняться дальше, даже после сотни дюпов. Я немного не понял, как будет вести себя computer.uptime() после отката чанка, вроде-бы оно привязано к времени всего мира. Но в любом случае, назад оно не пойдет.

Надо повесить хук и при очередном таком баге отловить значения computer.uptime() и timestamp в основном цикле до проверки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
21 час назад, Aex сказал:

Есть дом на сервере EvilCraft.

Возможно, речь идёт о нашем сервере EvilWorld. Если нет, то имеет смысл уточнить версию Minecraft и OpenComputers.

21 час назад, Aex сказал:

Но переменная TimeOut не принимает значение delay, и остаётся в нуле (её значение по-умолчанию), судя по выводу на экран и дальнейшему поведению программы.

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

if (computer.uptime() - timestamp > TimeOut) and (TimeOut > 0) then
  ...
  ShowMenu();

А здесь переменная как раз и могла обнулиться.

21 час назад, Aex сказал:

Обнуление переменной исключается, так как единственное место где она обнуляется не исполняется (меню не отрисовывается).

И почему исключается? Каким образом это проверяется? На отрисовку меню могли влиять ошибки в реализации GUI. Предлагаю на время отладки полностью отказаться от GUI и весь вывод переписать на print, или сигналить звуком, например, так:

if TimeOut > 0 then
  computer.beep()
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×