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