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

Ошибка при работе с контроллером МЭ

Вопрос

Подключено адаптер между ос и контроллерем мэ,после отключение контроллера мэ выдает такую ошибку снизу,помогите исправит в коде ошибкуы/решил проблему сам.никто не смог помочь

local component = require("component")
local term = require("term")
local string = require("string")
local meController = component.me_controller
local gpu = component.gpu
 
items = {

 

javaw_2022_05_10_19_26_15_920.jpg

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

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


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

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

@Leo857 

Скриншот сообщает о том, что в строке 186 произошла попытка обращения к полю несуществующей таблицы.
Код этой строки:
 

    if not meItem[1].isCraftable then

Я не имею опыта сопряжения компьютера с МЭ-сетью. Какая из таблиц может быть проблемной, я не знаю. Но вариантов не так много. Попробуй такие:

  • if meItem and not meItem[1].isCraftable then
  • if meItem[1] and not meItem[1].isCraftable then
  • if meItem and meItem[1] and not meItem[1].isCraftable then

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

 

Изменено пользователем eu_tomat
исправил ошибку

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


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

Как я понял, у него часто вырубают свет на МЭ, из за чего становится плохо сразу всему. Там разве что обвязку повесить "Нет связи с МЭ" но лень

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


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

В данном коде эту ошибку можно словить по нескольким причинам:

МЕ сеть без энергии

В МЕ нет шаблона крафта

В списке items не верно указано название предмета

 

Опрос предметов по id оправдан если их немного

Например для 10 предметов требуется 10 опросов сети, а если предметов больше 500 ?

Правильней будет получить все предметы сети одним запросом а затем уже разобрать таблицу

 

Опрос по id также создаёт ещё одну проблему

в сети могут быть предметы с одинаковым названием но разными nbt

они будут считатся разными

 

поделюсь кусочком своего прекрафта решающих эти проблемы, увы целиком не могу

Скрытый текст

if interface.getStoredPower() == 0 then
    gpu.setForeground(0xFF0000)
    print("ме сеть без энергии")
  else
    local data = interface.getItemsInNetwork()
    if not data or #data == 0 then
      gpu.setForeground(0xFF0000)
      print("в ме сети нет предметов")
    else
      for i = 1,#CraftList do
        stop(0)
        gpu.fill(1,1,w,1," ")
        gpu.setForeground(0xFFFF00)
        gpu.set(1, 1, "проверяю список крафта -")
        gpu.setForeground(0xFF00FF)
        gpu.set(26, 1, i.." / "..#CraftList)
        local storedItem = 0
        for item = 1,#data do
          if data[item] ~= nil then
            if data[item].label == CraftList[i].label then
              storedItem = storedItem + data[item].size
            end
          end
        end
        if storedItem < CraftList[i].craft then
          local delta = CraftList[i].craft - storedItem
          local craftAmount = delta
          if delta > curMaxRequest then
            craftAmount = curMaxRequest
          end

 

 

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

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


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

@eu_tomat после этого выдает ошибку на 191 строке

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


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

@serafim проблема какраз в отключение мэ контроллера как указал

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


Ссылка на сообщение
Поделиться на других сайтах
14 часа назад, Leo857 сказал:

@eu_tomat после этого выдает ошибку на 191 строке

А в строке 191 у нас такой код: displayTable[itemIndex].currentValue = meItem[1].size

Значит, вероятнее всего, проблема, в meItem или meItem[1], и эта строка в случае несуществующей таблицы не имеет смысла.

 

Если требуется исправить быстро, то для выполнения этой строки также надо добавить условие проверки таблицы. Но, скорее всего, по условию должна выполняться не только эта строка, но целый блок кода. Какой именно, надо уже разбираться в логике работы программы. Иначе та же ошибка где-нибудь ещё вылезет.

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


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

@eu_tomat c этим кодом вообще не выдает ошибку но придется написать например 1 что бы запустить саму программу пишет так /home ждет команду(например я указал этот код в edit 1,ждет что бы я указал 1 что бы запустилась)как быть?

  • if meItem and meItem[1] and not meItem[1].isCraftable then

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


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

@eu_tomat а то что указали со строкой 191 вообще не понятно придется удалит эту строку или как быть что бы вообще не было таких проблем с meltem

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


Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, Leo857 сказал:

@eu_tomat c этим кодом вообще не выдает ошибку но придется написать например 1 что бы запустить саму программу пишет так /home ждет команду(например я указал этот код в edit 1,ждет что бы я указал 1 что бы запустилась)как быть?

  • if meItem and meItem[1] and not meItem[1].isCraftable then

Не понимаю, о чём здесь идёт речь. Что придётся написать? Чтобы Какую программу запустить? Почему 1? Кто пишет, что /home ждёт команду? Что значит, указал код в edit 1?

 

17 часов назад, Leo857 сказал:

@eu_tomat а то что указали со строкой 191 вообще не понятно придется удалит эту строку или как быть что бы вообще не было таких проблем с meltem

Я не работал конкретно с МЭ-сетью и не знаю всех нюансов. Поэтому предлагаю варианты, что с этим вообще можно сделать. Придётся ли удалить эту строку? Если она не нужна, то можно удалить. Если она нужна, то можно добавить условие на выполнение этой строки. А может, не только этой. Это возможные варианты. Или ты просишь выбрать лучший вариант?

 

Можно убрать ошибку, которую выдаёт Lua, но это не значит, что программа после этого будет работать правильно. Выбор осуществляет автор программы, исходя из предпочитаемой им логики действий.

 

А какова логика? Попробуем разобраться. Например, каков смысл строк 186 и 191, в которых проявилась проблема? Что они делают?

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


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

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

Если же критически важно чтобы программа продолжала работать в любом случае, то можно осуществлять не выход, а переход к ожиданию восстановления подключения к МЕ сети. Что-то вроде

 if not value_name then waiting_for_ME_up) 

---и что-то вроде такого в самом ожидании
---------------
waiting for_ME_up()
while math.huge do
  if component.isAvailable("me_interface") then
    return true
  else
    os.sleep(0.05)
  end
end
---------------

then waiting_for_ME_connect() плюс сам этот цикл ожидания МЕ). Но делать такие вкладки в код программы придется во всех местах, где происходит обращение к таблице содержащей

 методы работы с оной.

 

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


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

@Taoshi был бы благодарен если бы код добавили то куда именно надо что бы программа вообще не отключался а то не совсем ясно куда в какие строки

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


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

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

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

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

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

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

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

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

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


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