Ksandr0 0 Опубликовано: 17 мая, 2016 Всем доброго дня. Для управления дроном хотел использовать систему, передающую ему команды, а в его eeprom разместить только программу на прием и исполнение внешних команд. На дроне использовал следующее: local modem = component.proxy(component.list('modem')())local drone = component.proxy(component.list('drone')())modem.open(4455)while true dolocal rnd, _, _, _, _, any = computer.pullSignal()if rnd == "modem_message" thenpcall(load(any))endend Передаю с компьютера сообщение "drone.move(0,1,0)", однако дрон на нее никак не реагирует. Пробовал ради дебага заменить pcall(load(any)) на drone.setStatusText(any), и на дисплее дрона отобразилось отправленное сообщение (сколько влезло, разумеется). Пришел к выводу, что не выполняется load(?). Поясните, пожалуйста, в чем я не прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 17 мая, 2016 Всем доброго дня. Для управления дроном хотел использовать систему, передающую ему команды, а в его eeprom разместить только программу на прием и исполнение внешних команд. На дроне использовал следующее: local modem = component.proxy(component.list('modem')()) local drone = component.proxy(component.list('drone')()) modem.open(4455) while true do local rnd, _, _, _, _, any = computer.pullSignal() if rnd == "modem_message" then pcall(load(any)) end end Передаю с компьютера сообщение "drone.move(0,1,0)", однако дрон на нее никак не реагирует. Пробовал ради дебага заменить pcall(load(any)) на drone.setStatusText(any), и на дисплее дрона отобразилось отправленное сообщение (сколько влезло, разумеется). Пришел к выводу, что не выполняется load(?). Поясните, пожалуйста, в чем я не прав? Я бы посоветовал использовать event.pull для реагирования на событие Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 17 мая, 2016 Я бы посоветовал использовать event.pull для реагирования на событие В eeprom где 4кб памяти? 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 17 мая, 2016 Пришел к выводу, что не выполняется load(?). Поясните, пожалуйста, в чем я не прав? Загляни в конфиг мода. Там должны быть такие строчки: # Whether to allow loading precompiled bytecode via Lua's `load` # function, or related functions (`loadfile`, `dofile`). Enable this # only if you absolutely trust all users on your server and all Lua # code you run. This can be a MASSIVE SECURITY RISK, since precompiled # code can easily be used for exploits, running arbitrary code on the # real server! I cannot stress this enough: only enable this is you # know what you're doing. allowBytecode: false В переводе: # Разрешен ли запуск прекомпилированного байткода функцией 'load' # (и аналогичными функциями 'loadfile', 'dofile'). Включайте # только если абсолютно доверяете всем пользователям вашего сервера, # и всему запускаемому коду. Это может быть БОЛЬШОЙ УЯЗВИМОСТЬЮ, поскольку # прекомпилированный код может быть с легкостью использован для эксплойтов # и запуска произвольного кода на настоящем сервере! # Еще раз: включайте эту опцию, только если вы знаете, что делаете. allowBytecode: false Если значение равно false то функция отключена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Jet 30 Опубликовано: 17 мая, 2016 (изменено) Загляни в конфиг мода. Там должны быть такие строчки: Если значение равно false то функция отключена. Не не, в конфиге идет речь именно про байт-код. load(string) будет работать. А теперь автору: попробуй так (скобочки добавь) pcall(load(any)()) Изменено 17 мая, 2016 пользователем Jet Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ksandr0 Автор темы 0 Опубликовано: 17 мая, 2016 Всех благодарю за участие, решение оказалось в ином - убрать все local, в итоге работает с: modem = component.proxy(component.list('modem')())drone = component.proxy(component.list('drone')())modem.open(4455)while true dornd, _, _, _, _, any = computer.pullSignal()if rnd == "modem_message" thenpcall(load(any))endend Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 18 мая, 2016 Надо полагать, оператору load доступны только глобальные переменные, если их явно не передавать через окружение. a=11 local b=12 load("print(a,b)")() --> 11 nil 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ksandr0 Автор темы 0 Опубликовано: 18 мая, 2016 Надо полагать, оператору load доступны только глобальные переменные, если их явно не передавать через окружение. a=11 local b=12 load("print(a,b)")() --> 11 nil Вероятно, так и есть Отдельно уточнить хотел, как можно вывести результат в броадкаст? Попробовал : res=pcall(load(any)) Но броадкаст передал nil. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 18 мая, 2016 Вероятно, так и есть Отдельно уточнить хотел, как можно вывести результат в броадкаст? Попробовал : res=pcall(load(any)) Но броадкаст передал nil. На сколько я понял,pcall возвращает результат выполнения(true/false) и ответ от load И надо прикрепить return Что то вроде result, res = pcall(load("return "..any)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ksandr0 Автор темы 0 Опубликовано: 18 мая, 2016 На сколько я понял,pcall возвращает результат выполнения(true/false) и ответ от load И надо прикрепить return Что то вроде result, res = pcall(load("return "..any)) Здесь в переменную запишется только то, что функция выполнится, т.е. true в примере на скриншоте. Хотелось бы получить именно результат выполнения (из скриншота - 80 и 25). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 18 мая, 2016 (изменено) Здесь в переменную запишется только то, что функция выполнится, т.е. true в примере на скриншоте. Хотелось бы получить именно результат выполнения (из скриншота - 80 и 25). res={pcall(load("return "..any))} res[1]>>true res[2]>>80 res[3]>>25 res={pcall(load("return "..any))} tmp="" for id=2, #res do tmp=tmp.." | "..res[id] end modem.broadcast(port, tmp) Изменено 18 мая, 2016 пользователем Asummonster 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ksandr0 Автор темы 0 Опубликовано: 18 мая, 2016 res={pcall(load("return "..any))} res[1]>>true res[2]>>80 res[3]>>25 res={pcall(load("return "..any))} tmp="" for id=2, #res do tmp=tmp.." | "..res[id] end modem.broadcast(port, tmp) Вот теперь дошло - в фигурные скобки заключить pcall(load.. забыл. Спасибо за пояснения, вопрос закрыт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 19 мая, 2016 Поиск по форуму выдает с десяток подобных тем, им тоже можно иногда пользоваться. http://computercraft.ru/topic/833-oc-bios-net-dlia-tcentralizovannogo-upravleniia-setiu-kont/ 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ksandr0 Автор темы 0 Опубликовано: 19 мая, 2016 Поиск по форуму выдает с десяток подобных тем, им тоже можно иногда пользоваться. http://computercraft.ru/topic/833-oc-bios-net-dlia-tcentralizovannogo-upravleniia-setiu-kont/ Видел эту тему, но тогда не обратил внимания на отсутствие local в объявлении переменных. К тому же не очень хорошо пока разбираю чужой однострочный код. Впредь буду внимательней к деталям. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах