Question [astuce]Tableau avec un indice de début > 0
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 3 mois #3368
par Laurent Dardenne
Tutoriels PowerShell
[astuce]Tableau avec un indice de début > 0 a été créé 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
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.
- Robin Lemesle
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 260
- Remerciements reçus 0
il y a 17 ans 3 mois #3371
par Robin Lemesle
Effectivement, au premier coup d'oeil on ne sait pas trop à quoi cela peut servir... Mais en cherchant bien on devrait trouver
Robin MVP PowerShell
Réponse de Robin Lemesle sur le sujet Re:[astuce]Tableau avec un indice de début > 0
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
Robin MVP PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 3 mois #3378
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[astuce]Tableau avec un indice de début > 0
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 ...
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.062 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- [astuce]Tableau avec un indice de début > 0