Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Массивы


Zaam

Рекомендуемые сообщения

Нарисовал такой вот код:

local n = 1
local tbl = {}
for ki, vi in {{1, 2, 3},{4, 5, 6}} do
    for kj, vj in {7, 8, 9} do
         tbl[n] = vi
         tbl[n][4] = vj
         n = n + 1
    end
end

ожидаю, что на выходе tbl будет равна

{{1, 2, 3, 7}, {1, 2, 3, 8}, {1, 2, 3, 9}, {4, 5, 6, 7}, {4, 5, 6, 8}, {4, 5, 6, 9}}

но внезапно получаю

{{1, 2, 3, 9}, {1, 2, 3, 9}, {1, 2, 3, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}}

WTF?

Изменено пользователем Zaam
Ссылка на комментарий
Поделиться на другие сайты

мозг мне сломал

Я сегодня весь день этот баг ловил. Тут, так сказать, он кристально чистый. А вот в той лапше, в которую он затесался его найти - у меня уже 3 раза мозг взрывался.

Ссылка на комментарий
Поделиться на другие сайты


        for kj, vj in {7, 8, 9} do
                 tbl[n] = vi
                 tbl[n][4] = vj
                 n = n + 1
        end

цикл пробегается 3 раза, вначале tbl[n][4] приравниваем 7, потом 8, потом 9

Ссылка на комментарий
Поделиться на другие сайты

Еще косяк в tbl[n]=vi присваиваем 3 элемента и дописываем 4й не катит.


local n = 1
local tbl = {}
local table2 = {7, 8, 9}
local t=1
for ki, vi in {{1, 2, 3},{4, 5, 6}} do

for i=1,3 do
if t==i then
tbl[n]={}
tbl[n][1] = vi[1]
tbl[n][2] = vi[2]
tbl[n][3] = vi[3]
tbl[n][4] = table2[i]
t=t+1
end
n = n + 1
end
t=1
end

Такой вариант не покатит?

Ссылка на комментарий
Поделиться на другие сайты

Еще косяк в tbl[n]=vi присваиваем 3 элемента и дописываем 4й не катит.
Вот собственно и интересует, почему не катит.

for i=1,3 do

if t==i then
...
t=t+1
end
n = n + 1
end

Зачем тут эти пляски с условием, если оно всегда будет выполняться?

Такой вариант не покатит?
Нет, не покатит, так как длина таблиц в первой таблице и длина второй таблицы переменная. Это я для того, чтобы убедиться, что баг именно в этом участке кода, написал тест с простыми входными данными.

Более того, если код доработать:

local n = 1
local tbl = {}
for ki, vi in {{1, 2, 3},{4, 5, 6}} do
 for kj, vj in {7, 8, 9} do
 tbl[n] = vi
 tbl[n][4] = vj
 LogTable(tbl[n])
 n = n + 1
end
end
LogInfo("-------------------------")
LogTable(tbl)

то он выдаст:

{1, 2, 3, 7}
{1, 2, 3, 8}
{1, 2, 3, 9}
{4, 5, 6, 7}
{4, 5, 6, 8}
{4, 5, 6, 9}
-------------------------
{{1, 2, 3, 9}, {1, 2, 3, 9}, {1, 2, 3, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}}

То есть, во внутреннем цикле всё замечательно работает и присваивается, но почему-то на каждой итерации перезаписывает значение добавленного элемента.

Изменено пользователем Zaam
Ссылка на комментарий
Поделиться на другие сайты


local n = 1
local tbl = {}
for ki, vi in {{1, 2, 3},{4, 5, 6}} do
tbl[n] ={}
 for kj, vj in {7, 8, 9} do
 tbl[n][kj] = vi[kj]
 tbl[n][4] = vj
 LogTable(tbl[n])
 n = n + 1
end
end

Ссылка на комментарий
Поделиться на другие сайты

Не сработает с входными параметрами {{1, 2, 3, 4}, {5, 6, 7, 8}} и {9, 0}, например.

И результат

{1,  ,  , 7}
{ , 2,  , 8}
{ ,  , 3, 9}
{4,  ,  , 7}
{ , 5,  , 8}
{ ,  , 6, 9}

не совсем то, что мне нужно.

Ссылка на комментарий
Поделиться на другие сайты

Полный, мать его, вынос мозга.

