Войти

Показать полную графическую версию : [решено] Создание массива через Assign


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

Iska
15-03-2019, 17:00
-TRM-, что такое:
через Assasin() »
?

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

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

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

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

Iska
16-03-2019, 00:25
Скорее всего имеется в виду 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
Можно использовать, ну почему бы не использовать двумерный массив? »
так мне и нужно использовать двухмерный массив, а в Assign прочитал не поддерживает такое.

Creat0R
16-03-2019, 14:52
-TRM-, можно пример того как ты это делаешь без Assign?

Creat0R
16-03-2019, 15:13
Цель-создать 10 массивов типа MASSIV_1, MASSIV_2 и т.д и обрабатывать их через цикл добавляя к MASSIV_ номер цикла »
Ну так а зачем тут Assign?

Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_1[1][1] = [[1]]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_2[1][1] = [[2]]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_3[1][1] = [[3]]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_4[1][1] = [[4]]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_5[1][1] = [[5]]

_ArrayGet(2)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _ArrayGet($iVal)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 5
$aArray = Eval (http://www.autoitscript.com/autoit3/docs/functions/Eval.htm)('aArray_' & $i)

;If $aArray[0][0] = $iVal Then
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)($aArray[0][0] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf))
;EndIf
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

-TRM-
16-03-2019, 17:21
Ну так а зачем тут Assign? »
А как тогда значение в массив записать?

Iska
16-03-2019, 18:15
-TRM-, Вы можете хоть массив из массивов сделать, только достаточно медленно сие будет работать.

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

Creat0R
16-03-2019, 20:34
-TRM-,
Execute('$aArray_' & $i & '[1][1] = ' & 'value')
Не проверял, пишу с телефона.

Creat0R
16-03-2019, 23:17
Assign прочитал не поддерживает такое »
Зато поддерживает присвоение переменной массива другого массива:
Вот так вроде получилось то что тебе нужно:

Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $sArray_Prefix = 'aArray_'

Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_1[1][2] = [[1, 'Item1']]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_2[1][2] = [[2, 'Item2']]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_3[1][2] = [[3, 'Item3']]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_4[1][2] = [[4, 'Item4']]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $aArray_5[1][2] = [[5, 'Item5']]

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

MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, @ScriptName (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptname), '_ArrayGet(2, 0, 1) VS $aArray_2[0][1]' & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & $sRet & ' --> ' & $aArray_2[0][1])

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _ArraySet($iArr, $iRow, $iCol, $sValue)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aArray = Eval (http://www.autoitscript.com/autoit3/docs/functions/Eval.htm)($sArray_Prefix & $iArr)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aArray, 0) < 2 Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iRow > UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aArray, 1) - 1 Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iCol > UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aArray, 2) - 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

$aArray[$iRow][$iCol] = $sValue
Assign (http://www.autoitscript.com/autoit3/docs/functions/Assign.htm)($sArray_Prefix & $iArr, $aArray)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _ArrayGet($iArr, $iRow, $iCol = 0)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aArray = Eval (http://www.autoitscript.com/autoit3/docs/functions/Eval.htm)($sArray_Prefix & $iArr)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aArray, 0) < 2 Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iRow > UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aArray, 1) - 1 Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $iCol > UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aArray, 2) - 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aArray[$iRow][$iCol]
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)




© OSzone.net 2001-2012