Просмотр полной версии : [Вопрос] Подсчет двухмерного массива
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-"
Да, в таком легком решении у меня уже голова не работает...
Лучше указать фиксированный размер. И с помощью цикла определять нуль (или -1, или любое другое число, неиспользуемое в массиве).
Edward Morra
23.02.2017, 17:46
Лучше указать фиксированный размер. И с помощью цикла определять нуль (или -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},
{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);
}
Только смещением подсчитать? ЛАЙФХУЦКа другого нету?
Разбить двумерный массив на несколько одномерных, обозвав их уникальными именами, передающими суть. Так и читаемость улучшится, и не нужно костыли искать для подсчёта размера. Двумерный массив тут себя никак не оправдывает
Edward Morra
24.02.2017, 17:25
Можно CLosed.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot