Salut tout le monde,
J'ai une procédure qui renvoi trois valeurs en sortie, et je voudrais que l'utilisateur ne soit pas obligé a chaque fois de récupèrer les trois valeurs, comment puis je rendre un des paramètres de sortie facultatif ?
Salut tout le monde,
J'ai une procédure qui renvoi trois valeurs en sortie, et je voudrais que l'utilisateur ne soit pas obligé a chaque fois de récupèrer les trois valeurs, comment puis je rendre un des paramètres de sortie facultatif ?
Une solution est l'overload:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure MaFonction( var v1, v2, v3: Integer ); overload; begin // C'est la fonction principale de traitement end; procedure MaFonction( var v1, v2: Integer ); overload; var vDummy: Integer; // elle sert à rien begin MaFonction( v1, v2, vDumy ); end;
Oui c 'est la solution que j'ai utilisé, mais je pensais qu'il y avait peut etre un moyen "plus simple"
Salut
L'autre solution est :
Par contre, tu n'as pas de moyen de savoir si la fonction a été appelée sans les paramêtres ou si, par hasard, les paramêtres v2 et v3 ont la même valeur que celle par défaut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part procedure MaFonction( var v1: Integer; v2: Integer = 0; v3: Integer = 0);
PS: en plus je ne suis pas sûr que ça marche avec des paramêtres en VAR
Oui y'a plus simple : les valeurs... par défaut!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure MaFonction(v1, v2: Integer; v3: Integer = 0); begin //Ici les variables v1 et v2 sont obligatoires. //Si l'utilisateur ne précise rien, v3 va être initialisée à 0 end;
[EDIT]
rbh a été plus rapide
Si l'objectif du programmeur est de savoir si un paramètre a été initialisé ou non, effectivement, c'est la surcharge (overload) qui devrait être utilisée.Envoyé par rbh
C'est certain que ça ne fonctionne pas avec des paramètre passés par référence parce que justement si l'utilisateur ne précise pas de paramètre, il ne passe pas de référence! Et si on veut vraiment avoir un paramètre par référence, je ne vois pas pour quelle raison il pourrait être optionel.Envoyé par rbh
Pour des paramètres var, c'est en effet non seulement impossible (d'utiliser des par défaut) mais aussi abérant !
En revanche, des paramètres de sorties s'utilisent avec out. Et là, bien qu'il soit toujours impossible d'utiliser des par défaut, c'est moins bizarre. Dans ce cas, la solution de l'overload est la meilleure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure MaProc(out Out1, Out2, Out3 : integer); overload; begin // Code la procédure end; procedure MaProc(out Out1, Out2 : integer); overload; var Out3 : integer; begin MaProc(Out1, Out2, Out3); end;
Bonjour à tous,
En effectuant une recherche sur le site, je suis tombé par hasard sur cette question. Même si la réponse est (très) tardive, j'espère qu'elle pourra servir à d'autres personnes.
Le plus élégant (je crois) serait d'écrire la procédure comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 procedure MaProcedure(Out1, Out2, Out3: PInteger); begin {...} if Out1 <> nil then Out1^ := {...} if Out2 <> nil then Out2^ := {...} if Out3 <> nil then Out3^ := {...} end; procedure Appel; var I1, I2, I3: Integer; begin //par exemple MaProcedure(@I1, nil, nil); //ou MaProcedure(@I1, @I2, nil); //ou MaProcedure(@I1, @I2, @I3); //et même, pourquoi pas, MaProcedure(nil, nil, @I3); end;
Même si je ne suis pas un partisan de l'exhumation de Post
On peut pousser ta proposition qui très inspiré du C++ ( PInteger étant plus proche du Integer* que le var/out)
Je le fais aussi de temps en temps pour omettre un paramètre de Sortie au lieu de passer par une variable Dummy
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 procedure MaProcedure(Out1: PInteger = nil; Out2: PInteger = nil; Out3: PInteger = nil); begin {...} if Out1 <> nil then Out1^ := {...} if Out2 <> nil then Out2^ := {...} if Out3 <> nil then Out3^ := {...} end; procedure Appel; var I1, I2, I3: Integer; begin //par exemple MaProcedure(@I1); // Encore mieux ! //ou MaProcedure(@I1, @I2); // Encore mieux ! //ou MaProcedure(@I1, @I2, @I3); //et même, pourquoi pas, MaProcedure(nil, nil, @I3); end;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager