Недавно на форуме QUIK возник вопрос

«Каким образом организовать очередь с  с произвольным доступом.

Вот мое решение: nk_queue

————очередь ————————————-
— автор Николай Камынин kamnik@mail.ru —2015
———————————————————
—new(M) — создать очередь M — максимальная длина
—push( Q,V) — поставить  V в очередь Q
—V=pop( Q) — вытолкнуть первый элемент из очереди
—V=get(Q,P) — прочитать элемент с номером P
—set(Q,P,V) — заменить элемент с номером P
—full(Q) — проверить заполненность очереди
———————————————

Программы написаны на чистом LUA и оформлены в виде модуля.

Необходимо в скрипте загрузить данный модуль

require «nk_queue»

—после этого можно работать с программами следующим образом:

q=nk_queue.new(10) — создать очередь максимальной длиной 10 элементов
nk_queue.push(q,100); — поставить в очередь 100

ну и так далее.

Создание очередей необходимо при построении роботов в QUIK c использованием колбеков.

примечание: программу тестировал не очень. Поэтому если будут ошибки — пишите.

Недавно на форуме QUIK возник вопрос:

«Каким образом создать многомерную таблицу с расходованием памяти лишь на существующие элементы.»

Т е возможность такой записи :    Matrix[1][3][5][7]=456

с затратами памяти лишь на хранение данного значения

(реально затраты будут больше, так как надо хранить еще 5 указателей),

но это существенно меньше,

чем хранить всю таблицу с пустыми значениями.

Вот мое решение данной задачи:

———————функция печати результата——————

function printM(x) if (type(y)==»table») then print(«пусто»);else print(«y=»..y); end end
————-метатаблица—————
mt={__index = function(t,k) t[k]=setmetatable({}, mt); return t[k] end}

Matrix = setmetatable({}, mt);  — создание таблицы Matrix

Matrix2 = setmetatable({}, mt);  — создание таблицы Matrix2

y=Matrix[1][3][5][7];   printM(y);    —чтение несуществующего элемента

Matrix[1][3][5][7]=456;                — запись значения в Matrix

y=Matrix[1][3][5][7]; printM(y);   —чтение значения

Matrix2[5][1][3][5][7]=674;         — запись значения в Matrix2

y=Matrix2[5][1][3][5][7]; printM(y); —чтение значения

результат:

пусто
y=456
y=674

———————————————————-

Если хочется сделать программу нагляднее, то можно записать так:

————-метатаблица—————
mt={__index = function(t,k) t[k]=setmetatable({}, mt); return t[k] end}

———— функция для создания таблиц ——————

new=function() setmetatable({}, mt); end

тогда определение таблиц запишется так:

Matrix = new();  — создание таблицы Matrix

Matrix2 = new();  — создание таблицы Matrix2