Page 1 sur 1
[..] Déclaration d'un tableau à 2 Dimensions (pb syntaxe)
Posté : jeu. 24 mars 2011 21:02
par Nimrod76
Bonjour,
Je me suis lancé il n'y a pas longtemps dans la programmation Autoit, et c'est donc récemment que j'ai découvert ce forum d'entre aide qui m'a déjà bien aidé !
Bref, j'ai un problème qui vous semblera certainement un peu bête mais qui me turlupine depuis 2 jours :
Je ne comprend pas pourquoi cette façon de déclarer un tableaux à 2 dimensions ne fonctionne pas :
Code : Tout sélectionner
Dim $tabA[3] = ["a1","a2","a3"]
Dim $tabB[3]= ["b1","b2","b3"]
Dim $tabC[3] = ["c1","c2","c3"]
Dim $tabD[3] = ["d1","d2","d3"]
Dim $Grille[4][3] = [ $tabA, $tabB, $tabC, $tabD]
En revanche de cette façon ça fonctionne :
Code : Tout sélectionner
Dim $Grille[4][3] =[ [ "a1","a2","a3"], [ "b1","b2","b3"], [ "c1","c2","c3"], [ "d1","d2","d3"] ]
Pourquoi ces 2 méthodes ne sont elles pas équivalentes ?
Merci beaucoup !
Re: [..] Déclaration d'un tableau à 2 Dimensions (pb syntax
Posté : jeu. 24 mars 2011 23:46
par jchd
déclare un tableau de 4x3 mais initialise un tableau de 4x1
Par ailleurs, comme l'indique l'aide, les tableaux dans les tableaux sont généralement à proscrire et amènent toujours une complexité d'emploi.
Pour mémoire, si l'on déclare :
Code : Tout sélectionner
Dim $tabA[3] = ["a1","a2","a3"]
Dim $tabB[3]= ["b1","b2","b3"]
Dim $tabC[3] = ["c1","c2","c3"]
Dim $tabD[3] = ["d1","d2","d3"]
Dim $Grille[4][3] = [[ $tabA], [$tabB], [$tabC], [$tabD]]
on n'obtient pas ce qu'on croit voir :
► Afficher le texte
Code : Tout sélectionner
Dim $tabA[3] = ["a1","a2","a3"]
Dim $tabB[3]= ["b1","b2","b3"]
Dim $tabC[3] = ["c1","c2","c3"]
Dim $tabD[3] = ["d1","d2","d3"]
Dim $Grille[4][3] = [[ $tabA], [$tabB], [$tabC], [$tabD]]
ConsoleWrite(_VarDump($Grille) & @LF)
Func _VarDump(ByRef $vVar, $sIndent = '')
Select
Case IsDllStruct($vVar)
Return 'Struct(' & DllStructGetSize($vVar) & ') @:' & Hex(DllStructGetPtr($vVar)) & ' = ' & __ShortHexDump(DllStructGetPtr($vVar, 1), DllStructGetSize($vVar))
Case IsArray($vVar)
Local $iSubscripts = UBound($vVar, 0)
Local $sDims = 'Array'
$iSubscripts -= 1
For $i = 0 To $iSubscripts
$sDims &= '[' & UBound($vVar, $i + 1) & ']'
Next
Return $sDims & @CRLF & _VarDumpArray($vVar, $sIndent)
Case IsBinary($vVar)
Return 'Binary(' & BinaryLen($vVar) & ') = ' & __ShortHexDump(DllStructGetPtr($vVar, 1), DllStructGetSize($vVar))
Case IsBool($vVar)
Return 'Boolean(' & $vVar & ')'
Case IsFloat($vVar)
Return 'Float(' & $vVar & ')'
Case IsHWnd($vVar)
Return 'HWnd(' & $vVar & ')'
Case IsInt($vVar)
Return 'Integer(' & $vVar & ')'
Case IsKeyword($vVar)
Return 'Keyword(' & $vVar & ')'
Case IsPtr($vVar)
Return 'Pointer(' & $vVar & ')'
Case IsObj($vVar)
Return 'Object(' & ObjName($vVar) & ')'
Case IsString($vVar)
Return 'String(' & StringLen($vVar) & ") '" & $vVar & "'"
Case Else
Return 'Unknown(' & $vVar & ')'
EndSelect
EndFunc
Func _VarDumpArray(ByRef $aArray, $sIndent = '')
Local $sDump
Local $sArrayFetch, $sArrayRead, $bDone
Local $iSubscripts = UBound($aArray, 0)
Local $aUBounds[$iSubscripts]
Local $aCounts[$iSubscripts]
$iSubscripts -= 1
For $i = 0 To $iSubscripts
$aUBounds[$i] = UBound($aArray, $i + 1) - 1
$aCounts[$i] = 0
Next
$sIndent &= @TAB
While 1
$bDone = True
$sArrayFetch = ''
For $i = 0 To $iSubscripts
$sArrayFetch &= '[' & $aCounts[$i] & ']'
If $aCounts[$i] < $aUBounds[$i] Then $bDone = False
Next
$sArrayRead = Execute('$aArray' & $sArrayFetch)
If @error Then
ExitLoop
Else
$sDump &= $sIndent & $sArrayFetch & ' => ' & _VarDump($sArrayRead, $sIndent)
If Not $bDone Then
$sDump &= @CRLF
Else
Return $sDump
EndIf
EndIf
For $i = $iSubscripts To 0 Step -1
$aCounts[$i] += 1
If $aCounts[$i] > $aUBounds[$i] Then
$aCounts[$i] = 0
Else
ExitLoop
EndIf
Next
WEnd
EndFunc
Func __ShortHexDump($ptr, $blen)
Local $tmpbin = DllStructCreate("byte[" & $blen & "]", $ptr)
If $blen <= 64 Then
Return('0x' & Hex(DllStructGetData($tmpbin, 1)))
Else
Return('0x' & Hex(BinaryMid(DllStructGetData($tmpbin, 1), 1, 32)) & ' ... ' & Hex(BinaryMid(DllStructGetData($tmpbin, 1), $blen - 31, 32)))
EndIf
EndFunc
Re: [..] Déclaration d'un tableau à 2 Dimensions (pb syntax
Posté : ven. 25 mars 2011 03:00
par matwachich
Pour plus de compréhension, je dirai
► Afficher le texte
Code : Tout sélectionner
Dim $tabA[3] = ["a1","a2","a3"]
Dim $tabB[3]= ["b1","b2","b3"]
Dim $tabC[3] = ["c1","c2","c3"]
Dim $tabD[3] = ["d1","d2","d3"]
Dim $Grille[4][3] = [[ $tabA], [$tabB], [$tabC], [$tabD]]
Dim $Grille2[4][3] = [["a1","a2","a3"], _
["b1","b2","b3"], _
["c1","c2","c3"], _
["d1","d2","d3"]]
ConsoleWrite(_VarDump($Grille) & @LF)
ConsoleWrite("===========================================" & @CRLF)
ConsoleWrite(_VarDump($Grille2) & @LF)
Func _VarDump(ByRef $vVar, $sIndent = '')
Select
Case IsDllStruct($vVar)
Return 'Struct(' & DllStructGetSize($vVar) & ') @:' & Hex(DllStructGetPtr($vVar)) & ' = ' & __ShortHexDump(DllStructGetPtr($vVar, 1), DllStructGetSize($vVar))
Case IsArray($vVar)
Local $iSubscripts = UBound($vVar, 0)
Local $sDims = 'Array'
$iSubscripts -= 1
For $i = 0 To $iSubscripts
$sDims &= '[' & UBound($vVar, $i + 1) & ']'
Next
Return $sDims & @CRLF & _VarDumpArray($vVar, $sIndent)
Case IsBinary($vVar)
Return 'Binary(' & BinaryLen($vVar) & ') = ' & __ShortHexDump(DllStructGetPtr($vVar, 1), DllStructGetSize($vVar))
Case IsBool($vVar)
Return 'Boolean(' & $vVar & ')'
Case IsFloat($vVar)
Return 'Float(' & $vVar & ')'
Case IsHWnd($vVar)
Return 'HWnd(' & $vVar & ')'
Case IsInt($vVar)
Return 'Integer(' & $vVar & ')'
Case IsKeyword($vVar)
Return 'Keyword(' & $vVar & ')'
Case IsPtr($vVar)
Return 'Pointer(' & $vVar & ')'
Case IsObj($vVar)
Return 'Object(' & ObjName($vVar) & ')'
Case IsString($vVar)
Return 'String(' & StringLen($vVar) & ") '" & $vVar & "'"
Case Else
Return 'Unknown(' & $vVar & ')'
EndSelect
EndFunc
Func _VarDumpArray(ByRef $aArray, $sIndent = '')
Local $sDump
Local $sArrayFetch, $sArrayRead, $bDone
Local $iSubscripts = UBound($aArray, 0)
Local $aUBounds[$iSubscripts]
Local $aCounts[$iSubscripts]
$iSubscripts -= 1
For $i = 0 To $iSubscripts
$aUBounds[$i] = UBound($aArray, $i + 1) - 1
$aCounts[$i] = 0
Next
$sIndent &= @TAB
While 1
$bDone = True
$sArrayFetch = ''
For $i = 0 To $iSubscripts
$sArrayFetch &= '[' & $aCounts[$i] & ']'
If $aCounts[$i] < $aUBounds[$i] Then $bDone = False
Next
$sArrayRead = Execute('$aArray' & $sArrayFetch)
If @error Then
ExitLoop
Else
$sDump &= $sIndent & $sArrayFetch & ' => ' & _VarDump($sArrayRead, $sIndent)
If Not $bDone Then
$sDump &= @CRLF
Else
Return $sDump
EndIf
EndIf
For $i = $iSubscripts To 0 Step -1
$aCounts[$i] += 1
If $aCounts[$i] > $aUBounds[$i] Then
$aCounts[$i] = 0
Else
ExitLoop
EndIf
Next
WEnd
EndFunc
Func __ShortHexDump($ptr, $blen)
Local $tmpbin = DllStructCreate("byte[" & $blen & "]", $ptr)
If $blen <= 64 Then
Return('0x' & Hex(DllStructGetData($tmpbin, 1)))
Else
Return('0x' & Hex(BinaryMid(DllStructGetData($tmpbin, 1), 1, 32)) & ' ... ' & Hex(BinaryMid(DllStructGetData($tmpbin, 1), $blen - 31, 32)))
EndIf
EndFunc
Re: [..] Déclaration d'un tableau à 2 Dimensions (pb syntax
Posté : ven. 25 mars 2011 09:01
par Iste
C'est la une "faiblesse" d'autoit, on ne peut pas coller directement de [] sur autre chose qu'une variable.
En claire, maFunc()[5] ne fonctionne pas, et dans le cadre d'un tableau de tableau, $var[0][5] ne fonctionnera pas non plus.
On est donc obligé de faire la différence entre les tableaux a plusieurs dimension et les tableaux de tableaux.
Re: [..] Déclaration d'un tableau à 2 Dimensions (pb syntax
Posté : ven. 25 mars 2011 18:03
par jchd
Oui, les tableaux AutoIt sont des "citoyens de première classe" et donc [n] n'est pas un opérateur "modificateur de type" comme dans d'autres langages. Du coup on ne peut certes pas écrire MaFonc($i)[3] mais on peut en revanche assigner une valeur (tableau) d'initialisation à une autre variable :
C'est pourquoi il est presque toujours nécessaire de passer un tableau "ByRef" à une fonction, pour éviter sa duplication et même si la fonction qui l'accepte en paramètre ne le modifie pas. C'est à peu près indolore pour de tout petits tableaux, mais rapidement gourmand dès qu'on travaille avec un encombrement moins négligeable ou lors d'appels fréquents.
Re: [..] Déclaration d'un tableau à 2 Dimensions (pb syntax
Posté : ven. 25 mars 2011 21:00
par Iste
Ho, merci beaucoup pour cette info
Je me demandais justement pourquoi array.au3 utilisé autant le byref, sans sans servir.
Mais c'est vrai que vu comme ca, c'est logique !