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

C++Builder Discussion :

Passage de paramètre par référence


Sujet :

C++Builder

  1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 309
    Points
    1 309
    Par défaut Passage de paramètre par référence
    Bonjour a tous!

    Une petite question qui me turlupine, pour l'illustrer prenons un exemple bateau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Exchange( AnsiString &s1, AnsiString &s2 )
    {
      AnsiString tmp ;
      tmp = s1;
      s1  = s2;
      s2  = tmp;
    }
    Je veux maintenant échanger le contenu de 2 TEdits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
      Exchange( Edit1->Text, Edit2->Text ) ;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BitBtn2Click(TObject *Sender)
    {
      AnsiString tmp1 = Edit1->Text ;
      AnsiString tmp2 = Edit2->Text ;
      Exchange( tmp1, tmp2 ) ;
      Edit1->Text = tmp1 ;
      Edit2->Text = tmp2 ;
    }
    Pourquoi est ce que la première version ne marche pas, et qu'en passant par des variables temporaires (2ème version) ça fonctionne??
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut,
    je pense, mais je ne suis absolument pas sur, que c'est parce que derrière la propriété de ton composant il n'y as pas directement une variable, mais un accesseur qui va lui écrire ou lire dans une variable, et donc lorsque tu prend la référence, c'est celle de l'accesseur et non celle de la variable
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 309
    Points
    1 309
    Par défaut
    C'est ce que j'avais aussi conclu, que la propriété Text devait être un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __property AnsiString Text = { read=GetText, write=SetText};
    Ce qui empêche d'utiliser directement une référence sur cette propriété.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Ta première version de programme, elle utilise deux variable AnsiString, alors que la deuxième utilise les propriétés des deux conposants. Ce que je peux te proposer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void Exchange(TEdit *edt1, TEdit *edt2)
    {
      AnsiString tmp ;
      tmp = edt1 -> Text ;
      edt1 -> Text  = edt2 -> Text;
      edt2 -> Text  = tmp;
    }
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  5. #5
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Oui mais ta méthode ne peut plus servir que au TEdit alors que celle de sat83 peut servir pour tous ce qui est AnsiString
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  6. #6
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    je pense qu'il veux faire permuter le contenu des deux TEdit !
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  7. #7
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Oui, la en l'occurrence c'est le contenu de deux TEdit, mais le but de faire une méthode est tout de même de pouvoir la réutiliser pour le plus de cas possible, donc si ta méthode ne sert qu'une fois elle ne sert à rien
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  8. #8
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 309
    Points
    1 309
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    je pense qu'il veux faire permuter le contenu des deux TEdit !
    Dans mon cas l'exemple de permutation de chaîne de caractère était simplement fais pour illustrer le problème de passage de propriété par référence lors d'un appel à une fonction.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Ca fonctionne avec des données membres mais pas avec des propriétés.
    Notons qu'avec des propriétés, les alias sont bien modifiés (AnsiString& donne lieu à une copie d'objet).
    Par contre, le contenu de l'alias n'est pas répercuté sur la donnée cible !

    A plus !

  10. #10
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par pottiez Voir le message
    le but de faire une méthode est tout de même de pouvoir la réutiliser pour le plus de cas possible, donc si ta méthode ne sert qu'une fois elle ne sert à rien
    Pour satisfaire le besoin, je propose une implementation en "template" ...
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  11. #11
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Je n'irai pas jusque la, mais pourquoi pas
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  12. #12
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    C'est une solution plus générale au problème, celle-ci permettra de permuter des chaine de caractères, nombres et d'autres types pré ou définie par l'utilisateur.
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  13. #13
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Je le sais bien, mais bon après tout dépend de tes besoins
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  14. #14
    Invité
    Invité(e)
    Par défaut
    En fait, la propriété Text est définie, dans le header Controls.hpp, de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    __property AnsiString Text = {read=GetText, write=SetText};
    AnsiString __fastcall GetText();
    void __fastcall SetText(const AnsiString Value);
    Quand tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString &s=Edit1->Text;
    Le compilateur va en fait appeler Edit1->GetText(), qui renvoie une chaine sur laquelle s fait référence. Jusque là tout va bien...

    Mais changer ladite référence n'appellera pas pour autant Edit1->SetText(s) (ce que fait Edit1->Text=s

    Du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String &s=Edit1->Text;
    String &t=Edit2->Text;
    String tmp=s;
    s=t;
    t=tmp;
    }
    Ne fonctionne pas: à la sortie de la fonction, s,t, et tmp ont bien les bonnes valeurs, mais leur affectation n'appelle pas Edit1->SetText();

    En revanche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String &s=Edit1->Text;
    String &t=Edit2->Text;
    String tmp=s;
    Edit1->Text=t;
    Edit2->Text=tmp;
    }
    Fonctionnera...Et, comme
    crée en fait une copie de la chaine,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String &s=Label2->Caption;
    String &t=Label3->Caption;
    Label2->Caption=t;
    Label3->Caption=s;
    }
    Fonctionnera, contre toute attente !

    Enfin bon, une référence (ou un pointeur) sur une propriété, faut pas !

    Francois
    Dernière modification par Invité ; 15/05/2009 à 21h51.

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/08/2007, 17h34
  2. Passage de paramètres par référence
    Par margagn dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/05/2007, 23h08
  3. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  4. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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