PDA

Просмотр полной версии : [Вопрос] Подсчет двухмерного массива



Edward Morra
23.02.2017, 17:23
Название темы говорит за себя...

new select = sizeof(SElectItem[PVar::GetInt(playerid,"SelectPVar")-1]);
Хочу подсчитать 1 строчку к примеру этого массива:

new SElectItem[][] = {
{1796, 1794, 2090, 1795, 2302, 2299, 1797, 1798, 1799, 1802, 1801, 1803, 1701, 1745, 2566, 2575},
{2118, 2030, 2032, 2311, 2110, 2119, 2126, 1822, 2029, 2115, 1814, 2109, 1818, 2031, 1817, 1821, 2234, 2235, 2111, 2112, 1823, 1737, 2117}
}
Выдает:
error 001: expected token: "]", but found "-identifier-"
Да, в таком легком решении у меня уже голова не работает...

VVWVV
23.02.2017, 17:44
Лучше указать фиксированный размер. И с помощью цикла определять нуль (или -1, или любое другое число, неиспользуемое в массиве).

Edward Morra
23.02.2017, 17:46
Лучше указать фиксированный размер. И с помощью цикла определять нуль (или -1, или любое другое число, неиспользуемое в массиве).

А если допустим массив будет время от времени добавляться данными, мне придется каждый раз менять фиксированный размер..
Не удобно так то...

VVWVV
23.02.2017, 17:57
А если допустим массив будет время от времени добавляться данными, мне придется каждый раз менять фиксированный размер..
Не удобно так то...

Можно поиграться со смещениями:


new SElectItem[][] = {
{1796, 1794, 2090, 1795, 2302, 2299, 1797, 1798, 1799, 1802, 1801, 1803, 1701, 1745, 2566, 2575},
{2118, 2030, 2032, 2311, 2110, 2119, 2126, 1822, 2029, 2115, 1814, 2109, 1818, 2031, 1817, 1821, 2234, 2235, 2111, 2112, 1823, 1737, 2117},
{0,0} // Нужна для правильной генерации
};

stock GetDynArraySize(array[][], idx, size = sizeof array)
{
assert (size > 2);

new
offset_next,
offset_last;

++idx;

assert (idx < size);

idx <<= 2;

#emit load.s.pri array
#emit load.s.alt idx
#emit add
#emit stor.s.pri offset_next
#emit lref.s.pri offset_next
#emit stor.s.pri offset_next

idx -= 4;

#emit load.s.pri array
#emit load.s.alt idx
#emit add
#emit stor.s.pri offset_last
#emit lref.s.pri offset_last
#emit stor.s.pri offset_last
return ((offset_next - offset_last) / 4) + 1;
}

main()
{
SElectItem[0][1] = 1;
new ret = GetDynArraySize(SElectItem, 1);
printf("%d", ret);
}

Edward Morra
23.02.2017, 18:46
Можно поиграться со смещениями:


new SElectItem[][] = {
{1796, 1794, 2090, 1795, 2302, 2299, 1797, 1798, 1799, 1802, 1801, 1803, 1701, 1745, 2566, 2575},
{2118, 2030, 2032, 2311, 2110, 2119, 2126, 1822, 2029, 2115, 1814, 2109, 1818, 2031, 1817, 1821, 2234, 2235, 2111, 2112, 1823, 1737, 2117},
{0,0} // Нужна для правильной генерации
};

stock GetDynArraySize(array[][], idx, size = sizeof array)
{
assert (size > 2);

new
offset_next,
offset_last;

++idx;

assert (idx < size);

idx <<= 2;

#emit load.s.pri array
#emit load.s.alt idx
#emit add
#emit stor.s.pri offset_next
#emit lref.s.pri offset_next
#emit stor.s.pri offset_next

idx -= 4;

#emit load.s.pri array
#emit load.s.alt idx
#emit add
#emit stor.s.pri offset_last
#emit lref.s.pri offset_last
#emit stor.s.pri offset_last
return ((offset_next - offset_last) / 4) + 1;
}

main()
{
SElectItem[0][1] = 1;
new ret = GetDynArraySize(SElectItem, 1);
printf("%d", ret);
}


Только смещением подсчитать? ЛАЙФХУЦКа другого нету?

DeimoS
24.02.2017, 00:44
Разбить двумерный массив на несколько одномерных, обозвав их уникальными именами, передающими суть. Так и читаемость улучшится, и не нужно костыли искать для подсчёта размера. Двумерный массив тут себя никак не оправдывает

Edward Morra
24.02.2017, 17:25
Можно CLosed.