【问题标题】:lua: attempt to index a nil value (field '?')lua:尝试索引一个零值(字段'?')
【发布时间】:2021-05-15 16:55:22
【问题描述】:

我在此文件中收到此错误:

-- mid point circle drawing algoritm taken from here:
-- https://stackoverflow.com/questions/17163636/filled-circle-in-matrix2d-array
-- code translated from java

-- initates 2d array
matrix = {}

for i = 1, 2 do
    matrix[i] = {}
end

-- given matrix and diameter populates array
function mCircle(matrix, d)
    local startX = d/2
    local startY = d/2
    local r = d/2
    mCircleRec(matrix, d, startX, startY, r, r)

    --prints matrix
    for i = 1, d do
        for j = 1, d do
            print(matrix[x][y])
        end
    end

end

function mCircleRec(matrix, d, startX, startY, x, y)
    if (x >= d or y >= d or x < 0 or y < 0 or matrix[x][y] == 1)
    then 
        return
    elseif (matrix[x][y] == 9)
    then 
        return
    end

    local r = d/2

    if (((x - startX) * (x - startX) + (y - startY) * (y - startY)) <= (r * r))
    then
        matrix[x][y] = 1
    else
        matrix[x][y] = 9
    end

    mCircleRec(matrix, d, startX, startY, x+1, y);  -- down
    mCircleRec(matrix, d, startX, startY, x, y+1);  -- right
    mCircleRec(matrix, d, startX, startY, x-1, y);  --up
    mCircleRec(matrix, d, startX, startY, x, y-1);  --left
    mCircleRec(matrix, d, startX, startY, x-1, y-1); -- diagonal up-left
    mCircleRec(matrix, d, startX, startY, x+1, y+1); -- diagonal right-down
    mCircleRec(matrix, d, startX, startY, x+1, y-1);  -- diagonal left-down
    mCircleRec(matrix, d, startX, startY, x-1, y+1);  -- diagonal right-up
end

mCircle(matrix, 20)

完整的错误信息:

lua: circle.lua:27: attempt to index a nil value (field '?')
stack traceback:
        circle.lua:27: in function 'mCircleRec'
        circle.lua:16: in function 'mCircle'
        circle.lua:54: in main chunk
        [C]: in ?

这是一个简单的实心圆算法,它创建一个二维数组并放置在一个实心圆内,代码是从 java 翻译的,原始代码在答案之一here 中。


我是 lua 新手,我查看了有关相同错误的所有其他问题,但没有一个是相关的。 提前感谢您的帮助


编辑:错字


编辑: 在进行故障排除时,我发现了另一个错误: 我弄错了二维数组的创建并修改了它:

- initates 2d array

local radius = 20
local diameter = radius * 2

-- Create a diameter x diameter array
matrix = {}
for i = 1, diameter do

    matrix[i] = {}

    for j = 1, diameter do
        matrix[i][j] = 0      -- Fill the values here
    end

end

改变这个并没有改变错误信息

【问题讨论】:

  • 删除local start Y = d/2中的空格
  • 错误在mCircleRec正文的第一行。您可能需要找到一个显示行号的文本编辑器。
  • 感谢@EgorSkriptunoff,我修正了错字,但这并没有改变错误。
  • 对不起@luther 错误是第 27 行,我直接在堆栈溢出编辑器上写了该评论并选择了错误的行
  • @luther 因为它不是语法错误。它定义了一个本地 nil 值 start 和一个全局 Y 分配 d/2 所以没有什么可以捕获的。但是还有其他错误,而不是我发布他的代码时他报告的错误,所以我认为他没有复制粘贴导致索引错误的代码

标签: lua


【解决方案1】:

您提供的代码不会导致引用的错误消息。

首先你有这个

local start Y = d/2

你已经修好了

那么有一个断了的if语句

if (x >= d or y >= d or x < 0 or y < 0 or matrix[x][y] == 1)  --the error is in this line (27) apparently
    then
        matrix[x][y] = 1
    then 
        return
    elseif (matrix[x][y] == 0)
    then 
        return
    end

你有两个thens

只有在修复这些错误后,您才会看到引用的错误。

mCircle xy 内部为零。所以matrix[x][y]是不可能的。

【讨论】:

  • 好的,我修复了错误,知道如何让它工作吗?
  • 然后提出一个新问题,即使在已回答问题后更改您的问题也没有太大意义。
  • 你确定吗?我在底部添加了更正,这只是一个小修改,并没有改变仍然相同的错误。我看不出重复一个仍然基本相同的问题会如何改变这种情况。问题依然存在。
  • 我已经告诉过你这个错误是由 x 和 y 为 nil 引起的。还有什么事情你需要知道?你不能print(matrix[x][y]) 我什至无法理解你添加到问题中的代码。为什么你认为将矩阵重命名为数组会阻止 x 和 y 为零?
  • 好的,很抱歉,我犯了很多错误。\ 1. 我对主要问题的编辑是因为我创建二维数组的方式不正确,并且还命名了数组数组矩阵\ 2. 我不能做print(matrix[x][y] 因为它应该是``print(matrix[i][j])` 3. 它现在按预期工作\对不起我浪费了你的时间,我会继续写自己回答并将其标记为已解决。谢谢
【解决方案2】:

原来的问题是,当我试图打印数组时,我将 x 和 y 作为索引而不是 i 和 j。
同样,起初我以错误的方式定义二维数组,例如 matrix = {{}} 这不起作用。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2011-11-05
    • 1970-01-01
    • 2014-04-04
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多