Question Retour de valeurs de Fonction (resolu)

Plus d'informations
il y a 17 ans 2 mois #3542 par clem
Bonjour à tous,

J'ai pu lire que les renvois de valeurs par une fonction ne fonctionnent pas de la meme manière qu'en c++ par exemple.
Dans le cas présent, la fonction recoit un tableu d'objets DateTime et les trie dans l'ordre croissant.

Ce que je n'arrive pas à faire, c'est de recuperer dans une variable, de type tableau DateTime, le retour de cette fonction.

[code:1]#tri les dates d'un tableau d'objet Date-time dans l'ordre croissant
function SortMyDate([datetime[]]$ptab)
{

$tab=$ptab
$tabtmp

#test si les objets du tableau sont de type DateTime
#Sinon, creation d'une date artificielle (01/01/01) et remplacement de l'objet
for($i=0 ; $i -lt $tab.length ; $i++)
{
if($tab[$i].GetType() -notlike \"system.datetime\"«»)
{
$tab[$i]= get-date -year 1 -Month 1 -Day 1
}
}

for ($i = 0 ; $i -lt $tab.Length - 1 ; $i++)
{
for ($j = $i + 1; $j -lt $tab.Length ; $j++)
{
if (($tab[$i].CompareTo($tab[$j]) -eq 1))
{
$tmp = $tab[$j]
$tab[$j] = $tab[$i]
$tab[$i] = $tmp
}
}
}
$tab

}

#creation d'un tableau d'objets DateTime
$LastCnxTab=$date_1,$date_2 ,$date_3

#recuperation d'un tableau trié
$LastCnx=SortMyDate($LastCnxTab)
[/code:1]

Au final, $LastCnx contient apparemment un objet supplementaire (car je vois que $LastCnx.length=4) mais ne contient pas d'objets date-time.

Je n'arrive pas à comprendre le fonctionnement des retours de fonction (et j'ai pas le bouquin sous la main !).

Merci de votre aide.<br><br>Message édité par: clem, à: 22/12/08 15:01

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

Plus d'informations
il y a 17 ans 2 mois #3543 par Laurent Dardenne
Salut,
clem écrit:

J'ai pu lire que les renvois de valeurs par une fonction ne fonctionnent pas de la meme manière qu'en c++ par exemple.

Déjà, si je peux me permettre, ne pas comparer PowerShell et le C++ car PS n'est pas un langage orienté objet, à la rigueur on peut comparer le C++ et le C#.

Tout retour se fait dans le pipeline et pas au travers d'une pile tel que BP sous Intel donc :
[code:1]
$UnObjet
[/code:1]
est équivalent à
[code:1]
return $UnObjet
[/code:1]
Si un bloc de code (Script,Fonction,filtre ScriptBlock) émet un résultat par défaut elle l'émet dans le pipe.
Dans ton cas
[code:1]
$tabtmp
[/code:1]
émet un objet, qui peut être null, d'où le count+1.
De plus le mode d'appel recopie l'objet en local, pas besoin de variable temporaire car ici on ne réaffecte que des adresses et pas le contenu, donc avec :
[code:1]
$tab=$ptab
[/code:1]
le code suivant est tjr vrai :
[code:1]
$tab.Equals($ptab)
[/code:1]
Il faut cloner l'objet pour avoir un double :
[code:1]
$tab=$ptab.Clone()
[/code:1]
voir sur msdn type valeur et type référence.
clem écrit:

Dans le cas présent, la fonction recoit un tableu d'objets DateTime et les trie dans l'ordre croissant.

On peut aussi utiliser la méthode statique Sort de la classe Array, par défaut tu manipules un tableau d'objet :
[code:1]
$D1=Get-date
$D2=$D1.AddDays(-1)
$D3=$D1.AddDays(1)

$LastCnxTab=$D1,$D2,$D3
[System.Array]::«»Sort($LastCnxTab)
#Exception calling \&quot;Sort\&quot; with \&quot;1\&quot; argument(s): \&quot;Impossible de comparer deux éléments dans le tableau.\&quot;
[/code:1]
On doit donc typer le tableau :
[code:1]
[DateTime[]] $LastCnxTab=$D1,$D2,$D3
[System.Array]::«»Sort($LastCnxTab)
[/code:1]
Une dernière remarque, si ton argument est typé ce n'est pas nécessaire de tester le type de chaque objet contenu dans le tableau puisque qu'il y a une conversion lors du passage d'argument :
[code:1]
#tableau d'objet
$LastCnxTab=$D1,$Null,$D3
$LastCnx=SortMyDate($LastCnxTab)
#ou
$LastCnxTab=$D1,\&quot;Str\&quot;,$D3
$LastCnx=SortMyDate($LastCnxTab)
[/code:1]
Si tu souhaites approfondir le pipeline sous PS tu peux consulter un tutoriel sur le sujet, voir ma signature en fin de post.

