【问题标题】:Lua goto back to for loopLua 回到 for 循环
【发布时间】:2022-01-28 01:48:12
【问题描述】:

我对 Lua goto 有疑问。 运行脚本后出现错误: 未定义标签'back'

代码:

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


    【解决方案1】:

    Lua 手册说:

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

    你的代码发生了什么:

    1. 标签backgoto back 行不可见
    2. 您正在跳转到循环变量k 的范围内

    【讨论】:

      【解决方案2】:

      谢谢回复。 我用第二个函数解决了这个问题(从 for-loop 中删除 goto 并 goto back to for-loop):

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 2012-10-30
        相关资源
        最近更新 更多