function LogTab(atab, PrefiX)
if type(atab) ~= "table" then LogInfo("Not a table, ", atab, " but ", type(atab)) return end
for n,v in pairs(atab) do
if type(v) == "table" and n ~= "_G" then
LogInfo(PrefiX,n, " is a table.")
local prefx = PrefiX..n.."."
LogTab(v,prefx)
else
LogInfo(PrefiX, n, " = " ,v, " , type: ",type(v) )
end
end
end

for k, v in {{1, 2},{3, 4, 5},{6,7,8,9,0}} do
for kk, vv in {10, 11, 12} do
tbl[n] = v
LogInfo("--------ДО ПРИСВАИВАНИЯ----------")
LogTab(tbl, "tbl.")
tbl[n][4] = vv
LogInfo("------ПРИСВОИЛИ-----tbl."..n..".4 =", tbl[n][4])
LogTab(tbl, "tbl.")
n = n + 1
end
end
LogTab(tbl, "tbl.")

Вывод этого кода просто ломает все представления о его работе. Работает крайне непонятно.

Ссылка на комментарий
Поделиться на другие сайты

Нарисовал такой вот код:

local n = 1
local tbl = {}
for ki, vi in {{1, 2, 3},{4, 5, 6}} do
for kj, vj in {7, 8, 9} do
tbl[n] = vi
tbl[n][4] = vj
n = n + 1
end
end

ожидаю, что на выходе tbl будет равна

{{1, 2, 3, 7}, {1, 2, 3, 8}, {1, 2, 3, 9}, {4, 5, 6, 7}, {4, 5, 6, 8}, {4, 5, 6, 9}}

но внезапно получаю

{{1, 2, 3, 9}, {1, 2, 3, 9}, {1, 2, 3, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}, {4, 5, 6, 9}}

WTF?

А все потому, что таблицы передаются по ссылке, а не по значению. То есть, ты в { 1, 2, 3 } пишешь сначала [4] = 7, затем туда же 8, затем туда же 9. В результате получается { 1, 2, 3, 9 }, остальное затерто.

Ссылка на комментарий
Поделиться на другие сайты

А все потому, что таблицы передаются по ссылке, а не по значению.

Именно это я и подозревал, но не нашел нигде инфы, как передать по значению. Правда, особо и не искал, ибо херня какая-то - в других местах таблицы нормально копируются, а перезапись происходит в пределах неймспейса внутреннего цикла. И значит ли это, что если заменить.

tbl[n] = vi
tbl[n][4] = vj

на

for kk, vk in vi do tbl[n][kk] = vk end
tbl[n][4] = vj

то всё заработает, так как передаются не таблицы?

Ссылка на комментарий
Поделиться на другие сайты

Именно это я и подозревал, но не нашел нигде инфы, как передать по значению. Правда, особо и не искал, ибо херня какая-то - в других местах таблицы нормально копируются, а перезапись происходит в пределах неймспейса внутреннего цикла. И значит ли это, что если заменить.

tbl[n] = vi
tbl[n][4] = vj

на

for kk, vk in vi do tbl[n][kk] = vk end
tbl[n][4] = vj

то всё заработает, так как передаются не таблицы?

Рухнет с ошибкой, т.к. tbl[n] это nil, а nil не индексируется. Правильно так:

local t = {}
for kk, vk in vi do t[kk] = vk end
t[4] = vj
tbl[n] = t

Ссылка на комментарий
Поделиться на другие сайты

Рухнет с ошибкой, т.к. tbl[n] это nil, а nil не индексируется. Правильно так:

local t = {}
for kk, vk in vi do t[kk] = vk end
t[4] = vj
tbl[n] = t

Ну да упустил. Только зачем временная переменная? Почему нельзя вместо "local t = {}" "tbl[n] = {}"?

А вообще, получается "Ехал цикл через цикл, видит цикл в цикле цикл..."

Ссылка на комментарий
Поделиться на другие сайты

Ну да упустил. Только зачем временная переменная? Почему нельзя вместо "local t = {}" "tbl[n] = {}"?

Можно. Но с локальной переменной меньше индексаций, меньше иструкций на выполнение и меньше копипасты. По-хорошему, ее еще за цикл надо вынести.

А вообще, получается "Ехал цикл через цикл, видит цикл в цикле цикл..."

Пишите меньше говнокода.

Ссылка на комментарий
Поделиться на другие сайты

Пишите меньше говнокода.
Заменить циклы рекурсией?
Ссылка на комментарий
Поделиться на другие сайты

Заменить циклы рекурсией?

Заменить лапшу функциями.

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования