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 :

"for_each" n'applique pas la fonction passée en paramètre?


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut "for_each" n'applique pas la fonction passée en paramètre?
    Salut!

    Ce code:
    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
    #include <iostream>
    #include <string>
    #include <algorithm>
     
    using namespace std;
     
    int main(void){
     
        string s1="abcdef";
        string s2="abcdef";
        transform(s1.begin(),s1.end(),s1.begin(),static_cast<int(*)(int)>(toupper));
        for_each(s2.begin(),s2.end(),static_cast<int(*)(int)>(toupper));
        cout<<"s1 : "<<s1<<endl<<"s2 : "<<s2<<endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    met bien "s1" en majuscule mais pas "s2"; pourtant "transform" et "for_each" devrait avoir un comportement similaire.
    Où est l'erreur?

    Merci.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Je pense que c'est parce que la fonction "toupper" ne modifier pas le char passé en paramètre.

    Donc ta fonction est bien appelée pour chaque élément de ta string, mais son retour n'est pas utilisé... donc ça ne sert à rien

    Pour corriger ça :

    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
    #include <iostream>
    #include <string>
    #include <algorithm>
     
    using namespace std;
     
    void mytoupper(char & c) {c = toupper(c);}
     
    int main(void)
    {
     
        string s1="abcdef";
        string s2="abcdef";
        transform(s1.begin(),s1.end(),s1.begin(),static_cast<int(*)(int)>(toupper));
        for_each(s2.begin(),s2.end(),mytoupper);
        cout<<"s1 : "<<s1<<endl<<"s2 : "<<s2<<endl;
        system("pause");
        return EXIT_SUCCESS;
    }

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est quoi l'intérêt du cast ?
    Boost ftw

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Comme ça en effet ça fonctionne.
    Mais pourquoi "transform" fait bien ce qui est attendu?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par loufoque
    C'est quoi l'intérêt du cast ?
    Car c'est compilé sous GCC:
    http://c.developpez.com/faq/cpp/?pag...olower_toupper
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par seriousme
    Comme ça en effet ça fonctionne.
    Mais pourquoi "transform" fait bien ce qui est attendu?
    Parce que transform applique le résultat de la fonction appelée au troisième paramètre (qui est s1.begin()).

    Voir http://www.cppreference.com/cppalgorithm/transform.html

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Alors "for_each" ne peut servir qu'avec des fonctions utilisant le passage par référence.
    Peut on utiliser "transform" partout où l'on peut utiliser "for_each"?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par seriousme
    Alors "for_each" ne peut servir qu'avec des fonctions utilisant le passage par référence.
    Peut on utiliser "transform" partout où l'on peut utiliser "for_each"?
    Je pense que c'est possible puisque transform fonctionne aussi avec des "iterator" et une "UnaryFunction" (comme for_each).

    Mais bon, ce n'est qu'une impression, cette question dépasse un peu mes compétences

  9. #9
    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 : 39
    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
    Citation Envoyé par seriousme
    Alors "for_each" ne peut servir qu'avec des fonctions utilisant le passage par référence.
    Non. for_each sert simplement à appliquer un foncteur à une collection d'objets, et on ne demande pas forcément à celui-ci de modifier son paramètre.

    Citation Envoyé par seriousme
    Peut on utiliser "transform" partout où l'on peut utiliser "for_each"?
    transform attend un retour du foncteur et l'inscrit dans la collection passée en 3ème paramètre. for_each non. Donc la réponse à la question est non. Si ces deux fonctions existent ce n'est pas pour couvrir des fonctionnalités équivalentes

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

Discussions similaires

  1. Imprimer le nom de fonction passée en paramètre
    Par aral510 dans le forum Linux
    Réponses: 5
    Dernier message: 27/06/2012, 15h57
  2. Réponses: 2
    Dernier message: 27/01/2010, 17h01
  3. passage de paramètre à une fonction passée en paramètre
    Par bambou dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/08/2007, 10h39

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