2016-05-16 3 views
0

Я пытаюсь реализовать простую очередь FIFO в Lua, код следующим образом:LUA реализация очереди

dataQ = {} 
dataQ.first = 0 
dataQ.last = -1 
dataQ.data = {} 

function insert(q, val) 
    q.last = q.last + 1 
    q.data[q.last] = val 
end 

function remove(q) 
    if (q.first > q.last) then 
     rval = -1 
    else 
     print("remove: q.data[q.first]= ", q.data[q.first], " q.first= ", q.first) 
     local rval = q.data[q.first] 
     print("remove: rval= ", rval) 
     q.data[q.first] = nil  -- to allow garbage collection 
     q.first = q.first + 1 
     print("remove: q.first= ", q.first) 
    end 
    return rval 
end 

insert(dataQ,"a") 
insert(dataQ,"b") 
insert(dataQ,"c") 
for i,v in pairs(dataQ.data) do 
    print(i, v) 
end 
repeat 
    local x = remove(dataQ) 
    print("list item= ", x) 
until (dataQ.first > dataQ.last) 

Когда я загружаю скрипт в ESP8266 (через ESPlorer) я получаю следующую ошибку Lua переводчика:

LUA interpreter error detected! 
stdin: 1: ')' expected near ']w([[ print("remove: rval= ", rval)]]); 

Однако скрипт работает, и я получаю следующий результат:

1 b 
2 c 
0 a 
remove: q.data[q.first]= a  q.first= 0 
remove: rval= nil 
remove: q.first= 1 
list item= nil 

Очередь вставки функции приложения уши работают как ожидалось, но функция удаления очереди не является. Первый оператор печати lua в функции удаления показывает правильное ожидаемое значение для q.data [q.first], но после присвоения значения rval значение «nil» вместо ожидаемого «a»

Я думаю, что я я не понимаю фундаментальную концепцию lua здесь, но я не могу понять, что это такое.

+0

См https://github.com/daurnimator/fifo.lua – daurnimator

+0

@Amadan это * является * в источнике, середина 'remove' функции:' печати ("удалить: RVAL =", RVAL) '. –

+0

Работает для меня с использованием ESPlorer 0.2.0-rc3 и недавнего NodeMCU из ветви 'dev'. Я имею в виду, что я не получаю ошибку «интерпретатор LUA». –

ответ

0

Проблема заключается в использовании ESPlorer, который я использую для загрузки кода в ESP8266. По-видимому, вы не можете закончить строку символом ']' при использовании esplorer (thx to pjsg on github). Решением является переход в режим «turbo» (esplorer - настройки). Это устраняет ошибку Lua, и код работает, как ожидалось.

2

Вот результат, который я вижу с идеоном. http://ideone.com/72yQPs

1 b 
2 c 
0 a 
remove: q.data[q.first]= a  q.first= 0 
remove: rval= a 
remove: q.first= 1 
list item= nil 
remove: q.data[q.first]= b  q.first= 1 
remove: rval= b 
remove: q.first= 2 
list item= nil 
remove: q.data[q.first]= c  q.first= 2 
remove: rval= c 
remove: q.first= 3 
list item= nil 

Присваивание rvalявляется работает, но возвращение из remove не из-за ошибки масштаба, вызванной вашим использованием local.

else 
    print("remove: q.data[q.first]= ", q.data[q.first], " q.first= ", q.first) 
    local rval = q.data[q.first] <<< THIS rval ... 
    print("remove: rval= ", rval) 
    .... 
end 
return rval **<<< ...is not the same variable as THIS rval.** 

Удалите ключевое слово 'local', и вы получите это, что, вероятно, вы ожидали.

1 b 
2 c 
0 a 
remove: q.data[q.first]= a  q.first= 0 
remove: rval= a 
remove: q.first= 1 
list item= a 
remove: q.data[q.first]= b  q.first= 1 
remove: rval= b 
remove: q.first= 2 
list item= b 
remove: q.data[q.first]= c  q.first= 2 
remove: rval= c 
remove: q.first= 3 
list item= c 
+0

Два оператора печати, следующие за «else», находятся в одной области. По какой-то причине назначение rval не работает. Я также пробовал без «локального» заявления и пробовал rval как глобальный, но без разницы. – Jonathan

+0

@Jonathan Смотрите мое обновление. Я не вижу проблемы с назначением 'rval'. – Roddy

+0

Я использую Nodemcu на ESP8266 и думаю, что может возникнуть проблема с прошивкой Nodemcu. Когда я загружаю скрипт, я получаю ошибку интерпретатора LUA. Я удалил «локальный» оператор, но получаю тот же результат (rval - nil). Я буду проверять с гуру Nodemcu ... – Jonathan

0
local queue = {} 

table.insert(queue,'a') 
table.insert(queue,'b') 
table.insert(queue,'c') 

print(table.remove(queue,1)) -- a 
print(table.remove(queue,1)) -- b 
print(table.remove(queue,1)) -- c 
print(table.remove(queue,1)==nil) -- true 
+3

Добро пожаловать в StackOverflow! Хотя этот ответ может работать, пожалуйста, подумайте над добавлением дополнительной информации/описаний, чтобы помочь другим пользователям понять, что вы имеете в виду. – cdomination

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