Arrays 索引lua中数组中的负数

Arrays 索引lua中数组中的负数,arrays,lua,lua-table,Arrays,Lua,Lua Table,问题:我有一个名为X的数组X[1:20]。我首先初始化为0 我想在数组的每个元素上加1后传递一个数字。所以我读取数字并存储在局部变量z中。有时“数字”可以是正的,也可以是负的 但是,数组仅用于正值(即x[1…20]) 当“number”为负数时,lua给出错误消息“尝试对字段“?”执行算术运算”(一个nil值) 我该怎么办 local x= {} local number local z for i = 1, 20 do x [i] = 0; -- array initializ

问题:我有一个名为
X
的数组<代码>X[1:20]。我首先初始化为0

我想在数组的每个元素上加1后传递一个数字。所以我读取数字并存储在局部变量
z
中。有时“数字”可以是正的,也可以是负的

但是,数组仅用于正值(即x[1…20]) 当“number”为负数时,lua给出错误消息“尝试对字段“?”执行算术运算”(一个nil值)

我该怎么办

local x= {}
local number
local z

for i = 1, 20 do 

    x [i] = 0;  -- array initialization 
end 

for y = 1, 5 do 

 z  = number   -- I am reading a "number" from hardware & it is a negative     integer number

 x[z] = x[z]+1 ; 
end

这是因为您正在读取x[z],而不仅仅是分配它。 一个简单的修复方法是给它一个默认值。 例如:


这将使代码在默认情况下假定x[z]等于零。

您不能在Lua中使用负数对表进行索引。您几乎没有机会:

  • 键入将索引强制转换为字符串并使用此字符串进行索引。这将使您的表具有关联性(您可以使用任何字符串进行索引):

    如果索引没有任何边界,这是很好的

  • 如果您有有限的数字间隔(-20到20),则可以在访问值时对正索引进行转换:

    MIN_VALUE = -20
    z = number - MIN_VALUE
    
    这种方法应该提供更好的性能,因为数组是直接寻址的


  • 初始化代码仅将数组X的正值设置为0。只需修改循环即可初始化Z的所有可能值

    for i = -20, 20 do 
        x [i] = 0;  -- array initialization 
    end 
    
    这假设Z的范围为-20到20

    负索引值起作用,但在使用ipairs()函数时,有时会导致意外行为。ipairs()函数将仅从索引1开始迭代表的值,直到第一个未初始化(nil)项

    给出了以下结果:

    all values
    -2  -2
    -1  -1
    0   0
    1   1
    2   2
    positive integer values
    1   1
    2   2
    
    您从未将“number”设置为任何值,因此它会给出错误

    尝试对字段“?”执行算术运算(零值)


    请注意“一个nil值”,因为这就是发生此错误的原因。所以下次将“number”设置为某个值,或添加“or”___“当您尝试执行诸如计算或设置变量之类的操作时。

    谢谢您。这很有效。然而,若我想实际使用负数并将其添加到数组中,那个么我有什么选择呢?根据您的回答,每次我得到负数时,它都会将0分配给x[z],我不希望这样,即使它使代码正常工作。你们认为若我想给数组赋负数,那个么我必须定义-20到20的数组,而不是1到20的数组吗?这取决于,默认情况下你们需要一个特定的值吗?我不知道你到底想要什么。“或0”仅表示默认值为0,末尾的+1将之前的值(如果不存在则为0)增加1。这将如同您已在ℝ (从-infinite到+infinite)并将每个值设置为0。
    for i = -20, 20 do 
        x [i] = 0;  -- array initialization 
    end 
    
    t = {}
    for i = -2, 2 do t[i] = i end
    
    print("all values")
    for i = -2, 2 do
      print(i, t[i])
    end
    
    print("positive integer values")
    for k, v in ipairs(t) do
      print(k, v)
    end
    
    all values
    -2  -2
    -1  -1
    0   0
    1   1
    2   2
    positive integer values
    1   1
    2   2