Что нового

Как определить массив?

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
К примеру 4-х или 5-ти мерный.
Например вот:
Код:
Dim $aArray[2][2] = [[1, 2], [3, 4]]

Только я хочу чтобы $aArray выглядел например так:
Код:
$aArray[3][2][6][8][28] = ;Как теперь мне надо оформить информацию после знака равно?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Надеюсь, ты пошутил про размерности. Если ты хочешь чтобы твой массив был размерностью 3х2х6х28 то тебе придется описать соответственно 1008 элементов. никто тебе этого тут на форуме делать не станет.
для 2х2х2х2 ниже строчка. логика тут простая. при каждом увеличении размерности считаешь что каждый элемент сам представляет собой массив размерностью на 1 ниже
Код:
Local $a[2][2][2][2] = [[[[1 ,2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]]
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
kaster сказал(а):
Надеюсь, ты пошутил про размерности. Если ты хочешь чтобы твой массив был размерностью 3х2х6х28 то тебе придется описать соответственно 1008 элементов. никто тебе этого тут на форуме делать не станет.
для 2х2х2х2 ниже строчка. логика тут простая. при каждом увеличении размерности считаешь что каждый элемент сам представляет собой массив размерностью на 1 ниже
Код:
Local $a[2][2][2][2] = [[[[1 ,2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]]
О! Держи +1. Спасибо. Мои размеры массива намного больше, я так, для наглядносит привел рандомные числа, мне главное шаблон который ты собственно и дал :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
4-5-мерные массивы? Жесть :shok:

Код:
Dim $aArray1[2] = [1,2]
Dim $aArray2[2][2] = [[1,2],[1,2]]
Dim $aArray3[2][2][2] = [[[1,2],[1,2]], [[1,2],[1,2]]]
Dim $aArray4[2][2][2][2] = [[[[1,2],[1,2]],[[1,2],[1,2]]],[[[1,2],[1,2]],[[1,2],[1,2]]]]
Dim $aArray5[2][2][2][2][2] = [[[[[1,2],[1,2]],[[1,2],[1,2]]],[[[1,2],[1,2]],[[1,2],[1,2]]]],[[[[1,2],[1,2]],[[1,2],[1,2]]],[[[1,2],[1,2]],[[1,2],[1,2]]]]]


Учти, что на 5-мерный ругается. Но запускает.

В общем виде:
Массив 1 размерности с числом элементов m:
[a1,a2,a3,...,am], где ai - элемент массива с номером i
Массив размерности n+1 с числом элементов k:
[arr1,arr2,arr3...arrk], где arri - массив размерности n-1

OffTopic:
Пока писал - уже ответили. Ну да ладно.
А для чего такие массивы?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
SyDr сказал(а):
4-5-мерные массивы? Жесть :shok:
...
OffTopic:
Пока писал - уже ответили. Ну да ладно.
А для чего такие массивы?
И тибе +1 :smile:
Чтобы в For...Next и прочих циклах гонять их табунами удобно было

Ну и в принципе освоить способ не помешает, интересно же как оно работать будет :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Belfigor сказал(а):
Чтобы в For...Next и прочих циклах гонять их табунами удобно было

Ну и в принципе освоить способ не помешает, интересно же как оно работать будет :smile:
Использование массивов размерностью больше 2 не рекомендуется. всегда нужно искать другие способы реализации алгоритма ;)
Потому как сложность логики алгоритма, как правило, растет как 2^N, где N - размерность массива
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
О сложности алгоритма тут вопрос не встает, он уже в принципе продуман :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Belfigor сказал(а):
О сложности алгоритма тут вопрос не встает, он уже в принципе продуман :smile:
интересный такой алгоритм с многомерным массивом без самого массива ;D
ну да ладно, машина не человек, если все грамотно просчитать то он не ошибется в 99,9999999% 8)
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Чтож, я скажем так отдаленно осознал методом научного тыка в готовые шаблоны как примерно определить пару уровней массива:
Код:
Dim $var[5][2][62] = [[["Adin","Dva","Tri","4itiri","Pijat"],["",""]], [[-9,-9,-9,-8,-8,-6,-6,-4,-4,-1, 0, 2, 4,  7,  9, 11, 14, 16, 19, 22, 26, 29, 32, 35, 39, 42, 46, 50, 54, 56, 61, 64, 68, 71, 74, 78, 82, 85, 88, 91, 95, 98,100,103,106,108,111,113,115,117,119,120,122,123,123,123,125,125,126,126,125], [ 59,62,66,69,73,76,80,83,87,89,93,96,99,101,104,107,109,112,114,116,117,119,120,122,123,124,124,126,125,125,125,126,125,124,124,122,122,120,118,117,116,114,111,109,107,104,102, 99, 96, 93, 90, 86, 83, 80, 80, 76, 73, 69, 66, 62, 59]]]

Но я задал первый уровень [5],
MsgBox(0,'',$var[1][1][0])
MsgBox(0,'',$var[1][0][0])
Таким образом я выдергиваю с первого уровня нужные мне значения, как мне задать еще ряд значений для других уровней? Тоесть чтобы я мог например по ссылкам [2][1][61] - [4][1][61]выдернуть значения уже из другова потока заранее заданных чисел?

мозги просто вскипают от этих массивов
 

SyDr

Сидра
Сообщения
651
Репутация
158
Естественно. Это примерно в 16 раз труднее, чем с обычными массивами ;D

Какую информацию должен хранить данный массив? Может что-то не так понял?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
SyDr сказал(а):
Естественно. Это примерно в 16 раз труднее, чем с обычными массивами ;D

Какую информацию должен хранить данный массив? Может что-то не так понял?
Да мне уже не принципиально, просто продублировать серию чисел в другие уровни, немогу понять как надо сформулировать эту строку для всех 5 уровней, мне это уже больше из любопытства узнать охота
 

SyDr

Сидра
Сообщения
651
Репутация
158
Моя твоя не понимать.

Что есть уровень?
Что есть поток?
Что есть выдёргивание?

OffTopic:
Я не издеваюсь. Мне действительно не понятно.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Да почему этот форум не хочет отображать комбинацию знаков в виде
Код:
[0][0][0]
!?

Перефразирую вопрос:
Ну как я понимаю массив устроен так, что обращаясь каждый раз по уникальному адресу я получаю хранящуюся в нем инфу, как должно выглядеть расположение информации в трехмерном массиве чтобы я мог пользуясь ссылками с адресами обращаться к хранящейся в нем информации?
Ну смотри, в моем массиве Dim $var[5][2][62] я могу обращаться по адресам от [ноль][ноль][ноль] до [4][1][61]. Как мне структурировать в этом массиве 305 чисел + несколько слов, чтобы с помощью ссылок от [ноль][ноль][ноль] до [4][1][61] я смог до них добраться?
В данный момент что я смог сделать это с помощью ссылок [ноль][ноль][ноль] => [ноль][ноль][4] получать из массива заданные заранее 5 слов, и с помощью ссылок [1][ноль][ноль] => [1][ноль][60] и [1][1][ноль] => [1][1][60] получать заданные заранее 122 числа.
Я же хочу пользуясь остальными "уровнями [циферьки вот в таких скобках]" внести в них еще 122*4 чисел. НО Я НЕЗНАЮ как их расположить в этом самом определении массива. Как мне расположить числа так чтобы я мог и с помощью ссылок [ноль][ноль][ноль] => [ноль][ноль][60] ... [4][1][ноль] => [4][1][60] извлекать из массива данные?
*истерика*
Я сумел поместить данные по адресу например [1][1][30], как мне разместить их по адресу [3][1][30]?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
For $i = 1 To 4
	For $k = 1 To 1
		For $j = 1 To 61
			MsgBox(4096, "", "This Is:" & @CRLF $i & " " & $k & " " & $j & @CRLF & $a[$i][$k][$j])
		Next
	Next
Next


С матрицами или множествами знаком?

Двумерный массив:
Рисуешь на бумажке две перпиндикулярные прямые. Используешь их, как систему координат. Каждой точке с целочисленными координатами в соотвествие ставится элемент массива.
Трёхмерный:
Добавляешь третью перпендикулярную прямую. На бумажке это сделать трудновато :smile:
4+
Весьма-весьма проблематично добавить перпендикулярную прямую. С такой структурой чрезвычайно сложно работать ;D Я, например, такое представить себе не могу.


Так вот. К чему я это... Когда увеличиваешь размерность массива - проверь, надо ли это? Сам несколько раз попадался на том, что нужен был массив 2 на n, а я создавал m на n (хотя можно было и 2 одномерных массива завести). Ты уверен, что тебе необходима именно такая структура?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Эххх, мы наверное друг друга так и не поймем, я уже 10 раз попросил сказать мне как мне дополнить эту строку совершенно любыми значениями:
Код:
Dim $var[5][2][62] = [[["Adin","Dva","Tri","4itiri","Pijat"],["",""]], [[-9,-9,-9,-8,-8,-6,-6,-4,-4,-1, 0, 2, 4,  7,  9, 11, 14, 16, 19, 22, 26, 29, 32, 35, 39, 42, 46, 50, 54, 56, 61, 64, 68, 71, 74, 78, 82, 85, 88, 91, 95, 98,100,103,106,108,111,113,115,117,119,120,122,123,123,123,125,125,126,126,125], [ 59,62,66,69,73,76,80,83,87,89,93,96,99,101,104,107,109,112,114,116,117,119,120,122,123,124,124,126,125,125,125,126,125,124,124,122,122,120,118,117,116,114,111,109,107,104,102, 99, 96, 93, 90, 86, 83, 80, 80, 76, 73, 69, 66, 62, 59]]]

чтобы я смог обратиться к новым значениям например по ссылке [2][1][30]
В данный момент имея массив [5][2][61] я могу обращаться к числам только находящимся от [1][0][60] до [1][1][60], и не представляю себе как разместить их чтобы заработали другие ссылки на потоки чисел по адресам [ноль][$x][0 => 60], [2][2][$x][0 => 60], [3][$x][0 => 60], [4]$x][0 => 60].

Я прошу показать мне как это в коде выглядит.

И мне это уже интересно просто шоб знать, я уже и применять это нигде не собираюсь
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Вот простой пример:

Код:
Dim $Var[3][2][4] = [[['000', '001', '002', '003'], ['010', '011', '012', '013']], [['100', '101', '102', '103'], ['110', '111', '112', '113']], [['200', '201', '202', '203'], ['210', '211', '212', '213']]]

For $i = 0 To UBound($Var, 1) - 1
    For $j = 0 To UBound($Var, 2) - 1
        For $k = 0 To UBound($Var, 3) - 1
            ConsoleWrite(($i & $j & $k) & ' => ' & $Var[$i][$j][$k] & @CR)
        Next
    Next
Next


А можно составить массив из массивов (размерности и длины входящих массивов не обязательно должны быть равны), например:

Код:
Dim $A0[5][62] = [[...], [...]]
Dim $A1[2][60] = [[...], [...]]
Dim $A2[9] = [...]
Dim $A3[2][2] = [[...], [...]]
Dim $A4[2][2][2] = [[[...], [...]], [[...], [...]]]

Dim $Var[5] = [$A0, $A1, $A2, $A3, $A4]


Такая организация будет более логичной для большинства случаев, а 3-x и более -мерные массивы могут понадобиться в основном для решения матиматических уровнений n-го порядка (сейчас даже на ум не приходит каких), ну... можно матрицы описывать.

:smile:
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Спасибо, завтра буду тестить
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
Эта тема одна из сложных для многих людей (в плане понимания и пронекновения в материал)
, по сложности, она приравнивается наверное только с темой регулярных выражении ;D (хотя там бывает намного посложнее).

Yashied « Ответ #15, Отправлен: Сентябрь 10, 2009, 23:28:01 »
Вот простой пример
Хороший пример.

P.S
Вы ребята ещё не забывайте об ограничениях в размерности массивов:

http://www.autoitscript.com/autoit3/docs/faq.htm#15 сказал(а):
Arrays: A maximum of 64 dimensions and/or a total of 16 million elements
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
64 dimensions!?!? :Censored: :shok: :shok: :shok:

;D

Если серьезно, то более 2x вряд ли когда-нибудь понадобиться, это не для мира сего (ну если вы только не собираетесь просчитывать дискретный выход 8-го порядка в параллельное измерение на основе евклидовой метрики, ... там еще зеленые человечки и т.д). Сам не понял чего сказал. :smile: Я всего один раз использовал 3x массив и то в институте, и это было давно.


CreatoR сказал(а):
...по сложности, она приравнивается наверное только с темой регулярных выражении...
Регулярные выражения - это просто чума! :smile:
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Если я что-то в чём-нибудь понимаю...
К примеру нужен массив 5 на 6 на 7
Код:
Dim $arr[5][6][7]

В каждой ячейке $arr[$i][$j] будет располагаться одномерный массив.
Если хочется наглядного определения массива, и известны все его значения.
Код:
Dim $arr[0][0]=["001", "002", "003", "004", "005", "006", "007"]
Dim $arr[0][1]=["011", "012", "013", "014", "015", "016", "017"]

И так далее описываешь все массивы до [пять][шесть]

Визуально (и просто для определения) можно представить следующим образом.
Обычный двумерный массив - это как бы набор одномерных массивов, загнанных в другой одномерный массив. Две мерности (i * j к примеру), значит сами значения располагаются в одномерных массивах размером второй мерности (j), а координаты массивов имеют одно число - от нуля до i-1.
Трёхмерный массив - то же самое, но координаты одномерного массива уже два числа. Смотреть выше пример с 5 на 6 на 7. То есть поле 5 на 6, в каждой ячейке которого массив из 7 элементов.
Четырёхмерный - три координаты для каждого одномерного массива из количества элементов такого, как указано в последней скобке определения размерности.
Определяя Dim-ом многомерный массив по одной строке как одномерные, понадобится конечно много строк, но зато вероятность ошибиться уменьшается, чем если использовать множественные вложенные скобки [[]].

В примере.
Код:
Dim $var[5][2][62] = [[["Adin","Dva","Tri","4itiri","Pijat"],["",""]], [[-9,-9,-9,-8,-8,-6,-6,-4,-4,-1, 0, 2, 4,  7,  9, 11, 14, 16, 19, 22, 26, 29, 32, 35, 39, 42, 46, 50, 54, 56, 61, 64, 68, 71, 74, 78, 82, 85, 88, 91, 95, 98,100,103,106,108,111,113,115,117,119,120,122,123,123,123,125,125,126,126,125], [ 59,62,66,69,73,76,80,83,87,89,93,96,99,101,104,107,109,112,114,116,117,119,120,122,123,124,124,126,125,125,125,126,125,124,124,122,122,120,118,117,116,114,111,109,107,104,102, 99, 96, 93, 90, 86, 83, 80, 80, 76, 73, 69, 66, 62, 59]]]

По моему способу распишется как
Код:
Dim $var[5][2][62]
Dim $var[0][0]=["Adin","Dva","Tri","4itiri","Pijat"]
Dim $var[0][1]=["",""]
Dim $var[1][0]=[-9,-9,-9,-8,-8,-6,-6,-4,-4,-1, 0, 2, 4,  7,  9, 11, 14, 16, 19, 22, 26, 29, 32, 35, 39, 42, 46, 50, 54, 56, 61, 64, 68, 71, 74, 78, 82, 85, 88, 91, 95, 98,100,103,106,108,111,113,115,117,119,120,122,123,123,123,125,125,126,126,125]
Dim $var[1][1]=[59,62,66,69,73,76,80,83,87,89,93,96,99,101,104,107,109,112,114,116,117,119,120,122,123,124,124,126,125,125,125,126,125,124,124,122,122,120,118,117,116,114,111,109,107,104,102, 99, 96, 93, 90, 86, 83, 80, 80, 76, 73, 69, 66, 62, 59]

Кстати Belfigor, вроде ты тут можешь обращаться от [ноль][0][60] до [1][1][60], а не как ты написал от [1][0][60] до [1][1][60]. Это если я ничего не путаю.

Эмм... я правда не пробовал проверить это на ошибки автоитом. Так что если будет ругаться на неправильное определение массивов, значит придётся определять сначала кучу одномерных массивов, а потом правильно собирать их в сложные.
К примеру в 5 на 6 на 7
Код:
Dim $arr0000=[...]
Dim $arr0001=[...]
;...
Dim $arr0005=[...]
Dim $arr0100=[...]
;...
Dim $arr0405=[...]
;второй уровень
Dim $arr00=[$arr0000, $arr0001, $arr0002, $arr0003, $arr0004, $arr0005, $arr0006]
;Dim $arrN=[$arrN00, ... , $arrN06]
;и так до 
Dim $arr05=[...]
;третий уровень
Dim $arr=[$arr00, ... , $arr05]

то есть каждые две цифры (по необходимости можно использовать одну, две, три и т.д. лишь бы везде одинаковое количество) идут как обозначение координат массива. А потом идёт постепенная сборка пока координат в имени массива не останется вовсе.
 
Верх