得到一个错误,即使我是一个数字也不能将nil与数字进行比较

我试图做一个简单的冒泡排序(我的代码可能看起来不专业,但我只是在学习),在我的冒泡排序函数中,我得到一个错误代码,说我不能比较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)
点赞
用户7396148
用户7396148

我得到的错误在第五行:

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

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

你可以通过改变循环的结束值来解决这个问题:

    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

我想这些可能是由于错误而无法解决的问题。

2021-03-22 15:59:20
用户3574628
用户3574628

我收到了一个错误代码,说我不能将 nil 与数字进行比较,尽管在我的表中所有的值都应该是数字。

这实际上是有道理的,因为表中的 nil 值相当于该值根本不存在。你可以认为表是由无限数量的 nil 填充的。

问题在于:

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

最后一个 i 等于 #array,因此 array[i + 1] 超出了表的范围。

2021-03-22 16:00:33
用户369792
用户369792

我收到一个错误代码,说我不能比较空值和数字,尽管表格中的所有值都应该是数字。

嗯,计算机不会胡说八道,它确实在尝试比较数字和空值。如果表格中的所有值都是数字,那么它肯定来自某个地方的空值,而不是表格中的值。

在尝试查找此类简单错误时,创建一个非常小的示例并打印输出可能会有所帮助,以确保循环内的所有内容都符合您的预期。您可以单击此处在线查看和运行示例代码。结果如下:

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

因此,您可以看到该函数存在错误。示例数组中有三个值,您正在从1到3循环i,但是在循环中将array[i]array[i+1]进行比较。这意味着当i为3时,您正在与array[4]进行比较。在lua中,您可以访问数组长度之外的元素,但它们会返回空值。

只需在脑海中逐步浏览代码或添加打印语句以查看实际使用情况即可解决不起作用的代码的错误。

2021-03-22 16:37:14