Parametre par defaut [Résolu]

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

19 réponses

Répondre au sujet
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 10 oct. 2006 à 22:02
+3
Utile
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;

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 10 oct. 2006 à 22:25
+3
Utile
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.

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 10 oct. 2006 à 02:15
0
Utile
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
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 10 oct. 2006 à 09:08
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 10 oct. 2006 à 19:56
0
Utile
il faudrait pour cela faire un test et changer de procédure selon le cas..

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

cantador
Commenter la réponse de cs_cantador
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 10 oct. 2006 à 21:12
0
Utile
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
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 10 oct. 2006 à 21:40
0
Utile
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
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 10 oct. 2006 à 21:48
0
Utile
Passe un String que tu décortiqueras.
Je ne vois que ça.   :)
Commenter la réponse de Caribensila
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 10 oct. 2006 à 21:51
0
Utile
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
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 10 oct. 2006 à 21:52
0
Utile
*doublé par caribensila*
Commenter la réponse de JulioDelphi
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 10 oct. 2006 à 21:54
0
Utile
Salut Julio  :)))

...De toute façon, je pense que MaProcedure(a,,c) avec des Integer ne passera jamais.
Commenter la réponse de Caribensila
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 10 oct. 2006 à 22:05
0
Utile
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 10 oct. 2006 à 22:09
0
Utile
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
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 10 oct. 2006 à 22:20
0
Utile
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 10 oct. 2006 à 22:27
0
Utile
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
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 10 oct. 2006 à 22:33
0
Utile
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
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 10 oct. 2006 à 22:36
0
Utile
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.