Function 调用函数时返回nil值的表

Function 调用函数时返回nil值的表,function,lua,parameter-passing,lua-table,Function,Lua,Parameter Passing,Lua Table,我试图通过几个函数传递一个表并返回它,但它只在一定程度上起作用。我几乎可以肯定这和范围界定有关,但由于我是LUA的新手,所以我无法解决这个问题。 我试着把表格放在第一行,并将其设置为全局,但没有效果。 错误:包参数:应为表,但为零 function returnToTunnel(movementTable) for i = table.maxn(movementTable), 1, -1 do --this is where I get the error. if (

我试图通过几个函数传递一个表并返回它,但它只在一定程度上起作用。我几乎可以肯定这和范围界定有关,但由于我是LUA的新手,所以我无法解决这个问题。 我试着把表格放在第一行,并将其设置为全局,但没有效果。 错误:包参数:应为表,但为零

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函数调用另外两个函数minore和returnToTunnel

我一直在查找LUA手册和几个网站,但没有找到答案。
谢谢你的帮助

当locationParam>0时,函数mineOre不返回表,而是返回nil

if (locationParam > 0) then
  mineOre(locationParam, movementTable)
else
  return movementTable
end
因此,这将导致在
表中出现一个nil值。maxn

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

我懂了。我要做的是,首先挖掘隧道时,它会扫描矿石。如果找到一个,它将进入mineOre函数。因为矿石是成组的,所以我希望它是递归的。如果条件正好如此,则扫描矿石的函数返回一个大于0的数字(如果附近有矿石)。基于此,它将再次开始采矿。因此,如果我将代码更正为
return mineOre(locationParam,movementTable)
它仍然是递归的,并为我提供一个包含多个条目的表,对吗?是的,但您不必首先指定movement=mineOre,因为表是通过引用复制的。所有递归调用都将在相同的表值上运行。很高兴知道,谢谢!之后程序运行良好。只是一个提示:如果您试图实现回溯,可以使用递归非常轻松地实现:D@DarkWiiPlayer不幸的是,我不知道怎么做。我选择了这个表,因为它记录了移动,我希望它在开采完矿石后返回。我甚至不知道如何使用递归实现这一点,但我想:有一个功能:扫描矿石,开采矿石,移动到那个地点,调用它自己,然后返回到它的初始位置。每个函数只向前和向后移动一个块,所以你总是在相同的位置结束:D