Lua 回到 for 循环

问题描述 投票:0回答:3

我的 Lua goto 有问题。 运行脚本后出现错误: 未定义标签'返回'

代码:

function determinant()
det = 1
for k = n, 2, -1 do
    if a[k][k] == 0 then
        goto skok_jedna
    end
    ::back::
    for l = 1, k-1 do
        for m = 1, k-1 do
            a[l][m] = a[l][m] - a[l][k] * a[k][m] / a[k][k]
        end
    end
    det = det * a[k][k]
end
det = det * a[1][1]
goto konec_det

::skok_jedna::
l = k

::skok_dva::
l = l - 1
if l == 0 then
    det = 0
    return
end

if a[l][k] == 0 then 
    goto skok_dva
end

for m = 1, k do
    c[n] = a[l][m] 
    a[l][m] = a[k][m]
    a[k][m] = c[m]
end

det = det * -1
goto back 
::konec_det::
end

该脚本是使用克莱默法则计算 n 变量线性方程组的程序的一部分。

问题出在哪里?谢谢大家的回复

for-loop lua goto
3个回答
3
投票

Lua手册说:

  1. 标签在定义它的整个块中都是可见的,嵌套函数内部除外。
  2. goto 可以跳转到任何可见标签,只要它不进入局部变量的范围。

您的代码中发生了什么:

  1. 标签
    back
    从线上看不到
    goto back
  2. 您正在跳转到循环变量的范围内
    k

0
投票

谢谢回复。 我用第二个函数解决了这个问题(从 for 循环中删除 goto 并返回到 for 循环):

function determinant()
det = 1
for k = n, 2, -1 do
    if a[k][k] == 0 then
        det2 {k}
        if det == 0 then
            return
        end
    end

    for l = 1, k-1 do
        for m = 1, k-1 do
            a[l][m] = a[l][m] - a[l][k] * a[k][m] / a[k][k]
        end
    end
    det = det * a[k][k]
end
det = det * a[1][1]
end

function det2(k)
l = k
::skok_dva::
l = l - 1
if l == 0 then
    det = 0
    return
end
if a[l][k] == 0 then 
    goto skok_dva
end
for m = 1, k do
    c[n] = a[l][m] 
    a[l][m] = a[k][m]
    a[k][m] = c[m]
end
det = det * -1
end

0
投票

当然你不能跳进for循环。这不是Lua的问题。 For 循环是一个作用域,在您的情况下,它具有局部变量“k”,该变量在作用域的开头、“后退”标签之前初始化。您甚至希望您的代码做什么?跳转到 ::back:: 后,字面上的下一行是“for l = 1, k-1 do” - 但变量“k”不存在。那么你到底希望你的代码能用它来做什么呢? 这就是为什么像 Lua/Java/Python 这样不声明变量或其类型的简单语言对于程序员来说是如此可怕。使用它们的人不知道他们的程序在做什么。你需要对变量、作用域等有清晰的了解

© www.soinside.com 2019 - 2024. All rights reserved.