【问题标题】:Lua Table is nilLua 表为零
【发布时间】:2017-01-20 03:54:50
【问题描述】:

由于某种原因,Lua 告诉我这一行出错了:

for i=1, #set do

其中 set 是我制作的函数的二维表参数。 它给了我一个错误:

尝试获取 nil 值的长度(本地集)

奇怪的是,我运行这个函数超过 1000 次,但错误只出现一次。我不太确定为什么。 任何帮助,将不胜感激。而且我还可以打印 set 中的值,它们会显示出来,我认为这是一个可能的错误。

编辑:这是功能:(或它的重要部分)

function GeneticTrainer:evaluate(id,correct,set)
local returny=0
local net=self.Networks[id]
for i=1, #set do
    --   print(i..k[i])
    net:Update(set[i])

    local error= math.abs(correct[i]-net.output[1])
    returny = returny + (1-(error/10))
end

这就是我所说的:

function GeneticTrainer:Evolve(Problem,Set)
local A=math.random(1,self.Population)
local B=math.random(1,self.Population)
if A==B then
    B=math.random(1,self.Population)
end
local AFitness = self:evaluate(A,Problem,Set)
local BFitness = self:evaluate(B,Problem,Set)

这就是我所说的:

BinarySet={{0,0},{1,0},{0,1},{1,1}}

for i=1, iterations do GATrainer:Evolve(Target,BinarySet) end

【问题讨论】:

  • 显然,setnil。如果您不发布相关代码(最好是minimal reproducible example),就不可能知道为什么会发生这种情况。
  • 您的net:Update 是否修改了set 或在它仍在循环中迭代时更改项目计数?

标签: arrays lua null


【解决方案1】:
function GeneticTrainer:evaluate(id,correct,set)
  local returny=0
  local net=self.Networks[id]
  for i=1, #set do  -- this line causes the error!
  -- an so on...

错误是在上面的代码段第4行引起的。由于函数头和#set之间显然没有分配set,所以set必须以nil进入函数

所以接下来你检查你打电话给GeneticTrainer:evaluate(id,correct,set) 恰好是这样的:

function GeneticTrainer:Evolve(Problem,Set)
  local A=math.random(1,self.Population)
  local B=math.random(1,self.Population)
  if A==B then
    B=math.random(1,self.Population)
  end
  local AFitness = self:evaluate(A,Problem,Set)
  local BFitness = self:evaluate(B,Problem,Set)

由于Set显然没有变化,它进入函数GeneticTrainer:Evolve(Problem,Set),然后进入self:evaluate(B,Problem,Set),nil值也必须来自这个函数之外。

未提供更多代码。 调用一个函数 1000 次没有错误并不意味着如果你第 1001 次使用不同的参数调用它就不会导致错误。

只要通过调用堆栈跟随set,你就会发现问题。

您的错误消息中应该有一个堆栈回溯,它会告诉您在哪一行调用每个函数。

这非常简单,作为程序员,您将不得不这样做或类似的一百万次。您不需要我们在这里为您提供帮助。

编辑:

在您的 cmets 之后,我将您的代码减少到最低限度(您应该为您的问题做的事情)并通过 Lua 在线演示运行它,完全没有问题。 https://www.lua.org/cgi-bin/demo

我还使用另一个 Lua 解释器对其进行了 5000 次迭代测试,没有出现任何问题。

function eval(id,correct,set)
  print(#set)
end

function evolve(Problem,Set)
  local AFitness = eval(A,Problem,Set)
  local BFitness = eval(B,Problem,Set)
end

  BinarySet={{0,0},{1,0},{0,1},{1,1}}
for i=1, 10 do
  evolve(Target,BinarySet) 
end

我会说,最近构建的 Lua 几乎不可能存在导致表格消失的错误。请再次检查您的代码。

【讨论】:

  • 好吧,但是 set 不是 nil,因为我可以从中打印值我可以说“print(set[1][1]) 并且它确实会打印。这可能是一个错误吗?
  • 您是否在导致错误的行之前打印了该内容?... nil 是 nil。一张桌子不会消失。也许是错字?设置与设置某处?
  • 是的!我在它之前做了一个打印,它打印出来很好然后导致错误
  • 由于您的 cmets,我编辑了我的答案。对我来说,它工作正常。像这样的错误是非常不可能的。将您的脚本上传到某处或使用 www.pastebucket.com 之类的页面进行共享。也许你错过了什么......
猜你喜欢
  • 2012-12-20
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2012-01-25
  • 2014-05-06
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多