2016-10-30 3 views
1

проблема: У меня есть массив под названием X. X[1:20]. Для начала я инициализировал 0.индекс отрицательное число в массиве в lua

Я хочу передать число каждому элементу массива после добавления 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 

ответ

1

Это потому, что вы читаете х [г], а не только присвоив. Простое исправление было бы дать ему значение по умолчанию. Пример:

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

Это сделает код предположит х [г] равен нуль по умолчанию

+0

Спасибо, Бенджамин. Это работает. Однако, если я хочу фактически использовать отрицательное число и добавить его в массив, то какой у меня вариант? Основываясь на вашем ответе каждый раз, когда я получаю отрицательное число, он присваивает 0 x [z], и я не хочу этого, даже несмотря на то, что он создает код. Как вы думаете, если я хочу дать отрицательное число массиву, тогда мне придется определять массив от -20 до 20 вместо 1 до 20? –

+0

Это зависит от того, какое значение вы хотите по умолчанию? Я смущен тем, что именно вы хотите. Значение «или 0» означает, что значение по умолчанию равно 0, а символ + 1 в конце увеличивает любое предыдущее значение (0, если оно не существует) на единицу. Это будет действовать так, как если бы вы инициализировали ваш массив в диапазоне от ℝ (от -infinite до + infin) и задали значение каждого из них равным 0. –

0

Вы не можете индексные таблицы, используя отрицательные числа в Lua. , У вас мало возможностей:

  1. Тип приписывает индекс строке и индексу с этой строкой. Это сделает вашу таблицу ассоциативно (вы можете индексировать с любой строки):

    z = tostring(number) 
    

    Это хорошо, если у вас нет никаких границ для ваших индексов

  2. Если Вы имеете ограниченный интервал чисел (-20 20), вы можете сделать переход к положительным показателям при обращении значения:

    MIN_VALUE = -20 
    z = number - MIN_VALUE 
    

    Этот подход должен дать более высокую производительность, так как массив адресуется непосредственно.

1

Ваш код инициализации устанавливает только положительные значения массива 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 
0

Вы никогда не установить "число" ни к чему, поэтому он дает ошибку

попытка выполнить арифметику на поле?'(значение nil)

Обратите внимание на слова «значение nil», потому что именно поэтому эта ошибка возникла. Поэтому в следующий раз установите «число» на что-то или добавьте «или ___» при попытке сделать что-то вроде вычислений или задайте переменные.

Смежные вопросы