Parametre par defaut

Résolu
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 9 oct. 2006 à 17:35
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre 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.

19 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 oct. 2006 à 22:02
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;

3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 oct. 2006 à 22:25
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.

3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 oct. 2006 à 02:15
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...  :)
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 oct. 2006 à 09:08
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).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 oct. 2006 à 19:56
il faudrait pour cela faire un test et changer de procédure selon le cas..

cantador
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 oct. 2006 à 20:28
ok donc ca veut dire qu'il y a pas moyen de faire ce que je veu
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 oct. 2006 à 20:48
Je me garderai bien de dire qu'il n'y a pas de solution mais..

cantador
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
10 oct. 2006 à 21:12
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à ^^

0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 oct. 2006 à 21:40
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.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 oct. 2006 à 21:48
Passe un String que tu décortiqueras.
Je ne vois que ça.   :)
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
10 oct. 2006 à 21:51
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 =)

0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
10 oct. 2006 à 21:52
*doublé par caribensila*
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 oct. 2006 à 21:54
Salut Julio  :)))

...De toute façon, je pense que MaProcedure(a,,c) avec des Integer ne passera jamais.
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
10 oct. 2006 à 22:05
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)"

0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 oct. 2006 à 22:09
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.

0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 oct. 2006 à 22:20
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...  :)
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 oct. 2006 à 22:27
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'],...);

0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 oct. 2006 à 22:33
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);
 
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 oct. 2006 à 22:36
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 ;)
0
Rejoignez-nous