Archive for the ‘Разное’ Category

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