Je suis en train de finaliser un tutoriel sur les structures de données sous PS qui aborde plus ou moins dans le détail ces aspects là :

Chapitres

1 UNE HISTOIRE DE COLLECTIONS 3
2 LES TABLEAUX 3
2.1 LES MANIPULATIONS DE BASES 4
2.1.1 Création 4
2.1.2 Accés aux éléments 5
2.1.3 Tests à l’aide d’opérateur 6
2.1.4 Opérations diverses 7
2.1.5 Forcer la prise en compte d’un tableau dans le pipeline 9
2.1.6 Quelques détails 10
2.2 TABLEAU MULTIDIMENSIONNEL 11
2.3 TABLEAU DE TABLEAU 12
2.4 CONSTRUCTION D’UN TABLEAU AVEC UN INDICE DE DEBUT SUPERIEURE A ZERO 13
2.5 CONSTRUCTION D’UN TABLEAU AVEC UN INDICE NEGATIF 13
2.6 CREER UN TABLEAU EN LECTURE SEULE 15
3 LES CHAINES DE CARACTERES 16
3.1 LA CLASSE STRINGBUILDER 16
4 LA CLASSE ARRAYLIST 17
5 LES ENUMERATIONS 18
5.1 QUELQUES FONCTIONS UTILES 19
6 LES HASHTABLES 21
6.1 LES MANIPULATIONS DE BASES 21
6.1.1 Création 21
6.1.2 Accés aux éléments 22
6.1.3 Ajouter des éléments 22
6.2 LES MEMBRES DE LA CLASSE HASHTABLE 22
6.2.1 La classe DictionaryEntry 23
6.2.2 Méthodes de la classe Hashtable 23
6.2.3 La classe SortedList, une hashtable ordonnée 24
6.3 IMBRICATION DE STRUCTURE 24
6.3.1 Une étape supplémentaire 26
6.3.2 Construction dynamique d’une hashtable 28
7 A PROPOS DES TYPES VALEUR ET DES TYPES REFERENCE 29
7.1 MANIPULER UNE REFERENCE, LE RACCOURCI [REF] 30
8 CREATION DYNAMIQUE D’UN TYPE STRUCT A L’AIDE DE C# 32
9 COMPORTEMENT COMMUN AVEC DES TYPES DIFFERENTS 39
9.1 TRIER DES OBJETS 40
9.1.1 Comparer des objets 40
9.2 LA BOUCLE FOREACH 41
9.3 COLLECTION DANS UN OBJET COM 42
10 CONCLUSION 44
11 LIENS 44


Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 2 mois #3547 par clem
Réponse de clem sur le sujet Re:Retour de valeurs de Fonction

De plus le mode d'appel recopie l'objet en local, pas besoin de variable temporaire car ici on ne réaffecte que des adresses et pas le contenu, donc avec


Ok je comprend mieux.

[code:1][DateTime[]] $LastCnxTab=$D1,$D2,$D3

[System.Array]::«»Sort($LastCnxTab)[/code:1]

C'est beaucoup plus simple comme ca ! Merci.

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

Plus d'informations
il y a 17 ans 2 mois #3548 par Laurent Dardenne
Une précision, le type des éléments d'un tableau typé doit implémenter l'interface IComparable :
[code:1]
$LastCnxTab[0] -is [System.IComparable]
#True
$LastCnxTab.GetType().GetElementType().GetInterfaces()
# IsPublic IsSerial Name BaseType
#

----
# True False IComparable
# True False IFormattable
# True False IConvertible
# True False ISerializable
# True False IComparable`1
# True False IEquatable

#ou
[System.DateTime].GetInterfaces()
[/code:1]
Et mieux vaut utiliser l'opérateur is pour tester un type, puisqu'en cas d'erreur de saisie dans le nom du type il renvoi une erreur alors que notlike ne teste que l'égalité sur la chaîne :
[code:1]
$lastCnxTab[0] -is [System.Strig]
#Unable to find type [System.Strig]: make sure that the assembly containing this type is loaded.
$lastCnxTab[0] -notlike \&quot;System.Strig\&quot;
#True
$lastCnxTab[0] -like \&quot;System.Strig\&quot;
#False
[/code:1]

Tutoriels PowerShell

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

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