Page 1 sur 1

[..] Redéfinir un tableau

Posté : mar. 05 janv. 2021 20:20
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.

Re: [..] Redéfinir un tableau

Posté : mar. 05 janv. 2021 20:37
par jchd
_ArrayAdd() sinon ReDim mais en effet sans pouvoir spécifier une valeur tableau.

Re: [..] Redéfinir un tableau

Posté : mar. 05 janv. 2021 22:00
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é ?

Re: [..] Redéfinir un tableau

Posté : mar. 05 janv. 2021 22:14
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

Re: [..] Redéfinir un tableau

Posté : mar. 05 janv. 2021 22:19
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:

Re: [..] Redéfinir un tableau

Posté : mer. 06 janv. 2021 00:15
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.

Re: [..] Redéfinir un tableau

Posté : mer. 06 janv. 2021 01:17
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

Re: [..] Redéfinir un tableau

Posté : mer. 06 janv. 2021 13:53
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

Re: [..] Redéfinir un tableau

Posté : mer. 06 janv. 2021 13:57
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. :-)

Re: [..] Redéfinir un tableau

Posté : mer. 06 janv. 2021 13:58
par jpascal
mikell, c'est ce que j'ai compris après avoir posté cette discussion. ;-)