Author Topic: N-мерные массивы или хотя бы двумерные  (Read 7614 times)

0 Members and 1 Guest are viewing this topic.

Tiabaldu

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Почитал обновления про массивы, уже попробовал на тестовых парочке скриптов. Очень хорошее нововведение. Но зачастую одномерный массив редко представляет большой интерес, многомерные массивы будут иметь более широкий спектр применения, может расширить?  ;)

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #1 on: October 10, 2013, 04:59:55 PM »
Разрешите поинтересоваться. У вас интерес практический или академический?
Я за свои эээ 10+ лет программирования ни разу не использовал даже трех мерный массив.  Неск раз использовал двух мерный (и то помоему в годы обучения, игрушки какие то делал "клеточные"). Четырех мерный (и больше) массив человеческий мозг уже не в состоянии представить.

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

например для $var_2d[N, M] где N номер строки а M столбца, "одномерная"  формула смещения будет $var_1d [N * кол-во элементов на строку + M]

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #2 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 мерные нужны.


Белый Лис

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #3 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 ?

« Last Edit: November 01, 2016, 11:31:52 AM by Белый Лис »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #4 on: November 01, 2016, 11:39:17 AM »
С чем сравнить? Награды между собой в одной задаче? Или награды[0] или [1] между задачами?


Белый Лис

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #5 on: November 01, 2016, 12:09:53 PM »
Сравнить $reward[0] и $reward[1] для каждого значения $task
« Last Edit: November 01, 2016, 12:16:45 PM by Белый Лис »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #6 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 - индексы столбцов.
Хочешь явно задавай числами, хочешь перебирай в цикле.
« Last Edit: November 01, 2016, 01:03:06 PM by Vint »


Белый Лис

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: N-мерные массивы или хотя бы двумерные
« Reply #7 on: November 03, 2016, 10:28:17 PM »
Спасибо за информацию. Но я обошёлся одномерными массивами. Так мне оказалось проще. Да и с обратной формулой смещения тоже вроде бы разобрался.
Хотя это и добавляет некоторого мозголомства, но работает; так что спасибо  Johnny за пояснение, как сделать оффсетный сдвиг.