【问题标题】:Got an error that I can't compare nil to number even though I is a number得到一个错误,即使我是一个数字,我也无法将 nil 与数字进行比较
【发布时间】:2021-03-22 15:45:15
【问题描述】:

我正在尝试做一个简单的冒泡排序(我的代码可能看起来不专业,但我只是在学习)并且在我的冒泡排序函数中我收到一个错误代码,说我无法将 nil 与数字进行比较,即使所有值在我的表中应该是数字。


local function bubblesort(array)
    for getal = 1, #array do
    for i = 1, #array do
      if array[i] > array[i + 1] then
        local temp = array[i]
        array[i + 1] = array[i]
        array[i + 1] = temp
      end
    end
  end
  return array
end

如果您需要查看,这里是制作表格并打印出来的其余代码


local function printtabel(tabel)
    for _,v in pairs(tabel) do
        io.write(v..' ')
    end
    print()
end

io.write("Geef seed, grootte en max: ")
local SEED = io.read("*n")
local GROOTTE = io.read("*n")
local MAX = io.read("*n")

math.randomseed(SEED)
local t = {} 
for n = 1,GROOTTE do
    t[n] = math.random(1,MAX)
end
bubblesort(t)
printtabel(t)

【问题讨论】:

  • 你传入了什么输入值?

标签: sorting lua bubble-sort


【解决方案1】:

我收到一个错误代码,说我无法将 nil 与数字进行比较,即使我的表中的所有值都应该是数字

嗯,计算机不只是编造东西,所以它试图比较一个数字和零。如果表中的所有值都是数字,那么它会从某个地方得到 nil,而不是表中的值之一。

当试图找出如此简单的错误时,创建一个非常小的样本并打印输出以确保所有内容都符合您在循环中的预期,这会很有帮助。您可以点击this在线查看并运行示例代码。结果:

i = 1, array[i] = 2
i+1 = 2, array[i+1] = 5
i = 2, array[i] = 5
i+1 = 3, array[i+1] = 1
i = 3, array[i] = 5
i+1 = 4, array[i+1] = nil
/var/task/bin/lua: main.lua:6: attempt to compare nil with number

所以你可以看到你的函数中有一个很大的。样本数组中有三个值,您将 i 从 1 循环到 3,但您在循环中将 array[i]array[i+1] 进行比较。这意味着当 i 为 3 时,您正在与 array[4] 进行比较。在 lua 中,您可以访问数组长度之外的元素,但它们返回 nil。

只需使用简单的输入逐步浏览您脑海中的代码或添加打印语句以查看实际使用的是什么,这是调试无法按照您认为的方式工作的代码的好方法。

【讨论】:

    【解决方案2】:

    我收到一个错误代码,说我无法将 nil 与数字进行比较,即使我的表中的所有值都应该是数字。

    这实际上是有道理的,因为表中的 nil 值等同于该值根本不存在。您可能会认为表格充满了无限数量的 nil。

    问题出在这里:

    for i = 1, #array do
      if array[i] > array[i + 1] then
    

    最后一个i 等于#array,因此array[i + 1] 在数组之外。

    【讨论】:

      【解决方案3】:

      我得到的错误在第 5 行,

      if array[i] > array[i + 1] then
      

      如果你做这个比较,当i 是数组的最后一个索引时会发生什么? array[i + 1] 将在数组之外,或者在 lua 的情况下是 nil 值。

      您可以通过更改 for 循环的结束值来解决此问题:

          for i = 1, #array - 1 do
            if array[i] > array[i + 1] then
              local temp = array[i]
              array[i + 1] = array[i]
              array[i + 1] = temp
            end
          end
      

      也有点与你的错误无关,但你排序中的逻辑似乎是错误的。

      这段代码只使用了array[i]的值,而不是array[i + 1]

              local temp = array[i]
              array[i + 1] = array[i]
              array[i + 1] = temp
      

      我认为这些可能是由于错误而您尚未解决的问题

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多