Автокликер Clickermann :: Форум

Основной раздел => Предложения => Topic started by: Tiabaldu on October 10, 2013, 11:02:21 AM

Title: N-мерные массивы или хотя бы двумерные
Post by: Tiabaldu on October 10, 2013, 11:02:21 AM
Почитал обновления про массивы, уже попробовал на тестовых парочке скриптов. Очень хорошее нововведение. Но зачастую одномерный массив редко представляет большой интерес, многомерные массивы будут иметь более широкий спектр применения, может расширить?  ;)
Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Johnny on October 10, 2013, 04:59:55 PM
Разрешите поинтересоваться. У вас интерес практический или академический?
Я за свои эээ 10+ лет программирования ни разу не использовал даже трех мерный массив.  Неск раз использовал двух мерный (и то помоему в годы обучения, игрушки какие то делал "клеточные"). Четырех мерный (и больше) массив человеческий мозг уже не в состоянии представить.

К тому же как я уже говорил, оперативная память это одномерный массив. Поэтому все эти мерности все равно лишь условность. Любой массив одномерен а все эти измерения лишь избавляют от необходимости писать каждый раз формулу оффсета (смещения).

например для $var_2d[N, M] где N номер строки а M столбца, "одномерная"  формула смещения будет $var_1d [N * кол-во элементов на строку + M]
Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Vint on October 17, 2013, 09:37:11 AM
Я тоже ожидал массивы многомерными, что бы там Johnny не говорил про условности многомерности.
Всё таки гораздо удобнее работать с индексами каждой размерности, чем самому высчитывать смещение.
Пример:
Code: (clickermann) [Select]
$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

Вот это:
Code: (clickermann) [Select]
$ARR[$i-1][$t-1]выглядит, читается и отлаживается лучше, чем
Code: (clickermann) [Select]
$ARR[($i-1)*8+($t-1)]
и то я не уверен, что не напутал. Так это довольно простой случай.
Трёхмерный я использовал.
В любом случае часть функций существует для удобства. Хоть и могут использоваться редко.

Мне например был нужен модуль числа, выкручивался так:
Code: (clickermann) [Select]
$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 мерные нужны.
Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Белый Лис on November 01, 2016, 11:22:16 AM
К тому же как я уже говорил, оперативная память это одномерный массив. Поэтому все эти мерности все равно лишь условность. Любой массив одномерен а все эти измерения лишь избавляют от необходимости писать каждый раз формулу оффсета (смещения).

например для $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 ?

Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Vint on November 01, 2016, 11:39:17 AM
С чем сравнить? Награды между собой в одной задаче? Или награды[0] или [1] между задачами?
Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Белый Лис on November 01, 2016, 12:09:53 PM
Сравнить $reward[0] и $reward[1] для каждого значения $task
Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Vint on November 01, 2016, 12:58:08 PM
Всё почти то же самое.
Code: (clickermann) [Select]
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 - индексы столбцов.
Хочешь явно задавай числами, хочешь перебирай в цикле.
Title: Re: N-мерные массивы или хотя бы двумерные
Post by: Белый Лис on November 03, 2016, 10:28:17 PM
Спасибо за информацию. Но я обошёлся одномерными массивами. Так мне оказалось проще. Да и с обратной формулой смещения тоже вроде бы разобрался.
Хотя это и добавляет некоторого мозголомства, но работает; так что спасибо  Johnny за пояснение, как сделать оффсетный сдвиг.