Lua中的函数、表和for循环

现在我在做一些测试,但我似乎找不到这段代码的问题在哪里-有任何想法吗?

function IATetris(Pieza,Rotacion,Array)
io.write("The table the script received has: ",Pieza,"\n")
RotacionInicial = Rotacion
PosInicial = 7
final = #Array——这可以获取数组的大小
i = 1

    for y = 1, 20 do——我的俄罗斯方块板的数组在x为20,y为14,所以它会像这样Array2D[20][14]

    io.write(" First for y ",y,"\n")
    Array2D[y]={}——清除新数组
    for x = 1,14 do
    io.write(" First for x ",x,"\n")
        if i == final then break end

        io.write(" First for i",i,"\n")
        Array2D[y][x] = Array[i]
        i= i+1——看起来你不能在lua中使用i ++
        end
   end
end

我正在获取2个整数和1个数组。我必须在控制台中写入以检查程序实际上走到了哪里,我得到的是......

第一条日志消息:“脚本接收到的表格是:”

第二条日志消息:“首先为y”

但我没有比这更进一步,所以程序可能在那里崩溃?这个函数每20秒左右被调用一次。我真的不知道为什么会发生这种情况。任何帮助将不胜感激,谢谢。

原文链接 https://stackoverflow.com/questions/10422635

点赞
stackoverflow用户15996
stackoverflow用户15996

如果这行代码被记录:

io.write(" First for y ",y,"\n")

而这行代码没有被记录:

io.write(" First for x ",x,"\n")

那么问题出在这两行其中的一行:

Array2D[y]={} --清除新数组
for x = 1,14 do

for x... 对于我来说绝对有效,所以我建议问题出在 Array2D 行。这行代码语法上没有问题,因此它必须是一种运行时错误。运行时错误应该由 Lua 或嵌入的应用程序报告。如果它们没有,而函数只是“停止”,那么你就是在盲目调试,你会浪费很多时间在这样的问题上。

我能想到的唯一的错误可能会在那一行上发生,就是如果 Array2D 不是一个表。由于你正在尝试对其进行索引,因此它需要是一个表。在函数中没有声明 Array2D,如果它是已经在其他地方定义的全局变量,那么这很好。但是,如果它是这个函数中仅用于本地变量,则应该将 local Array2D = {} 添加到其中。

不知道 Array2D 是什么,或者实际上你的错误是什么,很难给出更准确的答案。如果你真的没有更好的方法来找出问题,那么在 Array2D 行之前加上这个就可以测试我的假设:

io.write("Array2D is: ", type(Array2D), "\n")
2012-05-02 23:05:59
stackoverflow用户501459
stackoverflow用户501459

看起来 Array2D 没有初始化(或者不是一个表格),所以它会出错在 Array2D[y]={} 这一行。

您可以使用 pcall 调用一个函数并捕获错误,像这样:

local ok, msg = pcall(IATetris, pieza, rotacion, array)
if not ok then
    print("ERROR:", msg)
end

顺带一提:您应该尽可能使用 local 关键字来限制您的变量范围。

2012-05-02 23:08:20