[..] Redéfinir un tableau

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[..] Redéfinir un tableau

#1

Message par jpascal »

Bonjour,

Veuillez m'excuser pour mon titre peu explicite.

La problématique est simple et la solution -j'imagine - l'est tout autant.

Il est possible d'initialiser un tableau avec des valeurs.
Exemple : Local $aArray = ['a', 'b']

Mais si je dois le redéfinir avec d'autres valeurs, je ne peux pas écrire : $aArray = ['c', 'd', 'e']

A mon niveau, je ne sais faire que :
Local $aArray = ['a', 'b']
_ArrayDisplay($aArray)

ReDim $aArray[3]
$aArray[0] = 'c'
$aArray[1] = 'd'
$aArray[2] = 'e'
_ArrayDisplay($aArray)
Ce n'est pas bien grave mais cela peut vite devenir lourd.

Voici le code que je cherche à optimiser :
Test(2)

Func Test($iVal)
   Local $aArray[0]

   Switch $iVal
      Case 1
         ReDim $aArray[2]
         $aArray[0] = 'a'
         $aArray[1] = 'b'

      Case 2
         ReDim $aArray[3]
         $aArray[0] = 'c'
         $aArray[1] = 'd'
         $aArray[2] = 'e'
   EndSwitch

   _ArrayDisplay($aArray)
EndFunc
Merci par avance pour vos conseils avisés.

Je vous souhaite par la même occasion tous mes vœux pour cette nouvelle année.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Redéfinir un tableau

#2

Message par jchd »

_ArrayAdd() sinon ReDim mais en effet sans pouvoir spécifier une valeur tableau.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Redéfinir un tableau

#3

Message par Tlem »

Bonsoir.
Et en partant d'un tableau plus grand que ce dont vous avez besoin pour le redimentionner seulement après l'avoir peuplé ?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Redéfinir un tableau

#4

Message par jpascal »

J'avais pensé définir un tableau plus grand mais je n'ai pas trouvé l'intérêt.

