Parametre par defaut [Résolu]

Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- - Dernière réponse : Guillemouze
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- 10 oct. 2006 à 22:36
salut a tous, une petite question toute bete : est il possible de laisser la valeur par defaut d'un parametre en mettant une valeur aux suivants?
pour etre plus clair, j'ai une fonction
procedure MyProc(a: integer; b: integer 5; c: integer 7);

et je voudrais lui faire appel en precisant a et c, et en laissant b par defaut :

MyProc(1, , 9); // => MyProc(1, 5, 9);

bien sur je pourrai mettre la meme valeur que celle par defaut pour b, mais je veu que tous les appels soit mis a jour si je modifie une des valeurs par defaut.

PS : non, je prefererai eviter de mettre cette valeur dans une constante ;)

Merci.
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci
utilise des record :

m
type
  pProcStruct = ^TProcStruct;
  TProcStruct = record
     X,I : integer;
     B   : boolean;
     E   : Extended;
     S   : String;
  end;

const
  ProcDefaultA : TProcStruct = (0, 4, false, 1.0, '3');
  ProcDefaultB : TProcStruct = (8, 0, false, 3.1, '12');

procedure Proc(ProcStruct : pProcStruct);
begin
  with ProcStruct^ do begin
    X
    I
    ....
  end;
end;

procedure UtiliseProc;
var PS : TProcStruct;
begin
  PS   := ProcDefaultA;
  PS.X := 15;
  PS.B := true;
  Proc(@PS);

  PS   := ProcDefaultB;
  PS.S := '10';
  Proc(@PS);
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci
alors si le but est d'avoir une procedure qui peut traiter des parametres de types differents --> OVERLOAD!

car la on as String+integer+Boolean puis Integer+Boolean+Extended

donc deux procedures differente!

ce qui est egalement gerable avec les records!

MaProc(Struct : pStructTypeA); overload;
MaProc(Struct : pStructTypeB); overload;  

ce qui limite toujours le nombre d'overload a faire.

on pourrais meme condenser en faisant  :

type
  pStructTypeA = ^TStructTypeA;
  TStructTypeA = record
    ...

  end;
  pStructTypeB = ^TStructTypeB;
  TStructTypeB = record
    ...

  end;

const
  DefaultA : TStructTypeA = (...);
  DefaultB : TStructTypeB = (...);

procedure MaProc(pStructA : pStructTypeA; pStructB : pStructTypeB);
var
  SA : pStructTypeA;
  SB : pStructTypeB;
begin
  if Assigned(pStructA) then SA := pStructA else SA := @DefaultA;
  if Assigned(pStructB) then SB := pStructB else SB := @DefaultB;

  with SA^ do begin
  (...)
  end;
  with SB^ do begin
  (...)
  end;
end;

procedure UtiliseMaProc;
var
  PA : TStructTypeA;
  PB : TStructTypeB;
begin
  MaProc(nil, @PB);
  MaProc(@PA, @PB);
  MaProc(@PB,nil);
  MaProc(nil,nil);
end;

voila ... au final ... c'est toujours aussi souple et ça donne un bon exemple d'utilisation des pointeurs.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Salut,
Passe tes paramètres sous forme de variables.

Exemple:

var R : Integer;
      a : Integer;
      b : Integer = 5;
      c : Integer = 7;
      



procedure MaProc(var a,b,c : Integer);
begin
R := a+b+c;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
a := 1;
c := 9;
MaProc(a,b,c);
end;


Enfin... si j'ai bien compris ta question...  :)
Commenter la réponse de Caribensila
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
mwais, ca revient quasiement au meme que de mettre la valeur dans une constante!
j'aurai juste voulu savoir si il etait possible d'omettre un parametre ayant une valeur par defaut, et en precisant le(s) parametre(s) suivant(s).
Commenter la réponse de Guillemouze
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
il faudrait pour cela faire un test et changer de procédure selon le cas..

cantador
Commenter la réponse de cs_cantador
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
ok donc ca veut dire qu'il y a pas moyen de faire ce que je veu
Commenter la réponse de Guillemouze
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
Je me garderai bien de dire qu'il n'y a pas de solution mais..

cantador
Commenter la réponse de cs_cantador
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
0
Merci
Et en utilisant "overload" ?
exemple que j'ai utilisé dans mon composant "TdbpFindFiles" :

Procedure Execute; Overload;
Procedure Execute(Directory: string; MaxResultats: integer); Overload;

regarde un peu la doc la dessus j'ai rien en tete là ^^

Commenter la réponse de JulioDelphi
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
ouais le overload c'est bien, mais j'vais pas m'amuser a declarer 100 fois ma procedure en fonction de la combinaison des parametres que je veu utiliser. par exemple, si j'ai la procedure suivante :
maProc(x: integer; b: boolean=false; e:extended=1; s:string='3'; i: integer=4);

ca veut dire que, en fonction des parametres que je choisi de lui passer, il faut que je declare
maProc(x: integer; b: boolean=false; e:extended=1; s:string='3'; i: integer=4); //si j'ai (b) ou (b,e) ou (b,e,s) ou (b,e,s,i)
maProc(x: integer; i: integer=4; b: boolean=false; e:extended=1; s:string='3');  // si j'ai (i) ou (i,b) ou (i,b,e)
...

dans ce cas la je m'en sors plus si j'ai trop de parametres !!!
et puis si j'ai qu des int par exemple, la surcharge ne marche pas:
maProc(p1:integer=1; p2:integer=2; p3:integer=3);
la par exemple je peu pas mettre d'overload, alors que je voudrais pouvoir specifier seulement p1 et p3.
Commenter la réponse de Guillemouze
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Passe un String que tu décortiqueras.
Je ne vois que ça.   :)
Commenter la réponse de Caribensila
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
0
Merci
ouep et bien passe une string genre "int:3|boo:true|ext:2|str:ok" puis tu parse le char | pour trier le tout toi meme
je vois plus que ça et c'est pas trop crade =)

Commenter la réponse de JulioDelphi
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
0
Merci
*doublé par caribensila*
Commenter la réponse de JulioDelphi
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Salut Julio  :)))

...De toute façon, je pense que MaProcedure(a,,c) avec des Integer ne passera jamais.
Commenter la réponse de Caribensila
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
0
Merci
et avec ça, comment peut-il omettre volontairement de mettre un parametre dans sa procedure ?
donne un exemple concret avec "MaProc('abc',0,false)" ou "MaProc(2,true,2.5)"

Commenter la réponse de JulioDelphi
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
desolé pour le double post,

de plus, avec les record passé en pointeur, ce serat plus rapide.
au final on se retrouve avec une procedure plus simple a utiliser, une structure invariabe et ou l'on peu definir plusieur parametres prédefinits (presets) bref ... que du tout bon.

je pense que c'est la meilleure solution qu'on puisse prendre.

surtout que, par la suite, on peu enregistrer trés facilement ces structure dans des streams.

Commenter la réponse de f0xi
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Y'a peut-être une solution avec l'overload de Julio et qq variables à la fin des paramètres qui indiquent le nombre de paramètres zapés et leur emplacement...
J'sais pas si je suis bien clair, sur ce coup...  :)
Commenter la réponse de Caribensila
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
sinon y'a toujours moyen de faire ça avec un array of const (super pas propre du tout et lourd)

MaProc(CA : Array of Const; parametres);

MaProc([0,10,false,'bonjour'],...);

Commenter la réponse de f0xi
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
pas mal foxi, ca correspond pas mal a ce que je cherche :)
pour repondre a julio, c'est l'utilisation des const qui permet les valeurs par defaut.
par exemple :
procedure MaProc(a:integer=0; b: extended=1.5; c:string='str');
...
MaProc(); //1
MaProc(5,, 'toto'); //2
devient
type
TMaProcStruct = record
    a: integer;
    b: extended;
    c: string;
end;
const
MaProcDefaut : TMaProcStruct = (0, 1.5, 'str');

procedure MaProc(ps: TMaProcStruct);
...
MaProc(MaProcDefaut); //1
//2
ps := MaProcDefaut;
ps.a := 5;
ps.c := 'toto';
MaProc(ps);
 
Commenter la réponse de Guillemouze
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
merci pour la solution. ca fai tjrs un peu de code en plus qu'en omettant un parametre directement dans la fonction, mais c'est super propre et ca reste la proposition la plus proche de ma requete :) merfci pour les 2 exemples foxi ... et aux autres aussi bien sur qui se sont creusé le crane pour moi ;)
Commenter la réponse de Guillemouze

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.