2015-04-10 2 views
1

Я изучаю программирование в computercraft (minecraft) и испытываю некоторые проблемы с чтением некоторых ячеек памяти.Для цикла внутри функции в Lua, Computercraft

Функция, над которой я работаю, должна пройти через все ячейки и объединить емкость хранилища с переменной в цикле for.

Это то, что я до сих пор

local cell1 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_2") 
local cell2 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_3") 
local cell3 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_4") 
local cell4 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_5") 
local cell5 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_6") 
local cell6 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_7") 

cells = {"cell1", "cell2", "cell3", "cell4", "cell5", "cell6"} 

local totStorage 

function getTotStorage(table) 
    for key = 1,6 do 
     x = table[key] 
     totStorage = totStorage + x.getMaxEnergyStored()   
    end 
    print(totStorage) 
end 

Я получаю ошибку на этой линии

totStorage = totStorage + x.getMaxEnergyStored()  

говоря: «Попытка вызова ноль». Любые предложения?

ответ

1
cells = {"cell1", "cell2", "cell3", "cell4", "cell5", "cell6"} 

представляет собой сокращенный:

cells = { 
-- key value 
    [1] = "cell1", 
    [2] = "cell2", 
    [3] = "cell3", 
    [4] = "cell4", 
    [5] = "cell5", 
    [6] = "cell6" 
} 

Если предположить, что ваш getTotStorage вызова аналогичен ниже (вы не отправляли его)

getTotStorage(cells) 

В цикле вы пытаетесь назвать метод на x, который является строковым значением:

for key = 1,6 do 
    x = table[key] 
    totStorage = totStorage + x.getMaxEnergyStored()   
end 

Это, по существу, пытается сделать:

totStorage = totStorage + ("cell1").getMaxEnergyStored() 

Что вы можете сделать, это изменить код так, что значения являются объекты, возвращаемые peripheral.wrap:

local cells = { 
    peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_2"), 
    peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_3"), 
    peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_4"), 
    peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_5"), 
    peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_6"), 
    peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_7"), 
} 

function getTotStorage(t) 
    local totStorage = 0 
    for i,v in ipairs(t) do 
    totStorage = totStorage + v.getMaxEnergyStored() 
    end 
    print(totStorage) 
end 

Несколько наблюдений:

  • Используйте local, когда вы можете (т.е. totStorage), чтобы ограничить объем переменных (нет необходимости иметь счетчик цикла как глобальные)
  • Не называть переменные, которые сталкиваются с стандартной библиотекой Lua (т.е. string, table, math)
  • ipairs является лучший способ петли через последовательность
+0

Спасибо, помог много! –