Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Создание массива через Assign (http://forum.oszone.net/showthread.php?t=339691)

-TRM- 15-03-2019 12:11 2863251

Создание массива через Assign
 
Приветствую, возможно ли создание массива через Assasin() и получение его через Eval() ? Цель-создать 10 массивов типа MASSIV_1, MASSIV_2 и т.д и обрабатывать их через цикл добавляя к MASSIV_ номер цикла, а не делать 10 одинаковых функций.

Iska 15-03-2019 17:00 2863297

-TRM-, что такое:
Цитата:

Цитата -TRM-
через Assasin() »

?

P.S. Опишите саму задачу.

Creat0R 15-03-2019 20:27 2863328

Цитата:

Цитата -TRM- (Сообщение 2863251)
Приветствую, возможно ли создание массива через Assasin() и получение его через Eval() ? Цель-создать 10 массивов типа MASSIV_1, MASSIV_2 и т.д и обрабатывать их через цикл добавляя к MASSIV_ номер цикла, а не делать 10 одинаковых функций.

Скорее всего имеется в виду Assign...

Можно использовать, ну почему бы не использовать двумерный массив?

Iska 16-03-2019 00:25 2863345

Цитата:

Цитата Creat0R
Скорее всего имеется в виду Assign... »

Creat0R, спасибо, ясно.

Я бы, пожалуй, подумал над коллекцией/словарём (Microsoft Scripting Runtime везде есть):
Скрытый текст
Код:

AutoItSetOption("MustDeclareVars", 1)

Local $oDictionary = ObjCreate("Scripting.Dictionary")
Local $array, $elem

Local $aArrFirst  = [0, 1, 2, 3]
Local $aArrSecond = [1, 2, 3, 4, 5, 6, 7]
Local $aArrThird  = [8, 9]

$oDictionary.Add(0, $aArrFirst)
$oDictionary.Add(1, $aArrSecond)
$oDictionary.Add(2, $aArrThird)

For $array In $oDictionary.Items
        ConsoleWrite("---------------" & @CRLF)

        For $elem In $array
                ConsoleWrite($elem & @CRLF)
        Next
Next

exit(0)


Жаль, AutoIt не позволяет зараз создавать и пользовать массивы напрямую, без объявления переменных (a-la WSH'ной функцией Array()).

Update: Хотя…
Скрытый текст
Код:

AutoItSetOption("MustDeclareVars", 1)

Local $oDictionary = ObjCreate("Scripting.Dictionary")
Local $array, $elem


$oDictionary.Add(0, Array(0, 1, 2, 3))
$oDictionary.Add(1, Array(1, 2, 3, 4, 5, 6, 7))
$oDictionary.Add(2, Array(8, 9))

For $array In $oDictionary.Items
        ConsoleWrite("---------------" & @CRLF)

        For $elem In $array
                ConsoleWrite($elem & @CRLF)
        Next
Next

exit(0)

Func Array($Var0, $Var1 = Null, $Var2 = Null, $Var3 = Null, $Var4 = Null, $Var5 = Null, $Var6 = Null, $Var7 = Null, $Var8 = Null, $Var9 = Null)
        Local $array[@NumParams]
        Local $i

        For $i = 0 To @NumParams - 1
                $array[$i] =  Eval("Var" & $i)
        Next

        Return $array
EndFunc


-TRM- 16-03-2019 14:09 2863400

Цитата:

Цитата Creat0R
Можно использовать, ну почему бы не использовать двумерный массив? »

так мне и нужно использовать двухмерный массив, а в Assign прочитал не поддерживает такое.

Creat0R 16-03-2019 14:52 2863404

-TRM-, можно пример того как ты это делаешь без Assign?

Creat0R 16-03-2019 15:13 2863405

Цитата:

Цитата -TRM-
Цель-создать 10 массивов типа MASSIV_1, MASSIV_2 и т.д и обрабатывать их через цикл добавляя к MASSIV_ номер цикла »

Ну так а зачем тут Assign?

Код:

Global $aArray_1[1][1] = [[1]]
Global $aArray_2[1][1] = [[2]]
Global $aArray_3[1][1] = [[3]]
Global $aArray_4[1][1] = [[4]]
Global $aArray_5[1][1] = [[5]]

_ArrayGet(2)

Func _ArrayGet($iVal)
    For $i = 1 To 5
        $aArray = Eval('aArray_' & $i)

        ;If $aArray[0][0] = $iVal Then
            ConsoleWrite($aArray[0][0] & @CRLF)
        ;EndIf
    Next
EndFunc


-TRM- 16-03-2019 17:21 2863425

Цитата:

Цитата Creat0R
Ну так а зачем тут Assign? »

А как тогда значение в массив записать?

Iska 16-03-2019 18:15 2863429

-TRM-, Вы можете хоть массив из массивов сделать, только достаточно медленно сие будет работать.

Вы саму задачу опишите. Пока Вы рассказываете только про уже выбранное решение.

Creat0R 16-03-2019 20:34 2863440

-TRM-,
Код:

Execute('$aArray_' & $i & '[1][1] = ' & 'value')
Не проверял, пишу с телефона.

Creat0R 16-03-2019 23:17 2863460

Цитата:

Цитата -TRM-
Assign прочитал не поддерживает такое »

Зато поддерживает присвоение переменной массива другого массива:
Вот так вроде получилось то что тебе нужно:

Код:

Global Const $sArray_Prefix = 'aArray_'

Global $aArray_1[1][2] = [[1, 'Item1']]
Global $aArray_2[1][2] = [[2, 'Item2']]
Global $aArray_3[1][2] = [[3, 'Item3']]
Global $aArray_4[1][2] = [[4, 'Item4']]
Global $aArray_5[1][2] = [[5, 'Item5']]

_ArraySet(2, 0, 1, 'New Item 2')
$sRet = _ArrayGet(2, 0, 1)

MsgBox(64, @ScriptName, '_ArrayGet(2, 0, 1) VS $aArray_2[0][1]' & @CRLF & $sRet & ' --> ' & $aArray_2[0][1])

Func _ArraySet($iArr, $iRow, $iCol, $sValue)
    Local $aArray = Eval($sArray_Prefix & $iArr)

    If UBound($aArray, 0) < 2 Or $iRow > UBound($aArray, 1) - 1 Or $iCol > UBound($aArray, 2) - 1 Then
        Return SetError(1, 0, 0)
    EndIf

    $aArray[$iRow][$iCol] = $sValue
    Assign($sArray_Prefix & $iArr, $aArray)
EndFunc

Func _ArrayGet($iArr, $iRow, $iCol = 0)
    Local $aArray = Eval($sArray_Prefix & $iArr)

    If UBound($aArray, 0) < 2 Or $iRow > UBound($aArray, 1) - 1 Or $iCol > UBound($aArray, 2) - 1 Then
        Return SetError(1, 0, 0)
    EndIf

    Return $aArray[$iRow][$iCol]
EndFunc



Время: 05:20.

Время: 05:20.
© OSzone.net 2001-