Что нового

Массивы массивов, обращение к элементам вложенных массивов ?

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Всем доброго времени суток...
Совсем не нашел в оф.доке ответа на этот вопрос..
AutoIt являясь не строготипизированным позволяет содавать массивы
(массивами их можно назвать с натяжкой, скорее это колллекции или списки...)
Элементами которых могут быть другие массивы.

Я уже знаком с такой функциональностью и сталкивался в таких языках как Python и PHP
Очень удобно... особенно для рекурсивной описи содержимого каталогов...

И они действительно создаются и поддерживаются... только я никак не въеду как обратиться к конкретному элементу
подмассива...
например
имеем 1x-массив $x первым элементом которого я вляется 1x-массив $y
Как мне обратиться ко 2-ому элементу массива $y ?
Код:
#Include <Array.au3>

Dim $x [3] = ["x1", "x2", "x3"]
Dim $y [3] = ["y1", "y2", "y3"]

$x[1] = $y

_ArrayDisplay($x[1], "Вложенный в масив $x массив $y")

; как мне обратиться к $y[2] например ?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Код:
#Include <Array.au3>

Dim $x [3] = ["x1", "x2", "x3"]
Dim $y [3] = ["y1", "y2", "y3"]

$x[1] = $y

_ArrayDisplay($x[1], "Вложенный в масив $x массив $y")

Dim $temp = $x[1]
MsgBox(0,"$y[2]",$temp[2])
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
SECTOR
SECTOR сказал(а):
А вот что в этот момент делает AutoIt создает ссылку на объект или копирует его во вновь созданную переменную ?
Просто Python напрмер позволяет "наращивать глубину обращения" при помощи оператора заключения контейнера в {} скобки
т.е. там бы это выглядело так
{x[1]}[1] (1-элемент, первого элемента массива x)
и так далее, если и это массив то можно еще глубже
{{x[1]}[1]}[1] (1-елемент, первого элемента, в первом элементе массива x)

Есть ли что либо подобное в AutoIt ?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Если вас смущает запись массива в переменную, можно написать небольшую функцию, например:

Код:
#Include <Array.au3>

Dim $x [3] = ["x1", "x2", "x3"]
Dim $y [3] = ["y1", "y2", "y3"]

$x[1] = $y

_ArrayDisplay($x[1], "Вложенный в масив $x массив $y")

MsgBox(0,"$y[2]",_Ar2Ar_Get($x,1,2))

Func _Ar2Ar_Get(ByRef $aArray, $nArray_Index, $nArAr_Index)

	If Not IsArray($aArray) Then Return SetError(1,0,"")

	If $nArray_Index < 0 Or $nArray_Index > UBound($aArray)-1 Then Return SetError(2,0,"")

	Local $aTemp = $aArray[$nArray_Index]

	If $nArAr_Index < 0 Or $nArAr_Index > UBound($aTemp)-1 Then Return SetError(3,0,"")

	Return $aTemp[$nArAr_Index]

EndFunc


Есть ли что либо подобное в AutoIt ?
Не вникал в массивы в массивах, но думаю что нет...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
RUVATA, в таком контексте – никак. обращайся через $y, а не через $x.
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Kaster
AutoIt в отличии от Python оперерирует объектами как таковыми а не ссылками на них...
Т.е. если я присвая массив $y первому элементу массива $x
Код:
$x[1] = $y

И после этого буду работать с $y, на содержимом $x[1] это не отразится
Код:
#Include <Array.au3>

Dim $x [3] = ["x1", "x2", "x3"]
Dim $y [3] = ["y1", "y2", "y3"]
$x[1] = $y
$y[2] = "OOps!"

_ArrayDisplay($x[1], "текущий массив $x")
_ArrayDisplay($y, "текущий массив $y")
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
RUVATA [?]
на содержимом $x[1] это не отразится
нет, не отразится. сказанное выше – это костыль, для обращения к элементам созданного псевдовложенного массива в цикле. потому как в посте 1 ты указал, что хочешь именно обращение, а не модификацию. тут ничего не поделать, помимо работы с обычными массивами, и после присвоения а-ля
Код:
$x[1] = $y

однако, вся затея для меня выглядит туманной, ибо данная фича видится очень удобной, но не критичной, без чего нельзя обойтись


Добавлено:
Сообщение автоматически объединено:

SECTOR [?]
А я тут голову ломаю
над чем ты ломаешь голову и почему?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
RUVATA сказал(а):

RUVATA, не нужно казаться глупее, чем оно есть на самом деле. У нас серьезный форум и нужно этому хотя бы пытаться соответствовать.
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Yashied
Виноват... :'( я незадумываясь скопировал из своего редактора... как-то не придал значения
PS: Исправлено...
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
SECTOR, Ваш совет - разработать функцию, взят за идею, ну а результат впрочем вы уже видели

PS: Сегодня исправлен, важный баг :whistle: теперь точно все "бэнч"...
 

David_i

Новичок
Сообщения
4
Репутация
1
<Некропостинг> - но если я наткнулся на этот тред то может еще кто наткнется.

Теперь это работает почти как в Python. ( ( $x[n] ) [n] ) [n] и т.д.

Пример:
Код:
Arr_test(1, 2, _
3)

Exit

Func Arr_test($i1, _
$i2, _
$i3)
 
    $arr = MemGetStats() ;1 Lvl Array
  
    Local $arr2[2]
  
    $arr2[1] = $arr ;2 Lvl Array
  
    Local $arr3[2]
  
    $arr3[1] = $arr2 ;3 Lvl Array
  
    Local $arr4[2]
  
    $arr4[1] = $arr3 ;4 Lvl Array
  
    MsgBox(64, "", "Процент используемой памяти: " & ((($arr4[1])[1])[1])[0] & _
     " Общий размер: " & ((($arr4[1])[1])[1])[1] & _
     " Свободно: " & ((($arr4[1])[1])[1])[2])
  
EndFunc
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Каков актуальный ответ на заданный вопрос? Между прочим, обращение к элементу массива это не только считывание и перезапись. У меня вот, например, возникла потребность употребить к элементу массива Redim, что прямым образом не предусмотрено, нужен какой-то способ, что ли, дать псевдоним элементу массива для этого или же какое-то иное решение, связанное с обращением к элементу. Да и с заполнением добавленных элементов такого же рода сложности. Можно, конечно, извращаться примерно вот таким способом.
Код:
#include <Array.au3>
Dim $m[2] = ["x", "y"], $a[3] = [2, $m, 3]
MyReDim($a[1], 3)
MyAssign($a[1], 2, "z")
_ArrayDisplay($a)
_ArrayDisplay($a[1])
Func MyRedim(ByRef $in, $n)
   ReDim $in[$n]
   Return
EndFunc
Func MyAssign(ByRef $in, $i, $x)
   $in[$i] = $x
   Return
EndFunc
Но это на случай, если AutoIt не даёт более прямых средств.
Сообщение автоматически объединено:

После перечитывания стартового поста стало понятно, что хотя проблемы и похожи, но всё-таки различаются, поэтому ухожу с этим вопросом в отдельный топик, как принято на этом форуме.
 
Последнее редактирование:
Верх