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++ Discussion :

Passer un char à fonction par référence constante ou non?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut Passer un char à fonction par référence constante ou non?
    Pourquoi peut on passer un char à une fonction g(char&) mais pas un char signed ou non signé et pourquoi cela est possible à une fonction g (const char&)?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    C'est pas clair ta (tes ?) question(s).

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Parce que "char" != "unsigned char"

    Donc si tu as une fonction
    Elle est différente d'une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void g(unsigned char&);
    Car même si tout est stocké sur 1 octet, le traitement de l'information n'est pas le même !

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si j'ai bien compris, la réponse à ta question serait que dans le cas d'une référence constante la conversion implicite entre types peut s'appliquer, mais pas dans le cas d'une référence non-constante. Ce qui s'explique par le fait que dans le cas où le compilo doit réaliser une conversion, c'est un objet temporaire qui est passé à la fonction et il ne peut donc pas être modifié dans celle-ci (ie. pris en référence non-constante).

    Même combat que ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void F1(std::string& s) {}
    void F2(const std::string& s) {}
     
    F1("hello"); // Pas ok
    F2("hello"); // Ok

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Loulou24
    Si j'ai bien compris, la réponse à ta question serait que dans le cas d'une référence constante la conversion implicite entre types peut s'appliquer, mais pas dans le cas d'une référence non-constante. Ce qui s'explique par le fait que dans le cas où le compilo doit réaliser une conversion, c'est un objet temporaire qui est passé à la fonction et il ne peut donc pas être modifié dans celle-ci (ie. pris en référence non-constante).

    Même combat que ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void F1(std::string& s) {}
    void F2(const std::string& s) {}
     
    F1("hello"); // Pas ok
    F2("hello"); // Ok
    Ok c un peu plus clair.Alors maintenant pourquoi le cas qui marche avec g(char&) est : char c; g(c) ? Pourquoi les signé et no signé ne passe t il pas avec g(char&) mais avec h(contst char&)?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ok c un peu plus clair.Alors maintenant pourquoi le cas qui marche avec g(char&) est : char c; g(c) ? Pourquoi les signé et no signé ne passe t il pas avec g(char&) mais avec h(contst char&)?
    En gros, t'as rien compris à ce que je t'ai dit en fait

    Est-ce que mon exemple avec std::string et const char* te parle ? Si oui, et bien remplace std::string par char, et const char* par unsigned char, et tu retombes précisément sur ton problème. C'est la même chose.
    Si tout ça ne te parle pas, ben ma foi désolé je vois pas comment l'expliquer autrement

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Moi je propose de voir concrêtement ton code, ainsi que ton problème.

    Tu écris ton problème en C++.
    Et on essayera de t'expliquer

    par exemple
    code ok
    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
     
    void g(char &a)
    {
    a='f';
    }
     
    int main(int argc, char *argv[])
    {
        char b('c');
        g(b);
        cout << b << endl; // tu verras 'f'
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    code pas ok, ne compile pas car "unsigned char" ne peut être passé en paramètre à la place de "char"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void g(char &a)
    {
    a='f';
    }
     
    int main(int argc, char *argv[])
    {
        unsigned char b('c');
        g(b);
        cout << b << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    code ok
    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
     
     
    void g(unsigned char &a)
    {
    a='f';
    }
     
    int main(int argc, char *argv[])
    {
        unsigned char b('c');
        g(b);
        cout << b << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Peut être une précision pour faciliter la compréhension : signed char, char et unsigned char constituent non pas 2, mais 3 types différents (contrairement par exemple à int ou signed int == int).

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    ok ça j'ai bien compris
    maquestion est :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    void f(char x){}
    void g(char& x_ref){}
    void h(const char& const_x_ref){}
     
     
    int main()
    {
     
        char c;
        unsigned char uc;
        signed char sc;
     
     
        f('a');
        f(49);
        f(3300);
        f(c);
        f(uc);
        f(sc);
      //  g('a');
      //  g(49);
      //  g(3300);
        g(c);
      //  g(uc);
      //  g(sc);
        h('a');
        h(49);
        h(3300);
        h(c);
        h(uc);
        h(sc);
    }
    Pourquoi tout passe en référence constante alors que ça passe pas en réf?
    En gros unsigned de char ne passe pas à char& mais passe à const char&!!! Pourquoi?

    [Balise [code] ajouté par netah_25 - Merci d'y penser a l'avenir]

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Comme l'a expliqué Loulou, pour passer de unsigned char à char, il faut faire une conversion, et donc créer un objet qui n'est plus unsigned char. Cet objet est temporaire, et n'apparaît nulle part explicitement dans le code.

    Il n'est pas autorisé de passer un objet temporaire à une référence non constante. En effet, s'il y a une référence non constante, c'est qu'on veut modifier l'objet qui est passé, et si celui si est temporaire, fugitif, le modifier ne sert à rien.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    ça y est , j'ai compris!!
    Enfin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retour de fonction par référence?
    Par ternel dans le forum Langage
    Réponses: 27
    Dernier message: 10/05/2014, 18h17
  2. Réponses: 6
    Dernier message: 28/12/2012, 18h56
  3. Passer des types primitifs par référence constante ?
    Par FluidBlow dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2010, 15h43
  4. [PowerShell] Comment passer une string "par référence" dans une fonction ?
    Par Plageman dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 11/11/2010, 15h01
  5. Fonction eval () et Constante chaine non terminée
    Par Stan62970 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 11/05/2007, 14h51

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