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

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

Вопрос

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

local component = require("component")
local term = require("term")
local string = require("string")
local meController = component.me_controller
local gpu = component.gpu
 
items = {
   { "IC2:itemPartAlloy", 0, 9999999,16,"Композит" },
   --id, damage, нужно сколько, по сколько крафтить, название
}
 
loopDelay = 1 -- Seconds between runs
maxCpuUsage = 6 -- How many CPUs the program can use
twoColumnMode =false -- Show to columns on the screen
 
 
-- Do not touch this variables
currentCpuUsage = 0
returnValues = {}
displayTable = {}
initDone = false
-- 
 gpu.setResolution(63,19)
function initDisplayTable()
  
  for itemIndex = 1, #items do
    itemName = items[itemIndex][1]
    itemDamage = items[itemIndex][2]
    itemMinValue = items[itemIndex][3]
    itemMaxCraftValue = items[itemIndex][4]
    meItem = meController.getItemsInNetwork({ name = itemName, damage = itemDamage})
    itemLabel = meItem[1].label
    itemCurrentValue = meItem[1].size
    
    currentItem = { name = itemName, damage = itemDamage, minValue = itemMinValue, maxCraftValue = itemMaxCraftValue, label = itemLabel, currentValue = itemCurrentValue, currentCrafting = 0, error = false, errorCode = 0 }
    table.insert(displayTable, currentItem)
 
    displayColumns()
 
    initDone = true
  end
end
 
function dump(o)
   if type(o) == 'table' then
      local s = '{ '
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
         s = s .. '['..k..'] = ' .. dump(v) .. ','
      end
      return s .. '} '
   else
      return tostring(o)
   end
end
 
function displayColumns()
  term.clear()
 
  io.write("|-----------Название-----------|-Колво-|-Крафт-|----Ошибки----|")
 
  if twoColumnMode then
    io.write("          |-----------Название-----------|-Колво-|-Крафт-|----Ошибки----|")
  end
 
  io.write("\n")
 
  io.write("|-------------------------------------------------------------|")
  
  if twoColumnMode then
    io.write("          |-------------------------------------------------------------|")
  end
 
  leftColumnIndex = 1
  rightColumnIndex = 74
  k = 1
 
  lineNumber = 3
 
  for itemIndex = 1, #displayTable do
    maxLabelLength = 30
    --label = displayTable[itemIndex].label
    --labelLength = string.len(label)
    --if labelLength > maxLabelLength then
    --  label = string.sub(displayTable[itemIndex].label, 1, maxLabelLenth -3)
    --end
    label = items[itemIndex][5]
    labelLength = string.len(label)
    pos = leftColumnIndex
    if twoColumnMode and k % 2 == 0 then pos = rightColumnIndex end
    gpu.set(pos, lineNumber, "|")
 
    gpu.setForeground(0xFFC125)
    gpu.set(pos + 1, lineNumber, label)
    
    gpu.setForeground(0xFFFFFF)
    gpu.set(pos + 31, lineNumber, "|       |       |              |")
    
    lineNumber = lineNumber + 1
    if twoColumnMode and k % 2 == 1 then
      lineNumber = lineNumber - 1
    end
 
    k = k + 1
  end
end
 