Je viens de pondre ce code.
Cela reste lourd et nécessite une fonction supplémentaire. :(
Test(3)

Func Test($iVal)
   Local $aArray[20]
   Local $sValues = ''

   Switch $iVal
      Case 2
         $sValues = 'ab'

      Case 3
         $sValues = 'cde'
   EndSwitch

   SetArray($aArray, $sValues)
   _ArrayDisplay($aArray)
EndFunc   ;==>Test

Func SetArray(ByRef $aArray, $sValues)
   For $i = 0 To StringLen($sValues) - 1
      $aArray[$i] = StringMid($sValues, $i + 1, 1)
   Next
   ReDim $aArray[StringLen($sValues)]
EndFunc   ;==>SetArray
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Redéfinir un tableau

#5

Message par jpascal »

Je viens d'essayer avec _ArrayAdd().

Je pensais ne pas pouvoir l'utiliser mais en fait je peux définir deux fois le tableau $aValue dans le code car c'est "dans un switch".
Test(3)

Func Test($iVal)
   Local $aArray[0], $aValue[0]

   Switch $iVal
      Case 2
         Local $aValue = ['a', 'b']

      Case 3
         Local $aValue = ['c', 'd', 'e']
   EndSwitch

   _ArrayAdd($aArray, $aValue)
   _ArrayDisplay($aArray)
EndFunc   ;==>Test
Les idées sont toujours plus claires :
- après le repas
- après avoir posé la question à la communauté francophone AutoIt. :wink:
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Redéfinir un tableau

#6

Message par Tlem »

Bonsoir.
Au départ, j’étais parti sur la base de votre code, afin d'éviter de trop fortes modifications.
Du coup, j'avais pensé à :

Code : Tout sélectionner

Test2(2)

Func Test2($iVal)
   Local $aArray[5]

   Switch $iVal
      Case 1
         $aArray[0] = 'a'
         $aArray[1] = 'b'
         ReDim $aArray[2]

      Case 2
         $aArray[0] = 'c'
         $aArray[1] = 'd'
         $aArray[2] = 'e'
         ReDim $aArray[3]
   EndSwitch

   _ArrayDisplay($aArray)
EndFunc
Mais bon, c'était vraiment pour aller au plus rapide dans votre approche.


Si vous souhaitez quelque chose de plus simple et de facilement évolutif, je partirais plutôt sur quelque chose de ce genre :

Code : Tout sélectionner

$Array = Test(1)
_ArrayDisplay($Array)

$Array = Test(2)
_ArrayDisplay($Array)

$Array = test(3)
_ArrayDisplay($Array)

Func Test($iVal)
	Local $sValues
	Switch $iVal
      Case 1
		$sValues = 'a'

      Case 2
		$sValues = 'ab'

      Case 3
		$sValues = 'abc'

	EndSwitch

  Return StringSplit($sValues, "", 2)
EndFunc

Edit :
Comme Tommy en parle ci-dessous, il est question d'une seule lettre.
Si vous devez rentrer plusieurs caractères, alors il vaut mieux faire cette mofification :

Code : Tout sélectionner

#include <array.au3>

$Array = Test(1)
_ArrayDisplay($Array)

$Array = Test(2)
_ArrayDisplay($Array)

$Array = test(3)
_ArrayDisplay($Array)

Func Test($iVal)
	Local $sValues
	Switch $iVal
      Case 1
		$sValues = 'alpha 1'

      Case 2
		$sValues = 'alpha 2|beta'

      Case 3
		$sValues = 'alpha 3|beta|gamma xxxx'

	EndSwitch

  Return StringSplit($sValues, "|", 2)
EndFunc
Comme je l'ai dit ce code est très facilement adaptable.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Redéfinir un tableau

#7

Message par TommyDDR »

Dans le cas précis où vous n'affectez qu'une lettre par case :
Local $array = StringSplit("abcde", "", 3)
Sinon, avec l'ancienne fonction _AsArray (maintenant supprimée de l'UDF ArrayEx.au3) :
Local $array = _AsArray("a", "b", "c", "d")

Func _AsArray($v_0 = 0, $v_1 = 0, $v_2 = 0, $v_3 = 0, $v_4 = 0, $v_5 = 0, $v_6 = 0, $v_7 = 0, $v_8 = 0, $v_9 = 0, $v_10 = 0, $v_11 = 0, $v_12 = 0, $v_13 = 0, $v_14 = 0, $v_15 = 0, $v_16 = 0, $v_17 = 0, $v_18 = 0, $v_19 = 0, $v_20 = 0)
   Local $av_Array[21] = [$v_0, $v_1, $v_2, $v_3, $v_4, $v_5, $v_6, $v_7, $v_8, $v_9, $v_10, $v_11, $v_12, $v_13, $v_14, $v_15, $v_16, $v_17, $v_18, $v_19, $v_20]
   ReDim $av_Array[@NumParams]
   Return $av_Array
EndFunc
Ou sinon, en passant par une variable temporaire :
Local $array = ["a", "b", "c"]
Local $temp = ["d", "e", "f", "g"]
$array = $temp
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Redéfinir un tableau

#8

Message par mikell »

Pourquoi juste ne pas carrément redéclarer l'array ?

#Include <Array.au3>
Test(3)
Test(2)

Func Test($iVal)
  Local $aArray[0]
   Switch $iVal
      Case 2
         Local $aArray = ['a', 'b']
      Case 3
         Local $aArray = ['c', 'd', 'e']
   EndSwitch
   _ArrayDisplay($aArray)
EndFunc   ;==>Test
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Redéfinir un tableau

#9

Message par jpascal »

Ce qu'il y a de bien avec la programmation c'est qu'il y a autant de solutions que de programmeurs.

Merci jchd, Tlem et TommyDDR pour vos propositions.

Et longue vie à ce forum d'utilité publique. :-)
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Redéfinir un tableau

#10

Message par jpascal »

mikell, c'est ce que j'ai compris après avoir posté cette discussion. ;-)
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre