Перейти к содержимому
  • 0
N1nt3nd0

Баг кода? Или я что то делаю не так...

Вопрос

Здравствуйте! Делая выход из цикла нажатием на клавишу я столкнулся с непонятным мне багом. Опишу его таким вот кодом для примера:

local c = require('component')
local term = require('term')
local event = require('event')
local keyboard = require('keyboard')
local gpu = c.gpu

function main()
	term.clear()
	io.write('exit >> ')
	local text = io.read()
    if text == 'exit' then
	term.clear()		
        os.exit()
    elseif text == 'test' then
    	event.listen('key_down',test)
    	test()
    else
    	main()
    end
end

function test(name,adress,char,code,player)
        term.clear()	
    while true do
        key = tostring(keyboard.keys[code])
        gpu.set(1,1,'for stop press Q')
        os.sleep(0.0000000001)
        if key == 'q' then break end
    end
        event.ignore('key_down',test)
        term.clear()
        print('test')
        os.sleep(2)
        main()
end

main()

Суть бага: я запускаю скрипт, пишу exit и он закрывается, как положено, но когда я напишу exit после того как запущу и остановлю цикл test, то на экране снова высвечивается 'test' на 2 секунды и возвращается в main() вместо того чтобы закрыться. Почему?? А второй раз когда я пишу exit, то скрипт уже закрывается... Как избавиться от этого??

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

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


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

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

  • 0
function main() term.clear() io.write('exit >> ') local text = io.read() if text == 'exit' then term.clear() os.exit() elseif text == 'test' then event.listen('key_down',test) test() else main() end end

О нет, ты запустил функцию main внутри самой функции main n количество раз, создав тем самым рекурсию.

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

 

P.S. Что за функция test? Какова её роль в будущем? По тому что есть могу догадаться, что там будет очередной быдлокод, который можно заменить уже существующими функциями.

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

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


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

Индентация из одного места, задача кода не понятна. Что это? Командная оболочка? Программа управления адронным коллайдером? Рекурсия в бесконечном цикле в рекурсии? Что это з зверь?

test запускается, в нем бесконечный цикл, потом очередной test при нажатии. Я нажму 100 раз на клаву и прога вылетит, вероятно. А если ничего не трогать, овердофига раз в секунду будет зачем то сетиться надпись. Каждый раз, черт возьми. Непонятна суть листенеров тут, они только ухудшают все.

 

Решение (лучшее, имхо): ^A; Del; ^S; переписать.

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

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


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

Индентация из одного места, задача кода не понятна. Что это? Командная оболочка? Программа управления адронным коллайдером? Рекурсия в бесконечном цикле в рекурсии? Что это з зверь?

test запускается, в нем бесконечный цикл, потом очередной test при нажатии. Я нажму 100 раз на клаву и прога вылетит, вероятно. А если ничего не трогать, овердофига раз в секунду будет зачем то сетиться надпись. Каждый раз, черт возьми. Непонятна суть листенеров тут, они только ухудшают все.

 

Решение (лучшее, имхо): ^A; Del; ^S; переписать.

этот код я набросал для примера. Я хотел реализовать выход из цикла нажатием кнопки Q и возврат в главное меню main(). В оригинале в "меню" вместо "test" намного больше "ссылок" на разные функции из скрипта. А фукцию main() после else я вызываю повторно для того чтобы скрипт не крашнулся если я введу другие варианты кроме предложенных ("test" и "exit"). Я даже убрал main() из функции main() после else, и всеравно возник тот же баг... Как то так...

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

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


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

local event = require("event")
local computer = require("computer")
local keyboard = require("keyboard")

local running = false
local commands = {}

function commands.exit()
 running = false
end

commands["run hadron collider"] = function()
  print("Hadron Collider has been runned!")
  os.sleep(5)
  print("Boom! Universe has been destroyed!")
  while true do
    computer.beep()
    computer.pullSignal(2)
  end
end

local funcion onKeyDown(_, _, _, code)
  if keyboard.keys[code] == "q" then
    running = false
  end
end

event.listen("key_down", onKeyDown)

while running do
  local command = io.read()
  local handler = commands[command]
  
  if handler then
    handler()
  end
end

event.ignore("key_down", onKeyDown)

это полезнее будет, вселенную уничтожает и даже без рекурсии

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

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


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

Local exit = false

 

While not exit do

Код

End

 

Далее в нужный момент ставим exit = true и код в цикле не выполняется.

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...