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

Дайджест за июль-сентябрь

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

Сентябрь Август Июль

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

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

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

Бот статистики для Telegram

Удобная аналитика в телефоне.

Подробнее

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

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

Подробнее

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

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

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

Массивы


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 эмодзи.

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

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

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

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

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

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