Перейти к содержимому
  • 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

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


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

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

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

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


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

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

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

 

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

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

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


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

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

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

 

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

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

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

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


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

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

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


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

Local exit = false

 

While not exit do

Код

End

 

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

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


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

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

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

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

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

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

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

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

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


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