Question [astuce]Tableau avec un indice de début > 0

Plus d'informations
il y a 17 ans 3 mois #3368 par Laurent Dardenne
Une petite astuce pour ceux et celles qui auraient besoin de créer un tel tableau. Sous PS tous les tableaux débute à l'indice zéro.
Pour construire un tableau débutant à un indice supérieure à zéro on doit faire appel aux méthodes de la classe System.Array :
[code:1]
$T=@(1)
$T.PsBase|Gm
$T=$null

$LowerBounds= @(5) #Déclare 1 dimension et indique le premier indice
$Lengths=@(10) # Déclare la longueur du tableau [5..15]
$Nz=[System.Array]::CreateInstance([Byte], $Lengths, $LowerBounds)
$nz[0]
#RAS
$Nz[0]=10
# erreur :Array assignment failed because index '0' was out of range.
20..29|% -begin {$I=5} -process{$Nz[$I]=$_;$I++}
$nz[5]
#20
$nz[15]
#RAS
[/code:1]
Notez que les accés aux indices hors du tableau $Nz ne provoquent pas d’erreur à la différence d’une affectation.

Construction d’un tableau avec un indice négatif

Sous PowerShell la construction de ce type de tableau n’est pas autorisée car les indices négatif signalent une position relative, par exemple -1 indique le dernier élément d’un tableau :
[code:1]
$T=@(\"Premier\",\"Deux\",\"Trois\",\"Quatre\"«»)
$T[-1]
#Quatre
$T[-2]
#Trois
$T[-($T.Length)] #$T[-4]
#Premier
[/code:1]
On peut ainsi récupérer les n derniers éléments d’un tableau :
[code:1]
$T[-1..-2]
#Quatre
#Trois
[/code:1]
Il reste possible de construire un tel tableau mais au prix d’une manipulation spécifique
[code:1]
$LowerBounds= @(-256) #Déclare 1 dimensions et indique le premier indice
$Lengths=@(256) # Déclare la longueur du tableau [-256..-1]
$Ng=[System.Array]::CreateInstance([Byte], $Lengths, $LowerBounds)
[/code:1]
Le type du tableau contient désormais une étoile indiquant un indice négatif ou un indice supérieure à zéro :
[code:1]
$Ng.GetType()
# IsPublic IsSerial Name BaseType
#

----
# True True Byte[*] System.Array
$Ng.GetLowerBound(0)
#-256
$Ng.GetUpperBound(0)
#-1
[/code:1]
Essayons d’accéder au premier élément du tableau puis de lui affecter une valeur :
[code:1]
$Ng[-1]
#RAS
$Ng[-1]=10
#Erreur : Array assignment failed because index '-1' was out of range.
[/code:1]
Pour ce type de tableau l’accés à un indice négatif génére une erreur, pour manipuler ce type de tableau sous PowerShell on doit utiliser les méthodes SetValue et GetValue de la classe System.Array :
[code:1]
$Ng.SetValue(10,-1)
#Exception calling \"SetValue\" with \"2\" argument(s): \"Impossible d'élargir du type source au type cible, car le type source n'est pas un type primitif ou la conversion ne peut pas être effectuée.\"
[/code:1]
Pour régler ce problème on doit caster la valeur dans le type précisé dans l’appel de CreateInstance :
[code:1]
$Ng.SetValue([Byte]10,-1)
$Ng.getValue(-1)
#10
[/code:1]
Pas très pratique mais bon à savoir si un assembly externe utilisait une telle construction.<br><br>Message édité par: Laurent Dardenne, à: 11/12/08 17:59

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3371 par Robin Lemesle

Pas très pratique mais bon à savoir si un assembly externe utilisait une telle construction.


Effectivement, au premier coup d'oeil on ne sait pas trop à quoi cela peut servir... Mais en cherchant bien on devrait trouver :P

Robin MVP PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3378 par Laurent Dardenne
C'est vrai, ce n'est parce que cela existe qu'il faut l'utiliser.
Soit je gardais l'info de mon coté soit je la communiquais et dans ce cas cela permet d'approndir .NET.

De mon coté je réalise quelques portage ...
;)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.091 secondes
Propulsé par Kunena