【问题标题】:index negative number in array in lua在lua中的数组中索引负数
【发布时间】:2017-03-13 00:51:48
【问题描述】:

问题:我有一个名为X 的数组。 X[1:20]。我初始化为 0 开始。

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

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

我该怎么办?

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

【问题讨论】:

    标签: arrays lua lua-table


    【解决方案1】:

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

        x[z] = (x[z] or 0) + 1
    

    这将使代码默认 x[z] 等于 0。

    【讨论】:

    • 谢谢本杰明。这样可行。但是,如果我想实际使用负数并将其添加到数组中,那么我有什么选择?根据您每次得到负数时的回答,它会将 0 分配给 x[z],即使它使代码有效,我也不希望这样。你认为如果我想给数组赋予负数,那么我必须将数组定义为 -20 到 20 而不是 1 到 20?
    • 这取决于,默认情况下是否有您想要的特定值?我对你到底想要什么感到困惑。 “或 0”仅表示默认值为 0,最后的 + 1 将前一个值(如果不存在,则为 0)加一。这就像你已经在 ℝ 的范围内(从 -infinite 到 +infinite)初始化了你的数组,并将它们中的每一个的值设置为 0。
    【解决方案2】:

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

    for i = -20, 20 do 
        x [i] = 0;  -- array initialization 
    end 
    

    假设 Z 的范围是 -20 到 20。

    负索引值有效,但在使用 ipairs() 函数时有时会导致意外行为。 ipairs() 函数只会遍历从索引 1 开始的表的值,直到第一个未初始化 (nil) 条目。

    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
    

    【讨论】:

      【解决方案3】:

      您不能在 Lua 中使用负数索引表。你的可能性很小:

      1. 类型将索引转换为字符串并使用此字符串进行索引。它将使您的表格具有关联性(您可以使用任何字符串进行索引):

        z  = tostring(number)
        

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

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

        MIN_VALUE = -20
        z = number - MIN_VALUE
        

        这种方法应该提供更好的性能,因为数组是直接寻址的。

      【讨论】:

        【解决方案4】:

        您从未将“数字”设置为任何内容,因此它会给您错误

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

        请注意“a nil value”一词,因为这就是发生此错误的原因。因此,下次尝试将“数字”设置为某事,或者在尝试进行计算或设置变量等操作时添加“或___”。

        【讨论】:

          猜你喜欢
          • 2012-05-21
          • 2014-01-21
          • 2018-05-20
          • 2014-02-09
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          相关资源
          最近更新 更多