N1nt3nd0
-
Публикации
6 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем N1nt3nd0
-
-
Индентация из одного места, задача кода не понятна. Что это? Командная оболочка? Программа управления адронным коллайдером? Рекурсия в бесконечном цикле в рекурсии? Что это з зверь?
test запускается, в нем бесконечный цикл, потом очередной test при нажатии. Я нажму 100 раз на клаву и прога вылетит, вероятно. А если ничего не трогать, овердофига раз в секунду будет зачем то сетиться надпись. Каждый раз, черт возьми. Непонятна суть листенеров тут, они только ухудшают все.
Решение (лучшее, имхо): ^A; Del; ^S; переписать.
этот код я набросал для примера. Я хотел реализовать выход из цикла нажатием кнопки Q и возврат в главное меню main(). В оригинале в "меню" вместо "test" намного больше "ссылок" на разные функции из скрипта. А фукцию main() после else я вызываю повторно для того чтобы скрипт не крашнулся если я введу другие варианты кроме предложенных ("test" и "exit"). Я даже убрал main() из функции main() после else, и всеравно возник тот же баг... Как то так...
-
Здравствуйте! Делая выход из цикла нажатием на клавишу я столкнулся с непонятным мне багом. Опишу его таким вот кодом для примера:
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, то скрипт уже закрывается... Как избавиться от этого??
-
- function run()
- while check do
- pcall(test)
- os.sleep(1) -- добавь
- end
- end
Спасибо, помогло) лойс в карму!
На русской вики уже давно есть инфа по всем библиотекам. Например вот инфа о библиотеки event.
Теперь перейдём к проблеме.
event.pull() ждёт пока произойдёт событие и до тех пор пока оно не произошло, не реагирует. В скобках указывается собитие и "прямой эфир" (нечто вроде критерия по которому евент будет срабатывать, например на нужную клавишу)
Пример: tb = {event.pull("key_down")}
Таким образом комп будет ждать нажатия любой клавиши, когда он произойдёт вся инфа сохранится в пронумерованную таблицу tb и дальше что хочешь делой с этой инфой.
event.lister же работает "в фоне" (по факту в моменты ожидания os.sleep ведётся обработка евентов)
Пример: создадим функцию local function slowpoke() <какой то код> end далее привяжем эту функцию к нажатию на экран клика мыши event.lister("touch", slowpoke)
Далее например создадим бесконечный цикл с обработкой евентов while true do os.sleep(10) end
В таком случае при нажатии на экран будет вызываться функция slowpoke(), а в аргументы будут выводится всё та же инфа о координатах мыши, нике игрока и так далее.
Это более выгодно по сравнению с event.pull, так как позволяет обрабатывать сразу несколько эвентов параллельно, обрабатываемых при ожидании os.sleep()
Но нужно помнить что по окончание программы обязательно нужно будет убрать event.lister при помощи event.ignore("событие", название функции)
Если хочешь, могу код какой нибудь скинуть с применением эвентов.
Понял насчёт listen.ignore()
Спасибо за совет! Я кстати использовал как пример код твоей игрухи OpenClicker, но os.sleep() упустил видимо
-
Есть следующий код для примера:
local event = require("event") local component = require('component') local computer = require('computer') local gpu = component.gpu local check = true function test() store = computer.energy() gpu.set(10,10,''..store..'') end function touch(_,_, x, y) if x >= 1 and y >= 1 then check = false os.exit() end end function run() while check do pcall(test) end end event.listen('touch', touch) run()Вопрос 1: в коде присутствует event.listen(), но он не работает. Почему?? Что я делаю не так? И как изменить код, чтобы он заработал?
Вопрос 2: когда я делаю тачскрин через event.pull('touch') то все циклы в программе останавливаются. Как этого избежать?
И вообще, дайте совет пожалуйста как лучше всего реализовывать систему тачскрина, чтобы в дальнейшем не наступать на те же грабли... Спасибо!

Калькулятор
в Инфраструктура
Опубликовано: · Изменено пользователем N1nt3nd0
Осмелюсь предложить более удобный "алгоритм" вычисления для данного скрипта, в одну строчку и без условных операторов:
При нажатии на кнопки, формируется строка в переменную cmd, и после нажатия "=", если success, на экранчик выводится result.