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 :

Erreur de compilation sur une fonction utilisant les flux


Sujet :

C++

  1. #1
    Membre éclairé Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Points : 659
    Points
    659
    Par défaut Erreur de compilation sur une fonction utilisant les flux
    Salut

    J'ai un problème au niveau de ma fonction.en fait je voudrais récupéré les mots d'un fichier.txt pour les mettre dans un tableau, les mots du fichier.txt sont disposés de cette manière
    MOT1
    MOT2
    MOT3
    voici mon code qui pose un problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void recueilleMot(ifstream fichier,  vector <string> &tabMot)
    {
    	string mot;
    	while (getline(fichier, mot))
    	{
    		tabMot.push_back(mot);
    	}
    }


    maintenant voici le prototype


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void recueilleMot(ifstream fichier, vector <string> &tabMot);
    quand je débogueur il me signal ces erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Erreur	1	error C2065: 'ifstream'*: identificateur non déclaré mesfonc.h	4	1	test
    Erreur	2	error C2146: erreur de syntaxe*: absence de ')' avant l'identificateur 'fichier'   mesfonc.h	4	1	test
    Erreur	3	error C2182: 'recueilleMot'*: utilisation non conforme du type 'void'	 mesfonc.h	4	1	test
    Erreur	4	error C2059: erreur de syntaxe*: ')'	mesfonc.h	4	1	test
    Erreur	5	error C2065: 'ifstream'*: identificateur non déclaré   mesfonc.h	4	1	test
    Erreur	6	error C2146: erreur de syntaxe*: absence de ')' avant l'identificateur 'fichier'	mesfonc.h	4	1	test
    Erreur	7	error C2182: 'recueilleMot'*: utilisation non conforme du type 'void'	mesfonc.h	4	1	test
    Erreur	8	error C2059: erreur de syntaxe*: ')'	mesfonc.h	4	1	test
    Erreur	9	error C2365: 'recueilleMot'*: redéfinition*; la précédente définition était 'variable de données'    ajoutedeux.cpp	13	1	test
    bon j'ai essayer d'autre solution mais toujours le même problème pouvez vous m'aider.
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    L'erreur est qu'il faut passer le flux par référence, les flux ne sont pas copiables.

    (Tu as dû oublier d'inclure fstream aussi.)

  3. #3
    Membre éclairé Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Points : 659
    Points
    659
    Par défaut
    il s’avère que je n'ai pas oublier de mettre le <fstream> et j'ai passé les flux par référence mais rien de concret le débogueur me signal qu'il y a toujours des erreurs
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour, peux-t-on avoir ces nouvelles erreurs ?

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    si tu n'as pas utilisé la directive using namespace std; ( que je ne recommande personnellement absolument pas d'utiliser, et dont je t'interdirai l'usage dans les fichiers d'en-tête ), il faut garder en mémoire que tout ce qui vient de la bibliothèque standard se trouve dans l'espace de noms std.

    Cela signifie que, pour pouvoir utiliser la classe ifstream, il faut utiliser son "nom complet" (on parle de "nom pleinement qualifié"), à savoir std::ifstream.

    Il en ira de même pour vector, pour string et pour getline, bref, pour tout ce qui nécessite (on va faire simple ) l'inclusion d'un fichier d'en-tête sans extension.

    Si tu es sur d'avoir inclus les fichiers d'en-tête requis (j'en dresserai la liste tout de suite ) dans ton propre fichier d'en-tête (parce que c'est nécessaire aussi pour le prototype), tu devrais au final te retrouver avec quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void recueilleMot(std::ifstream fichier, std::vector <std::string> &tabMot);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void recueilleMot(std::ifstream fichier,  std::vector <std::string> &tabMot)
    {
    	std::string mot;
    	while (std::getline(fichier, mot))
    	{
    		tabMot.push_back(mot);
    	}
    }
    Nota: Pour que ton code puisse compiler, il faudra penser à inclure les fichiers d'en-tête
    1. <string> (pour... std::string)
    2. <vector> (pour std::vector) et
    3. <fstream> (pour std::ifstream
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre éclairé Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Points : 659
    Points
    659
    Par défaut
    super sa passe .
    ok merci pour le conseil a propos du fichier d’entête using namespace std;
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  7. #7
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Je plusoi koala sur ce sujet.

    N'utilise pas using namespace std;. C'est dangereux (que ce passe t il si tu créer une classe string et que tu fait un using namespace std ou n'importe quel classe du standard)

    Une solution que je trouve très élégante est le typedef.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::string String
    typedef std::ifstream IFStream
    Le mieux est de mettre ca dans une entête que tu inclus en premier dans le projet et dans une entête précompiler. et Hop plus de souci, et tu peux facilement faire du #define #if defined etc.. pour choisir quel classe tu désire a la compilation comme par exemple passer de std a boost facilement avec une variable de compile.
    Homer J. Simpson


  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Et encore, je ne suis vraiment pas fan de cette solution...

    Autant je n'ai pas grand chose contre le fait de créer un alias d'espace de noms quand les noms pleinement qualifiés deviennent vraiment trop long (les bibliothèques de boost, par exemple), autant je suis vraiment réfractaire à tout ce qui permettrait d'utiliser le nom de manière non pleinement qualifiée.

    La raison est, sommes toutes, bien simple:

    Si, d'une manière ou d'une autre, tu t'arranges pour ne pas avoir à utiliser le nom pleinement qualifié, tu peux avoir, à la lecture du code, l'impression que tu as la possibilité d'aller modifier le type manipulé, alors que si tu garde le nom pleinement qualifié (fusse-t-il simplifié par un alias d'espace de noms), tu gardes une information primordiale à la lecture du code: ce type provient d'ailleurs et tu dois partir du principe qu'il fait ce qu'on attend de lui.

    En plus, le typedef provoque, finalement, exactement le même problème que la directive using: Si tu veux, à un moment particulier, créer ta propre classe String, le compilateur va t'envoyer paitre (et sans doute d'ailleurs plus violemment qu'avec la directive using )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    En plus, le typedef provoque, finalement, exactement le même problème que la directive using: Si tu veux, à un moment particulier, créer ta propre classe String, le compilateur va t'envoyer paitre (et sans doute d'ailleurs plus violemment qu'avec la directive using )
    Héhé, en fait, je ne l'utilise jamais hors namespace
    Exemple, j'ai un moteur perso ou je définis mes types de base (int String, Flux, etc...) le tout est dans un namespace CEL. Donc, CEL::String n'est pas la même chose que std::string et si la fonction attends un CEL::String elle n'acceptera pas un std::string. Jusque la j'ai jamais eu de problème avec un projet de 5 librairie différente utilisant le même header precompiler. Après cela répond a mes besoins :p
    Homer J. Simpson


  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Jusqu'au jour où, le jeu d'inclusion en cascade aidant, tu auras, dans un fichier d'implémentation de CEL, inclut le fichier d'en-tête contenant le typedef sur std::string et ta déclaration perso de CEL::String.

    Dans le meilleur des cas, ce sera CEL::String qui sera automatiquement sélectionné (alors que tu voulais peut etre utiliser std::string ) du fait que tu te trouve dans CEL, dans le pire, le compilateur se plaindra du conflit
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Justement, je veux que le compilateur crie au loup lorsque l'on utilise autre chose que la classe que j'aurais définit, je ne laisse pas le choix de certains type pour assurer leur fonctionnement. Bon actuellement, CEL::String est un std::string donc pas de problème... mais std::string à des défauts et sur certaines plateforme pose problème donc j'ai changé le typedef à la compile avec une autre classe respectant la logique de la programmation par règle. Exemple, j'avais du changer tr1 en boost et 0 souci, les 5 libraires fonctionnait en moins d'une heure avec une autre classe.
    Homer J. Simpson


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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/09/2010, 17h05
  2. Réponses: 7
    Dernier message: 12/11/2006, 12h49
  3. Erreur "type incompatible" sur une fonction
    Par Ricardo_Tubbs dans le forum ASP
    Réponses: 1
    Dernier message: 19/07/2006, 11h59
  4. Erreur de compilation sur une librairie en mode debug
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/05/2006, 16h32
  5. erreur PLS-00103 sur une fonction
    Par atruong dans le forum Oracle
    Réponses: 2
    Dernier message: 28/04/2006, 13h49

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