Недавно на форуме 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

This entry was posted on Воскресенье, 1 февраля, 2015 at 10:36 and is filed under Разное, торговые роботы (МТС). You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Comments are closed at this time.