function displayTableValues()
  leftColumnIndex = 1
  rightColumnIndex = 74
  k = 1
  lineNumber = 3
 
  for itemIndex = 1, #displayTable do
    pos = leftColumnIndex
    if twoColumnMode and k % 2 == 0 then
      pos = rightColumnIndex
    end
 
    if displayTable[itemIndex].currentValue < displayTable[itemIndex].minValue then
      gpu.setForeground(0xFF0000)
    else
      gpu.setForeground(0x00FF00)
    end
 
    amountLength = string.len(dump(displayTable[itemIndex].currentValue))
    spaceLength = 7 - amountLength
    amountString = dump(displayTable[itemIndex].currentValue)
    for i = 1, spaceLength do
      amountString = " " .. amountString
    end
    gpu.set(pos + 32, lineNumber, amountString)
 
    if displayTable[itemIndex].currentCrafting > 0 then
      craftLength = string.len(dump(displayTable[itemIndex].currentCrafting))
      spaceLength = 7 - craftLength
      craftString = dump(displayTable[itemIndex].currentCrafting)
      for i = 1, spaceLength do
        craftString = " " .. craftString
      end
      
      gpu.setForeground(0x2F95D7)
      gpu.set(pos + 40, lineNumber, craftString)
    else
      gpu.setForeground(0xFFFFFF)
      gpu.set(pos + 40, lineNumber, "       ")
    end
 
    if displayTable[itemIndex].error then
      gpu.setForeground(0xFF0000)
      if displayTable[itemIndex].errorCode == 1 then
        gpu.set(pos + 48, lineNumber, "              ")
      end
      if displayTable[itemIndex].errorCode == 2 then
        gpu.set(pos + 48, lineNumber, "No ingredients")
      end
      if displayTable[itemIndex].errorCode == 3 then
        gpu.set(pos + 48, lineNumber, "All Cpus busy ")
      end
      if displayTable[itemIndex].errorCode == 0 then
        gpu.set(pos + 48, lineNumber, "              ")
      end
    else
      gpu.setForeground(0xFFFFFF)
      gpu.set(pos + 48, lineNumber, "              ")
    end
    
    lineNumber = lineNumber + 1
    if twoColumnMode and k % 2 == 1 then
      lineNumber = lineNumber - 1
    end
 
    k = k + 1
  end
end
 
while true do
  if not initDone then
    initDisplayTable()
  end
  -- term.clear()
  for itemIndex = 1, #displayTable do  
    displayTable[itemIndex].error = false
    displayTable[itemIndex].errorCode = 0
    meItem = meController.getItemsInNetwork({ name = displayTable[itemIndex].name, damage = displayTable[itemIndex].damage})
    if not meItem[1].isCraftable then
      displayTable[itemIndex].error = true
      displayTable[itemIndex].errorCode = 1
    end
 
    displayTable[itemIndex].currentValue = meItem[1].size
 
    for indexReturnValue = 1, #returnValues do
      pcall(
        function()
          if returnValues[indexReturnValue].isDone() or returnValues[indexReturnValue].isCanceled() then
            currentCpuUsage = currentCpuUsage - 1
            table.remove(returnValues, indexReturnValue)
          end
        end
      )
    end
 
    if displayTable[itemIndex].currentValue < displayTable[itemIndex].minValue and currentCpuUsage < maxCpuUsage then
      tmpCpus = meController.getCpus()
      occupiedCpus = 0
      for cpuIndex = 1, #tmpCpus do
        if tmpCpus[cpuIndex].busy then occupiedCpus = occupiedCpus + 1 end
      end
 
      if #tmpCpus == occupiedCpus then
        displayTable[itemIndex].error = true
        displayTable[itemIndex].errorCode = 3
      else
        delta = displayTable[itemIndex].minValue - displayTable[itemIndex].currentValue
        craftAmount = delta
        if delta > displayTable[itemIndex].maxCraftValue then
          craftAmount = displayTable[itemIndex].maxCraftValue
        end
        
        craftables = meController.getCraftables({ name = displayTable[itemIndex].name, damage = displayTable[itemIndex].damage})
        
        if craftables.n >= 1 then
          craftItem = craftables[1]
          returnValue = craftItem.request(craftAmount)
          
          if returnValue.isCanceled() then
            displayTable[itemIndex].error = true
            displayTable[itemIndex].errorCode = 2
          else
            displayTable[itemIndex].currentCrafting = craftAmount
            table.insert(returnValues, returnValue)
            currentCpuUsage = currentCpuUsage + 1
          end
        end
      end
    end
 
    displayTableValues()
  end
  os.sleep(loopDelay)
end

 

javaw_2022_05_10_19_26_15_920.jpg

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


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

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

@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 эмодзи.

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

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

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


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