WheatComp
-
Публикации
59 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем WheatComp
-
-
1 минуту назад, ECS сказал:tankTable[1].amount
amount - это не цифра
-
48 минут назад, ECS сказал:tank1 = {amount = 222, capacity = 333} tank2 = {amount = 452, capacity = 349} tankTable = {tank1, tank2} -- Сначала перебираем танки for tankIndex, tank in ipairs(tanksTable) do -- Затем все поля танка for key, value in pairs(tank) do print(key, value) end end
Открываем вложенную таблицу вложенным циклом - изящно! Если можно все-таки получить доступ к значению "amount" посредством по сути цифрой (коей является индекс), то как это можно выразить в одной строчке print()-а, используя только цифры? Типа tankTable[1][1]?
-
-
@eu_tomat да, потому что этот метод можно применить и к другим вложенным таблицам.
7 минут назад, eu_tomat сказал:значения вложенных таблиц
значения переменных вложенных таблиц, я бы сказал (capacity).
-
27 минут назад, eu_tomat сказал:но пытаешься по этим ключам получить значение в таблице tankTable[1].
Значение получить-то можно, если так изменить первую таблицу:
tank1 = {222, capacity = 333}
и выводить так:
print(tankTable[key][key])
А вот к значению переменной capacity уже нет доступа таким образом. Понятно, что можно получить доступ напрямую: print(tankTable[key].capacity, но как получить доступ через средства индексации и цикла?
-
@eu_tomat Сделал таблицу, имитирующую таблицу, возвращаемую tank_controller:
tank1 = {amount = 222, capacity = 333} tank2 = {amount = 452, capacity = 349} tankTable = {tank1, tank2} for key, value in pairs(tankTable) do print(value) print(tankTable[1][key]) end
Выводит nil nil.
-
@eu_tomat а нельзя ли обойтись без сложностей? Нельзя ли захардкоджить и получить доступ к значениям внутренних таблиц при помощи индекса цикла for и простого доступа вроде table[1][1][key] или table[1.1.key] или table[1][1].key? Мы же знаем, что внутри внешней таблицы - таблица?
-
-
В 22.05.2023 в 18:26, ECS сказал:Вместо них лучше установить апгрейд опыта, построить ферму кобблы и позволить роботу фармить экспу. Спустя 2-4 реальных часа у тебя раскачается "алмазный" робот с колоссальным буфером энергии
Апгрейд опыта поставил, пытаюсь выкачать с помощью саженца, сажает, убирает, сажает, убирает. За 5 часов только до 6-го уровня дошел, цвет не поменялся. Пытался на ферме кобблы ставить, там раза в 2 медленнее.
-
19 часов назад, eu_tomat сказал:Там написано, что при нажатии генерируется событие. Соответственно, чтобы получить информацию, надо это событие обработать.
Иногда встречается вложенная таблица. Интересно, можно ли вложенную таблицу напечатать посредством for key, value in pairs do? Например, component.tank_controller.getFluidInTank(5) возвращает вложенную таблицу:
-
В 22.05.2023 в 18:26, ECS сказал:Геоанализатор - легальный чит.
В 22.05.2023 в 18:26, ECS сказал:Апгрейд навигации для вычисления позиции/поворота - мусор.
Только что узнал, наконец-то, для чего нужно зеленое пятно у планшета. Оказывается, можно в планшет положить геоанализатор или апгрейд навигации, долго нажать на блоке и получить какую-нибудь информацию о блоке, на которой пятно. Там пишется, что нужно нажимать ПКМ 1 секунду, но у меня почему-то не пищит, и информацию не дает, ни в терминал планшета, ни в интерпретатор. Пробовал component.geolyzer.analyze(3), но показывает воздух.
-
2 часа назад, eu_tomat сказал:Если выбирать сетевую карту кодом modem = component.modem, то будет выбран именно главный компонент. И если им является проводная карта, то сообщение по беспроводному каналу не будет послано.
Вот-вот, это тот подводный камень, об который я споткнулся. Главное - об этом в туториале ни слова. Сколько таких подводных камней впереди - неизвестно...
2 часа назад, eu_tomat сказал:Кстати, я думаю, что в описанной задаче вообще не нужна проводная плата, т.к. и беспроводная точно также обеспечивает передачу по проводам.
Да, оказывается можно обойтись без проводной.
-
2 часа назад, eu_tomat сказал:Широковещательное сообщение может быть принято любой сетевой платой с открытым портом-адресатом при наличии среды передачи
Значит, дело в беспроводной карте хоста? Если беспроводная карта не primary, то она не отсылает сообщение.
2 часа назад, eu_tomat сказал:Беспроводную сетевую плату можно рассматривать как улучшенный вариант обычной проводной платы, т.к. она сохраняет возможность проводной связи.
Хотел бы уточнить, что это касается беспроводной карты 2-го уровня, 1-го уровня карта не поддерживает проводную связь.
-
17 часов назад, eu_tomat сказал:Предлагаю рассмотреть другой вариант решения задачи.
Хорошая реализация. Похоже, нужно будет делать так. Почему?
Вчера провел эксперимент. 2 компа, в одном 2 карты 2-х разных типов (назовем хост), в другом только проводная карта, 1 робот с беспроводной картой. Все команды на всех устройствах вводил через интерпретатор lua. В роботе и в не-хост компе запустил =event.pull("m"). C хоста ввел modem.broadcast(123, "message"). Не-хост компьютер получил сообщение, а в роботе так и висит =event.pull("m"). Он должен быть получить сообщение, потому что modem.broadcast же выполняется на всех двух картах? На хосте проверил getPrimary("modem"), оказалось, что стоит проводной модем. Поменял primary на беспроводной модем (setPrimary) - в этом случае сообщение получают оба устройства: и не-хост компьютер, и робот. Проделал это все 2 раза с тем же результатом.
А вот не-хост компьютер получает сообщение в любом случае, неважно, какая карта стоит в primary в хосте. Даже если сделать broadcast во время, когда в primary хоста стоит беспроводная карта, не-хост все равно получает сообщение, и показывает адрес беспроводной карты (в поле, где указан адрес карты-отправителя), хотя у него не установлена беспроводная карта! Если вверху, где подчеркнуто, то почему же здесь не так же (то есть не-хост не должен был получать сообщение)?
В общем, не совсем ясно, для чего именно служит Primary модемов, в документации об этом мало сказано. Предполагаю, для использования в первую очередь. Тогда непонятно, почему же разный результат для модемов разного типа. Но, очевидно, при применении беспроводной карты (в случае, если в компе 2 разных карт) нужно как-нибудь обрабатывать эту особенность, можно через Ваш код, можно через invoke прямо прописав адрес карты.
-
7 часов назад, ECS сказал:Метод modem.setWakeMessage() - имба.
Да, хорошая команда. Я установил микроконтроллер, через час он запускает эту команду, роботы просыпаются и начинают собирать урожай.
7 часов назад, ECS сказал:Вместо них лучше установить апгрейд опыта, построить ферму кобблы и позволить роботу фармить экспу. Спустя 2-4 реальных часа у тебя раскачается "алмазный" робот с колоссальным буфером энергии
До апгрейда опыта еще не дошел. Можно поподробнее, где хранится этот буфер энергии? И где смотреть "алмазность", или "железность" робота?
7 часов назад, ECS сказал:Геоанализатор - легальный чит.
До его функции анализа ископаемых тоже не дошел, пока определяю растения.
7 часов назад, ECS сказал:Апгрейд крафтинга очень недооценён. Каким бы большим ни был инвентарь, он гарантированно заполнится всякими андезитами/мусоритами. Эту проблему в соло решает крафтинг,
А если просто выкидывать мусор? Прописать названия, если == то дропнуть.
7 часов назад, ECS сказал:Жёсткий диск 1 тира - топ за свои деньги.
Пока им и пользуюсь, программы небольшие.
-
40 минут назад, Fingercomp сказал:То, что ей передана пятёрка, означает, что ждать будет не дольше 5 секунд, но если какое-то событие придёт раньше
Да, Вы правы, пришел еще один сигнал. Я не стал выкладывать весь код, дабы не загромождать сообщение. В конце send.lua была еще одна строчка, отсылающая сигнал:
modem.broadcast(port, "execute", data) component.invoke(address, "broadcast", port, "execute", data)
это я экспериментировал с первичностью модема а modem.boradcast() почему-то не стал комментить. Она и прерывала, оказывается, pullSignal(). При удалении одной из этих строк pullSignal работает нормально, придется быть осторожнее.
-
2 часа назад, Oleshe сказал:Смотри: когда ты добавляешь компонент, он уже в компьютере, его не надо определять там что-то с ним делать, система разберётся сразу когда ты его вставишь.
В документации написано, то isAvailable проверяет, есть ли первичный компонент данного типа:
Цитатаcomponent.isAvailable(componentType: string): boolean
Checks if there is a primary component of the specified component type.Это тоже, конечно же, еще один косяк разработчиков. Надо было написать component.isAvailablePrimary(). То есть эта строка проверяет не просто есть ли модем в системном блоке, а именно наличие первичного модема. Но, как сказал @eu_tomat , (было бы, кстати, любопытно посмотреть, где устанавливается такая пауза), почему-то установлена пауза в 0.1 сек. после команды component.setPrimary().
Я пытался не просто проверить наличие модема в компе, а установить модем, если можно так выразиться, "по-умолчанию". Как, например, с принтерами. В уиндоуз на какой принтер ставишь галочку "По умолчанию", этот принтер и начинает печатать, когда в какой-нибудь программе нажимаешь на кнопку "Печать". А тут у меня после программы, которая принимала данные через проводную сетевую плату, первичной была проводная карта. Но тут, похоже, действительно не надо заморачиваться с первичностью, возможно, дело было в другом. А может, надо. Сейчас разбираюсь с этим вопросом.
-
Оказалось, что поторопился радоваться с computer.pullSignal(5). В коде (robot.lua) ниже эта команда не выполняется, робот сразу поворачивается:
local robot = component.proxy(component.list("robot")()) computer.pullSignal(5) for i = 1, 4 do robot.turn(true) end
Скопировал функцию os.sleep(), тоже не выполняется, программа send.lua высылает только строчку "executeFailed", причину не высылает:
local robot = component.proxy(component.list("robot")()) function os.sleep(timeout) checkArg(1, timeout, "number", "nil") local deadline = computer.uptime() + (timeout or 0) repeat event.pull(deadline - computer.uptime()) until computer.uptime() >= deadline end os.sleep(5) for i = 1, 4 do robot.turn(true) end
-
2 часа назад, Oleshe сказал:Ты ставишь компонент модема перед тем как проверить есть ли он.
Это разве не логично? Сначала поставил, чтобы было что проверять, а затем проверил.
2 часа назад, Oleshe сказал:обращается именно к компоненту addrs, имя функций пишешь в строковом варианте, например:
В этом случае работает, как и должно, спасибо!
-
8 часов назад, eu_tomat сказал:И ещё возникает вопрос: а зачем вообще переопределять главный компонент? Адрес нужного компонента уже известен, поэтому можно сразу обращаться к нему, не дёргая лишний раз API и не выдерживая паузу.
Стал заморачиваться с переопределением из-за того, что после закрытия программы для беспроводного модема команда component.getPrimary("modem") выдает адрес беспроводного, соответственно строка modem.broadcast(...) приводит к широкому вещанию проводным модемом (а мне нужно было, чтобы вещал беспроводной). Эта функция - modem.broadcast(...) применима к обоим типам модемов, поэтому выход был логичным - поменять приоритет модемов. Но он оказался не логичным с точки зрения разработчиков. Было бы удобнее, если бы были отдельные типы broadcast-a, например, modem.broadcastWireless(...), который приводил бы к посылке сигнала именно беспроводным модемом. Но так не было сделано. Я вот думаю, может, в лутовой дискете "Network" есть что-то подобное?
Разработчики подложили подводный камень в виде 0.1-секундной задержки и не сообщили об этом в официальном туториале. Ну чтож, их же много было, да и проект некоммерческий, насколько я понял. Может, потом исправят.
-
И при таком коде выдает то же самое (после закрытия программы для проводной карты), при повторном запуске этой же программы для беспроводной карты без изменений работает нормально:
local component = require("component") local modem = component.modem if component.isAvailable("modem") == true then print("available") component.setPrimary("modem", "a257b9") prim = component.getPrimary("modem").address print("Primary : "..prim) else print("unavail") end
Понятно, что он выдает ошибку на 68-й строчке 04_component.lua, не может выполнить get.Primary("modem"), но он же сказал, что isAvailable("modem") == true?
-
В одном компьютере установлены 1 проводной и 1 беспроводной модемы. Через проводной данные принимаются, а через беспроводной отсылаются данные рою из роботов. Каждый модем работает в разное время, с разными программами. Сначала запускаю программу для принятия данных через проводной. Закрываю, запускаю программу для беспроводной. В этот момент вылетает ошибка (фото). Каждый модем устанавливается своей отдельной программой как первичный через component.setPrimary("modem", "адрес модема"). После беспроводного программа для проводного запускается нормально, работает.
Интересно, что если повторно запустить программу для беспроводного, то все работает, и Primary определяется, и файл отсылается. Вот код:
local component = require("component") local modem = component.modem component.setPrimary("modem", "адрес модема") -- пробовал ставить и перед предыдущей строкой. prim = component.getPrimary("modem").address print("primary modem is : "..prim)
-
В 18.05.2023 в 13:59, ECS сказал:local event = require("event")
Нужна ли эта строчка в send.lua? В этом файле ничего не принимается, вроде.
-
16 часов назад, ECS сказал:Вообще, как я понял, тебе нужен некий аналог os.sleep(3) из OpenOS, который реализован как раз на чистом pullSignal.
Оказалось, мой косяк:
local robot = component.proxy(component.list("robot")()) local computer = component.proxy(component.list("computer")()) computer.pullSignal(3) for i = 1, 4 do robot.turn(true) end
определил computer, хотя он и так есть, как Вы и объяснили. Без этой строчки pullSignal работает как и должен работать. Наверное, им и буду пользоваться.
12 часа назад, Anon сказал:Да, из опенкомпов можно использовать симлинки, но простого ярлыка будет недостаточно - в игре он окажется обычным файлом с расширением .lnk.
Спасибо, работает, в том числе и модули можно использовать.
-
2
-




Почему package.lua не видит модуль?
в Общие
Опубликовано:
Как же тогда тут удалось обойтись без .amount?: