Автокликер Clickermann :: Форум
Основной раздел => Предложения => Topic started by: Tiabaldu on October 10, 2013, 11:02:21 AM
-
Почитал обновления про массивы, уже попробовал на тестовых парочке скриптов. Очень хорошее нововведение. Но зачастую одномерный массив редко представляет большой интерес, многомерные массивы будут иметь более широкий спектр применения, может расширить? ;)
-
Разрешите поинтересоваться. У вас интерес практический или академический?
Я за свои эээ 10+ лет программирования ни разу не использовал даже трех мерный массив. Неск раз использовал двух мерный (и то помоему в годы обучения, игрушки какие то делал "клеточные"). Четырех мерный (и больше) массив человеческий мозг уже не в состоянии представить.
К тому же как я уже говорил, оперативная память это одномерный массив. Поэтому все эти мерности все равно лишь условность. Любой массив одномерен а все эти измерения лишь избавляют от необходимости писать каждый раз формулу оффсета (смещения).
например для $var_2d[N, M] где N номер строки а M столбца, "одномерная" формула смещения будет $var_1d [N * кол-во элементов на строку + M]
-
Я тоже ожидал массивы многомерными, что бы там Johnny не говорил про условности многомерности.
Всё таки гораздо удобнее работать с индексами каждой размерности, чем самому высчитывать смещение.
Пример:
$ARR[0][0]= 1
//...
$ARR[10][7]= 100
$i = 4
FOR ($i, $i<10)
FOR ($t, $t<7)
$result = $result + $ARR[$i-1][$t-1]
END_CYC
END_CYC
Вот это:
$ARR[$i-1][$t-1]
выглядит, читается и отлаживается лучше, чем
$ARR[($i-1)*8+($t-1)]
и то я не уверен, что не напутал. Так это довольно простой случай.
Трёхмерный я использовал.
В любом случае часть функций существует для удобства. Хоть и могут использоваться редко.
Мне например был нужен модуль числа, выкручивался так:
$var = SQRT($var*$var)
P.S. Я могу представить 4 мерный и больше массив. Представить 10 строк в 5 колонок и в каждой ячейке по 3 значения легко. Дальше и правда сложнее что каждое значение может состоять из 12 элементов. На этом этапе общее представление "разваливается" переходя к частному.
На помощь приходит привычная для мозга аналогия.
Представить несколько городов[5] в котором есть улица Ленина[5][0] и улица Мира[5][1]. На каждой улице есть по 15 домов [5][1][15] В домах по 4 подъезда [5][1][15][4] по 20 квартир [5][1][15][4][20].
Вот и 5-и мерный массив :) И в голове всё понятно. И обращаться к каждому элементу легко. Можно ещё расширить "наружу" Начать со стран-континентов-планет :) ;D Но конечно же не нужно обычно.
... Но 2-3 мерные нужны.
-
К тому же как я уже говорил, оперативная память это одномерный массив. Поэтому все эти мерности все равно лишь условность. Любой массив одномерен а все эти измерения лишь избавляют от необходимости писать каждый раз формулу оффсета (смещения).
например для $var_2d[N, M] где N номер строки а M столбца, "одномерная" формула смещения будет $var_1d [N * кол-во элементов на строку + M]
А можно поподробнее для нуба?
Допустим, мне нужен массив из 3 строчек по 2 элемента в каждой и я запишу это в одномерный массив через оффсетную формулу.
For($task=0, $task<3)
For($reward=0, $reward<2)
// Тут тело цикла c результатом $res
$Arr[$task * 2 + $reward]=$res
End_Cyc
End_Cyc
Надеюсь, я правильно записал.
А как мне из этого массива теперь сравнить значения $reward для каждого значения $task ?
-
С чем сравнить? Награды между собой в одной задаче? Или награды[0] или [1] между задачами?
-
Сравнить $reward[0] и $reward[1] для каждого значения $task
-
Всё почти то же самое.
FOR($task=0, $task < 3)
IF($Arr[$task*2 + 0] > $Arr[$task*2 + 1])
LOGWRITE("reward[0] > reward[1]")
ELSE
LOGWRITE("reward[0] <= reward[1]")
END_IF
END_CYC
Само собой +0 можно не писать.
У тебя при формировании массива в $task индексы строк, в $reward - индексы столбцов.
Хочешь явно задавай числами, хочешь перебирай в цикле.
-
Спасибо за информацию. Но я обошёлся одномерными массивами. Так мне оказалось проще. Да и с обратной формулой смещения тоже вроде бы разобрался.
Хотя это и добавляет некоторого мозголомства, но работает; так что спасибо Johnny за пояснение, как сделать оффсетный сдвиг.