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

Langage C++ Discussion :

template, itérateurs et argument par défaut de fonction


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut template, itérateurs et argument par défaut de fonction
    À l'exercice 8-6 de Accelerated C++, je dois commencer par changer l'implémentation de xref.cc en important un nouveau fichier "split.h" (qui est donné). Le programme renvoie tous les mots donnés en entrée et indique à quelles lignes il les a rencontrés (./xref < xref.cc).

    La compilation échoue à la ligne indiquée en commentaire (en capitales). Je ne vous passe pas le message d'erreurs, il est assez inbuvable.

    Fichier contenant le main() (xref.cc):

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <map>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <iterator>
     
    #include "split.h"
     
    using std::cin;            using std::cout;
    using std::endl;           using std::getline;
    using std::istream;        using std::string;
    using std::vector;         using std::map;
    using std::back_inserter;
     
    // find all the lines that refer to each word in the input
    map<string, vector<int> >
    xref(istream& in,
        void find_words(const string&, vector<string>::iterator) = split) // LIGNE CHANGÉE 
    {
    	string line;
    	int line_number = 0;
    	map<string, vector<int> > ret;
     
    	// read the next line
    	while (getline(in, line)) {
    		++line_number;
     
    		vector<string> words; // LIGNE CHANGÉE
    		// break the input line into words
    		find_words(line, back_inserter(words));  // LIGNE CHANGÉE
    							// ÇA PLANTE ICI!
     
    		// remember that each word occurs on the current line
    		for (vector<string>::const_iterator it = words.begin();
    		     it != words.end(); ++it)
    			ret[*it].push_back(line_number);
    	}
    	return ret;
    }
     
    int main()
    {
    	// call `xref' using `split' by default
    	map<string, vector<int> > ret = xref(cin);
     
    	// write the results
    	for (map<string, vector<int> >::const_iterator it = ret.begin();
    	     it != ret.end(); ++it) {
    		// write the word
    		cout << it->first << " occurs on line(s): ";
     
    		// followed by one or more line numbers
    		vector<int>::const_iterator line_it = it->second.begin();
     
    		cout << *line_it;	// write the first line number
     
    		++line_it;
    		// write the rest of the line numbers, if any
    		while (line_it != it->second.end()) {
    			cout << ", " << *line_it;
    			++line_it;
    		}
    		// write a new line to separate each word from the next
    		cout << endl;
    	}
     
    	return 0;
    }
    Fichier split.h importé:

    Code c++ : 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
    34
    35
    36
    37
    38
    39
    40
    41
    #include <algorithm>
    #include <cctype>
    #include <string>
     
    using std::find_if;
    using std::string;
     
    #ifndef _MSC_VER
    using std::isspace;
    #endif
     
    inline bool space(char c)
    {
            return isspace(c);
    }
     
    inline bool not_space(char c)
    {
            return !isspace(c);
    }
     
    template <class Out>
    void split(const string& str, Out os) {
     
    	typedef string::const_iterator iter;
     
    	iter i = str.begin();
    	while (i != str.end()) {
    		// ignore leading blanks
    		i = find_if(i, str.end(), not_space);
     
    		// find end of next word
    		iter j = find_if(i, str.end(), space);
     
    		// copy the characters in `[i,' `j)'
    		if (i != str.end())
    			*os++ = string(i, j);
     
    		i = j;
    	}
    }

    Y-a-til un problème au niveau de la déclaration de la fonction find_words?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut
    Ça marche en remplaçant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find_words(line, back_inserter(words));
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    split(line, back_inserter(words));
    ... et en supprimant le 2ème argument de la fonction xref mais ça ne me dit pas qu'elle était mon erreur.

  3. #3
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Il me semble que dans la définition de xref, find_words représente un simple 'argument formel' pour une fonction (sa présence dans la liste des arguments indique qu'on peut fournir en argument à xref une fonction renvoyant un vecteur de strings et prenant comme argument un string constant et que dans le code de xref cette fonction sera représentée par find_words) : ce n'est pas plus une certaine fonction globale que ne le serait a dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int f(int a)
    {
    return a;
    }
    Après avoir défini une telle fonction f, tu n'écrirais pas ailleurs de but en blanc :
    a =5
    De même après avoir défini xref tu ne vas pas appeler une inexistante fonction globale find_words
    Voir dans le livre les explications page 127 avec un exemple d'appel de xref.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut
    Salut ptyxs.

    La façon dont j'ai écrit find_words n'est pas très différente de celle des auteurs du livre (p 125). On pourrait assimiler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void find_words(const string&, vector<string>::iterator)
    ... à une déclaration de fonction.

  5. #5
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Désolé j'avais lu trop vite. D'après ce que tu dis dans un autre fil je crois que tu as trouvé ce qui n'allait pas.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 128
    Points : 122
    Points
    122
    Par défaut
    Non, non. Ce topic vit toujours.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/09/2013, 16h40
  2. Problème avec argument par défaut de templates
    Par benlaug dans le forum Langage
    Réponses: 3
    Dernier message: 08/01/2012, 09h59
  3. fonction sans arguments par défaut
    Par Doksuri dans le forum Langage
    Réponses: 1
    Dernier message: 15/09/2010, 17h44
  4. Valeur par défaut à une fonction
    Par ploxien dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2007, 09h06
  5. Chaine littérale en tant qu'argument par défaut
    Par Daemonovae dans le forum C++
    Réponses: 3
    Dernier message: 24/11/2006, 20h27

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