таблица, возвращающая значение nil при вызове функции - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь пропустить таблицу через несколько функций и вернуть ее, но она работает только в определенной степени. Я почти уверен, что это как-то связано со сферой, но я не могу решить это, так как я новичок с LUA. Я попытался поместить таблицу в строку 1 и установить ее глобально, но безрезультатно. Ошибка: аргумент bag: ожидаемая таблица, но полученная ноль.

function returnToTunnel(movementTable)
    for i = table.maxn(movementTable), 1, -1  do  --this is where I get the error.
        if (movementTable[i] == 1) then
            turtle.down()
        elseif (movementTable[i] == 2) then
            turtle.up()
        elseif (movementTable[i] == 3) then
            turtle.back()
            turtle.turnRight()
        elseif (movementTable[i] == 4) then
            turtle.back()
            turtle.turnLeft()
        elseif (movementTable[i] == 5) then
            turtle.back()
        end
    end
end

function mineOre(locationParam, movementTable)
    if (locationParam == 1) then
        turtle.digUp()
        turtle.suckUp()
        turtle.up()
        table.insert(movementTable, 1)
    elseif (locationParam == 2) then
        turtle.digDown()
        turtle.suckDown()
        turtle.down()
        table.insert(movementTable, 2)
    elseif (locationParam == 3) then
        turtle.turnLeft()
        turtle.dig()
        turtle.suck()
        turtle.forward()
        table.insert(movementTable, 3)
    elseif (locationParam == 4) then
        turtle.turnRight()
        turtle.dig()
        turtle.suck()
        turtle.forward()
        table.insert(movementTable, 4)
    elseif (locationParam == 5) then
        turtle.dig()
        turtle.suck()
        turtle.forward()
        table.insert(movementTable, 5)
    end
    locationParam = oreCheck()
    if (locationParam > 0) then
        mineOre(locationParam, movementTable)
    else
        return movementTable
    end
end

function digTunnel(tunnelLengthParam)
    local oreFound
    local movement = {}

    for i = 1, tunnelLengthParam do
        turtle.dig()
        turtle.forward()
        oreFound = oreCheck()
        if (oreFound > 0) then
            movement = mineOre(oreFound, movement)
            returnToTunnel(movement)
        end
        if ((i % 2) == 1) then
            turtle.digUp()
            turtle.up()
        elseif ((i % 2) == 0) then
            turtle.digDown()
            turtle.down()
        end
        oreFound = oreCheck()
        if (oreFound > 0) then
            movement = mineOre(oreFound, movement)
            returnToTunnel(movement)
        end
    end
end

Итак, функция digTunnel вызывает две другие функции mineOre и returnToTunnel.

Я искал в LUA руководство и несколько сайтов, но не могу понять это. Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 30 марта 2020

Ваша функция mineOre не возвращает таблицу, но ноль, когда locationParam> 0.

if (locationParam > 0) then
  mineOre(locationParam, movementTable)
else
  return movementTable
end

Следовательно, это приведет к тому, что значение nil окажется в table.maxn

 movement = mineOre(oreFound, movement)
 returnToTunnel(movement)
...