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

Не могу понять где ошибка! [event API]

Вопрос

    Начал писать радиоуправляемого робота, всё как обычно начиналось хорошо, но произошла такая хрень! 

Не хочет обрабатывать вот это событие:

local a1, a2, a3, a4, a5, ev = event.pull("modem_message", _, serverAddr, 666)

если делаю вот так:

local a1, a2, a3, a4, a5, ev = event.pull("modem_message")

всё работает, вот так опять нет:

local a1, a2, a3, a4, a5, ev = event.pull("modem_message", _, _, 666)

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

     Вот код:

Клиент:

local r = require("robot")
local com = require("component")
local event = require("event")
local modem = com.modem

local doit = {}
doit.up = r.up
doit.down = r.down
doit.left = r.turnLeft
doit.right = r.turnRight
doit.around = r.turnAround
doit.forward = r.forward
doit.back = r.back
doit.swing = r.swing
doit.swingUp = r.swingUp
doit.swingDown = r.swingDown
doit.use = r.use
doit.useUp = r.useUp
doit.useDown = r.useDown
doit.place = r.place
doit.placeUp = r.placeUp
doit.placeDown = r.placeDown


modem.close()
modem.open(666)
modem.setStrength(500)


local _, clientAddr, serverAddr, _, _, _ = event.pull("modem_message", _, _, 666, _, "gogo")
modem.send(serverAddr, 666, clientAddr)
print(serverAddr.."||")
print(clientAddr)
print("приступаю к циклу")
while true do
	print("цикл")
    local a1, a2, a3, a4, a5, ev = event.pull("modem_message", _, serverAddr, 666) --------- FUCK!!!!!!!!!!
    print("считал сообщение")
    doit[ev]()
    print(a1,a2,a3,a4,a5,ev)
end

и сервер:

local com = require("component")
local event = require("event")
local modem = com.modem

modem.close()
modem.open(666)
modem.setStrength(500)

modem.broadcast(666, "gogo")
local _, _, _, _, _, clientAddr = event.pull("modem_message", _, _, 666)
print(clientAddr)

while true do
    local msg = io.read()
    modem.send(clientAddr, 666, msg)
    print("--"..msg)
end

заранее спасибо тем, кто откликнется. 

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

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


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

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

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

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

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


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

Зачем используешь переменную _ в качестве параметра event.pull? Она к тому времени уже не пустая. Делай так

local _, clientAddr, serverAddr, _, _, _ = event.pull("modem_message", nil, nil, 666, nil, "gogo")

вместо

local _, clientAddr, serverAddr, _, _, _ = event.pull("modem_message", _, _, 666, _, "gogo")

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


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

 

 

event.pull([eventName: string], [timeout: number])
 

там наоборот, сначала imeout, затем eventName, если первая переменная - строка, то таймаут пропускается.

 

 

Зачем используешь переменную _ в качестве параметра event.pull? Она к тому времени уже не пустая. Делай так

local _, clientAddr, serverAddr, _, _, _ = event.pull("modem_message", nil, nil, 666, nil, "gogo")

вместо

local _, clientAddr, serverAddr, _, _, _ = event.pull("modem_message", _, _, 666, _, "gogo")

эта строка работает нормально, тем более на вики так учат. Проблема в следующем event.pull(), тот, который в цикле.

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


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

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

Спасибо тебе огромное! А я думал, что если её используют как пустую переменную - она не хранит данных. Автор статьи на вики похоже тоже так думал.

Респект и  :smile9:

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


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

Спасибо тебе огромное! А я думал, что если её используют как пустую переменную - она не хранит данных. Автор статьи на вики похоже тоже так думал.

Респект и  :smile9:

Если бы автор темы умел дебажить принтами, давно бы эту проблему решил сам.

Ну вот что сложного? Lua выдал строку где произошла ошибка. Например строка 42, в которой вызывается функция lampochka(pochka)

Написал print(pochka) и проверил чему равна переменная в строке с ошибкой. Эта информация практически всегда решает проблему позволяя понять где код работает не так и исправить.

 

Насколько я знаю в природе есть константы и есть переменные. А о существовании некой переменной, которая бы мифическим образом сама себя стирала никто не говорил.

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

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


Ссылка на сообщение
Поделиться на других сайтах
Насколько я знаю в природе есть константы и есть переменные. А о существовании некой переменной, которая бы мифическим образом сама себя стирала никто не говорил.
Хм. Надо попробовать сделать такую переменную. Просто ради интереса.

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


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

Хм. Надо попробовать сделать такую переменную. Просто ради интереса.

Можно просто очищать переменную _ перед использованием, если она так необходима.

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


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

Можно просто очищать переменную _ перед использованием, если она так необходима.

Можно, но зачем? Проще её не использовать.

 

Если бы автор темы умел дебажить принтами, давно бы эту проблему решил сам.

Ну вот что сложного? Lua выдал строку где произошла ошибка. Например строка 42, в которой вызывается функция lampochka(pochka)

Написал print(pochka) и проверил чему равна переменная в строке с ошибкой. Эта информация практически всегда решает проблему позволяя понять где код работает не так и исправить.

 

Насколько я знаю в природе есть константы и есть переменные. А о существовании некой переменной, которая бы мифическим образом сама себя стирала никто не говорил.

1. Я принтил всё, кроме переменной "_".

2. Ошибки не было, просто event.pull не обрабатывал никакие события из-за некорректного фильтра.

3.Я ошибался насчёт переменной "_", каюсь.

 

P.S. qwertyMAN, ты чё такой агрессивный?

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


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

P.S. qwertyMAN, ты чё такой агрессивный?

Работа у него такая. Нубов пугать.

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


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

P.S. qwertyMAN, ты чё такой агрессивный?

Бана хочет.

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


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

А "избранный" как всегда желает всем скорейшего бана  :)

Вот такие добрые люди здесь.

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


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

 

 

Можно просто очищать переменную _ перед использованием, если она так необходима.
 

А можно мета-методами для _G определить неприсваеваемый объект, всегда возвращающий nil

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


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

 

А можно мета-методами для _G определить неприсваеваемый объект, всегда возвращающий nil

 

setmetatable(_G, {
__index = function (self, k) 
  if k == "_" then 
    return nil 
  else 
    return rawget(self, k) 
  end 
end}) 

print(_) --> nil
_ = 22
print(_) --> nil

это было просто

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

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


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

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

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

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

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

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

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

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

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


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