IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Fonction avec parametre Out


Sujet :

Delphi

  1. #1
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut Fonction avec parametre Out
    Bonjour j'ai pas compris comment ça marche les fonctions avec des paramètres out

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function TInterfacedObject.QueryInterface
      (const IID: TGUID; out Obj): HResult;
    const
      E_NOINTERFACE = $80004002;
    begin
      if GetInterface(IID, Obj) then 
        Result := 0 else Result := E_NOINTERFACE;
    end;
    il existe un parametre IN ???

    merci

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Un petit extrait de l'aide.

    Citation Envoyé par Aide de Delphi
    Un paramètre de sortie (out) est transmis par adresse comme un paramètre variable. Mais avec un paramètre out, la valeur initiale de la variable référencée n'est pas prise en compte par la routine à laquelle elle est transmise. Le paramètre out n'est utilisé qu'en sortie ; il indique simplement à la routine où placer la valeur en sortie sans spécifier de valeur en entrée.
    Citation Envoyé par Jcpan
    il existe un parametre IN ???
    Non, en y réfléchissant cela correspond à const.

    @+ Claudius

  3. #3
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut
    un exemple S.V.P me ferai beaucoup aider ainsi que les autres lecteurs
    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Exemple bateau d'utilisation de out qui me vient à l'esprit, c'est la définition d'une procédure qui va renseigner un record par exemple.
    Tu transmets à ta procédure ta variable record, mais celle-ci n'a pas besoin d'être initialisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure RenseignerRecord(out AEnreg: TMonEnreg);
    begin
      // ... Faire QQ chose.
    end;
     
     
    var
      MonEnreg: TMonEnreg;
    begin
      RenseignerRecord(MonEnreg);
      // ...
    end;
    C'est tout bête en somme.

    @+

  5. #5
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    humm Le paramètre out s'apparante au paramètre var?

    mais qu'elle est la subtilité?

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    humm Le paramètre out s'apparante au paramètre var?
    Oui tout deux sont passés par référence à la procédure.

    Citation Envoyé par Kaféine Voir le message
    mais qu'elle est la subtilité?
    Dans le cas de out la variable n'a pas besoin d'être initialisée, comme dans mon exemple.

    @+

  7. #7
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Ok Claudius,

    mais si je remplace out dans ton exemple par var ça fonctionne quand même...

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Oui tout à fait. A condition de ne pas examiner les valeurs du record d'entrée de jeu.

  9. #9
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Bien je crois que j'ai compris, heu non j'en suis sur

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    humm Le paramètre out s'apparante au paramètre var?

    mais qu'elle est la subtilité?
    out et var, meme combat, sauf que out t'empeche d'utiliser la valeur passée en parametre comme source de données.

    l'interet du out se situe principalement au fait que qu'il te permet de faire des fonctions avec plusieurs valeurs de retour, et aussi que tu peu retourner des valeurs non typées.
    l'exemple de query§Interface est interessant, il te retourne l'interface deamndée dans le parametre Obj, et te retourne aussi une information si ca s'est bien passé (-> 2 valeurs retournées, et 1 valeur de type indefini)

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Une citation de l'aide de Delphi 7, noter surtout le passage en gras :

    Citation Envoyé par Aide Delphi 7
    Un paramètre de sortie (out) est transmis par adresse comme un paramètre variable. Mais avec un paramètre out, la valeur initiale de la variable référencée n'est pas prise en compte par la routine à laquelle elle est transmise. Le paramètre out n'est utilisé qu'en sortie ; il indique simplement à la routine où placer la valeur en sortie sans spécifier de valeur en entrée.

    Soit, par exemple, l'en-tête de procédure suivant :

    procedure ExtraitInfos(out Info: UnTypeEnreg);

    Quand vous appelez ExtraitInfos, vous devez lui transmettre une variable de type UnTypeEnreg :

    var MonEnreg: UnTypeEnreg;
    ...
    ExtraitInfos(MonEnreg);

    Mais vous n'utilisez pas MonEnreg pour transmettre des données à la procédure ExtraitInfos ; MonEnreg sert simplement de conteneur où ExtraitInfos stocke les informations qu'elle génère. L'appel de ExtraitInfos libère immédiatement la mémoire utilisée par MonEnreg, avant que le contrôle du programme ne passe à la procédure.

    Les paramètres Out sont fréquemment utilisés avec les modèles d'objets distribués comme COM et CORBA. De plus, vous devez utiliser des paramètres out pour transmettre une variable non initialisée à une routine.

  12. #12
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Oui, regardons si j'ai compris.

    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
     
     TMonEnreg = record
       a: string;
     end;
     
    procedure DoIt(out UnTruc: TMonEnreg);
    begin
       UnTruc.a := 'zzz';
    end;
     
    procedure FaitLe(var UnTruc: TMonEnreg);
    begin
      if UnTruc.a = 'test' then
        UnTruc.a := 'ee'
      else
        UnTruc.a := 'zzz';
    end;
    en gros avec out je ne peux que affecter.
    avec var je peut teste la valeur initialise en plus d'affecter?

    le "if UnTruc.a = 'test' then" est impossible avec un paramètre out.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    Le "if UnTruc.a = 'test' then" est impossible avec un paramètre out.
    C'est cela. Ensuite, il y a un truc plus pernicieux : supposons que tu rajoutes une méthode "Add" à ton record
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     TMonEnreg = record
       a: string;
       procedure Add( const AMsg : string );
     end;
     
    procedure TMonEnreg.Add( const AMsg : string );
    begin
      a := a + AMsg;
    end;
    Quell différence y a-t-il entre les deux bouts de code suivants?
    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
     
    //Exemple 1
    procedure addWorld( var AArg : TMonEnreg );
    begin
      AArg.Add( 'World!' );
    end;
     
    procedure HelloWordl;
      var
        LMsg : TMonEnreg;
    begin
      LMsg.Add( 'Hello ' );
      addWorld( LMsg );
      ShowMessage( LMsg.a );
    end;
    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
     
    //Exemple 2
    procedure addWorld( out AArg : TMonEnreg );
    begin
      AArg.Add( 'World!' );
    end;
     
    procedure HelloWordl;
      var
        LMsg : TMonEnreg;
    begin
      LMsg.Add( 'Hello ' );
      addWorld( LMsg );
      ShowMessage( LMsg.a );
    end;
    Les deux compilent, mais dans le deuxième cas, vous aurez la surprise de ne voir s'afficher que 'Wordl!'.

    Il y a en fait une erreur de conception dans le deuxième exemple : la méthode "Add" a l'air d'être une méthode en écriture seule sur le type TMonEnreg, mais en fait, il faut qu'elle connaisse le contenu de TMonEnreg pour pouvoir agir. Elle nécessite donc en fait un accès en écriture et en lecture sur la variable à laquelle elle s'applique.

    Comme le dit Guymelef dans l'extrait de l'aide qu'il cite : "L'appel de ExtraitInfos libère immédiatement la mémoire utilisée par MonEnreg, avant que le contrôle du programme ne passe à la procédure."

    Dans le cas de l'exemple 2, le code compile quand même, mais sans prévenir, au moment de l'appel à la procédure "addWorld", Delphi réinitialise automatiquement le contenu du record passé en argument (il appelle FinalizeRecord avant de rentrer dans la fonction), et la variable passée en "out" perd son contenu.

    Dans cet exemple, on peut dire que c'est une erreur de conception, mais elle ne saute pas forcément aux yeux, et si ton code manipule des interfaces qui se tiennent les unes les autres ou des trucs plus tordus, tu peux te retrouver à désallouer des objets ou des données sans t'en rendre compte.

    Je n'ai pas dit "N'utilisez pas de paramètres out !", mais il faut être conscient de ce que cela implique lorsqu'on écrit des fonctions qui en prennent un.

    *LeGEC*

Discussions similaires

  1. [EasyPHP] Fonction avec parametre par référence et EasyPHP 1.8
    Par niaxon dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 01/02/2007, 10h59
  2. Fonction avec parametre variable
    Par Linaa dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2006, 12h41
  3. appel d'une fonction avec parametre.
    Par rollernox dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/10/2006, 23h07
  4. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  5. fonction avec parametre
    Par donny dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/06/2005, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo