问题:我有一个名为X[1:20]
的数组。 z
。我初始化为0开始。
我希望在向数组添加1之后将数字传递给数组的每个元素。所以我读取了数字并存储在局部变量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 [1 ... 20]) 当"数字"是负的lua给出错误信息,"尝试对字段'?'进行算术运算。 (零值)。
我该怎么办?
user-facing notices
答案 0 :(得分:1)
这是因为你正在阅读x [z],而不只是分配它。 一个简单的解决方法是给它一个默认值。 例如:
x[z] = (x[z] or 0) + 1
这将使代码假设x [z]默认等于零。
答案 1 :(得分:1)
您的初始化代码仅将数组X的正值设置为0.只需修改循环以初始化Z的所有可能值。
for i = -20, 20 do
x [i] = 0; -- array initialization
end
假设Z的范围为-20到20。
负指数值有效,但有时会在使用ipairs()函数时导致意外行为。 ipairs()函数只会迭代从索引1开始的表的值,直到第一个未初始化的(零)条目。
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
答案 2 :(得分:0)
您无法在Lua中使用负数索引表。你几乎没有可能:
键入使用此字符串将索引转换为字符串和索引。它将使您的表关联(您可以使用任何字符串索引):
z = tostring(number)
如果您的指数没有任何边界
如果您的数字间隔有限(-20到20),则可以在访问值时转换为正数:
MIN_VALUE = -20
z = number - MIN_VALUE
这种方法应该提供更好的性能,因为阵列是直接处理的。
答案 3 :(得分:0)
你永远不会将“数字”设置为任何东西,因此它会给你错误
尝试对字段'?'执行算术运算(零值)
注意单词“a nil value”,因为这就是发生此错误的原因。所以下次将“数字”设置为某个东西,或者在尝试执行类似计算或设置变量的操作时添加“或___”。