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

Visual C++ Discussion :

Erreurs invraissemblables de la part de Visual C++


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut Erreurs invraissemblables de la part de Visual C++
    Bonjour à tous, je pense que quasiment tout est dit dans le titre. Voilà j'ai de gros problèmes pour la génération (clique droit sur mon projet et générer) de mon programme en C++ avec l'IDE Visual C++.
    Voici par exemple une déclaration de .h dans lequel il me sort des erreurs complètement absurdes:
    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
     
    #include "stdafx.h"
     
    using namespace std;
     
    #ifndef GRAPHES_H_
    #define GRAPHES_H_
     
    class Graphes {
    public:
        string nom_graphe;
        vector<Sommets*> sommets;
        vector<Aretes*> aretes;
        static int num;
    //.......................................................
        Graphes();
        Graphes(string,vector<Sommets*>,vector<Aretes*>);
        string toString();
        void createSommet();
        void createArete(Sommets*,Sommets*);
        void addArete(Aretes);
        void addArete(Aretes*,Sommets*,Sommets*);
        void addSommet(Sommets*,Aretes*);
        void addSommet(Sommets*);
        Aretes* deleteArete(Aretes*);
        Sommets* deleteSommet(Sommets*);
        virtual ~Graphes();
    protected:
        string listeSommets();
        string listeAretes();
    private:
        int rechercheSommet(Sommets*);
        int rechercheArete(Aretes*);
    };
     
    #endif /* GRAPHES_H_ */
    et dans mon fichier stdafx.h comme il est conseillé par l'IDE il y a tous mes includes dont j'ai besoin:
    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
     
    // stdafx.h : fichier Include pour les fichiers Include système standard,
    // ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment,
    // et sont rarement modifiés
    //
     
    #pragma once
     
    #include "targetver.h"
     
    #include <iostream>
    #include <string>
    #include <vector>
     
    #include "Graphes.h"
    #include "Aretes.h"
    #include "Sommets.h"
    #include "Molecules.h"
    #include "Liaisons.h"
    #include "Atomes.h"
     
     
    // TODO: faites référence ici aux en-têtes supplémentaires nécessaires au programme
    Voici un florilège des erreurs qu'il me sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.h(17): error C2065: 'Sommets' : identificateur non déclaré
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.h(17): error C2059: erreur de syntaxe : '>'
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.h(18): error C2065: 'Aretes' : identificateur non déclaré
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.h(18): error C2059: erreur de syntaxe : '>'
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.h(22): error C2065: 'Sommets' : identificateur non déclaré
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.h(22): error C2059: erreur de syntaxe : '>'
    J'ai eu beau regardé des dizaines de fois (et cela fais plusieurs semaines), je n'ai pas vu une once des erreurs qu'il m’annonçait. Pourriez-vous me dire d'où cela pourrait venir?
    Pour information supplémentaire je développe sous Windows 8 avec Visual Studio Premium 2012.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que tu as une erreur dans l'ordre de tes inclusions.

    dans le stdafx.h, graph.h est inclus en 1er puis ensuite aretes.h, sommet.h etc.

    Or graph.h a besoin de savoir ce qu'est un sommet ou une arête (dans le prototype du constructeur par exemple.

    Il faudrait mettre aretes.h et sommet.h avant graph.h dans ton stdafx.h

    et même mieux, inclure aretes.h et sommet.h dans graph.h directement de façon à rendre graph.h auto-suffisant.

    Un développeur qui utilise graph.h n'a pas besoin de savoir qu'il faut inclure avant arete.h et sommet.h ni dans quel ordre.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Oui mais justement je me suis servis du stdafx.h en croyant que l'ordre ne comptait pas (comme vous le dîtes si justement). Car en réalité mes trois classes (Graphes,Aretes,et Sommets) s'utilisent mutuellement. C'est à dire que Graphes (comme vous pouvez le voir dans le code que j'ai fournit) a une collection de Sommets et d'Aretes. Sommets possède lui le graphe dans lequel il est plus une collection d'Aretes. Et enfin Aretes, possède le graphe dans lequel il est plus les deux sommets qui la constituent.
    J'avais essayé au départ d'inclure de façon normale mes .h mais Visual Studio me disais évidemment que par exemple Graphes s'incluait lui même. C'est pour cela que je suis passé par l'inclusion de mes .h dans stdafx.h (problème du serpent qui mord sa queue).
    Que pouvez-vous me conseillez pour me sortir de ce mauvais pas?
    Merci quand même pour la réponse qui résout certaines erreurs mais évidemment en font apparaître d'autres ailleurs, puisque mes classes s'utilisent mutuellement.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tout d'abord, tous tes include doivent être protégés, tu l'as fait avec Graph.h, vérifie sur les autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef GRAPHES_H_
    #define GRAPHES_H_
     
    ...
     
    #endif //#ifndef GRAPHES_H_
    Ensuite, dans ton cas, tu as un problème de définition "récursives" (je ne sais pas si c'est le bon mot) et il faut aider le compilateur avec une déclaration anticipée en disant au compilateur que la classe que tu utilises est connue mais sera définie plus tard.

    Ainsi dans ton code, cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    class Sommets;  // déclaration anticipée
    class Aretes;  // déclaration anticipée
     
    class Graphes {
    public:
        string nom_graphe;
        vector<Sommets*> sommets;
        vector<Aretes*> aretes;
    ...
    };
    Cela ne fonctionne que parce que tu n'as pas besoin de connaitre la classe Aretes (ou Sommet) totalement vu que tu n'utilises que des pointeurs (ou des références ce qui est presque pareil vu du compilateur). Quelle que soit la classe, un pointeur fait 4 octets (ou 2 ou 8 suivant le modèle de compilation). Tu indiques juste qu'elle existe et qu'elle sera définie plus tard.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Alors j'ai vérifié et fais ce que tu m'as dit. On va dire que ça résout une grande partie du problème que j'ai (et merci pour cette aide si rapide). Mais Visual Studio me donne toujours des erreurs à s'arracher les cheveux.
    Quand je génère mon projet il n'y a plus les erreurs dont j'ai parlé (c'est déjà ça ) mais il me donne les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.cpp(8): warning C4627: '#include "Graphes.h"' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
    1>          Ajoutez la directive à 'stdafx.h' ou régénérez l'en-tête précompilé
    Alors qu'il faut l'inclusion Graphes.h dans Graphes.cpp (warning complètement absurde). Et j'ai rajouté l'inclusion stdafx.h ça n'a rien fait de plus (j'ai nettoyé stdafx.h de tous les includes que j'avais fait). Enfin bref...
    Mais pire encore lors de la génération Visual Studio pète littéralement les plons lorsqu'il regarde mes .cpp. Un petit florilège d'erreurs va certainement vous convaincre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.cpp(13): error C2653: 'Graphes' : n'est pas un nom de classe ni d'espace de noms
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.cpp(13): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.cpp(14): error C2065: 'num' : identificateur non déclaré
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.cpp(15): error C2065: 'nom_graphe' : identificateur non déclaré
    1>c:\users\duplouy\documents\visual studio 2012\projects\lotsc\graphes.cpp(15): error C2065: 'num' : identificateur non déclaré
    Alors que pourtant j'ai bien fait mes includes pour qu'il prenne en compte ma classe et ses attributs:
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    #include "Graphes.h"
    #include "Sommets.h"
    #include "Aretes.h"
    #include "stdafx.h"
     
    Graphes::Graphes() {
        num++;
        nom_graphe="G"+num;
    }
     
    Graphes::Graphes(string p_nom,vector<Sommets*> p_sommets,vector<Aretes*> p_aretes){
        nom_graphe=p_nom;
        sommets=p_sommets;
        aretes=p_aretes;
    }
     
    string Graphes::listeSommets(){
        if (sommets.size()==0){
            return "aucun sommet";
        }else{
            string ret="";
            for (int i=0;i<sommets.size();i++){
                ret+=sommets.at(i)->toString()+"\n";
            }
            return ret;
        }
    }
     
    string Graphes::listeAretes(){
            if (aretes.size()==0){
                return "aucune arêtes";
            }else{
                string ret="";
                for (int i=0;i<aretes.size();i++){
                    ret+=aretes.at(i)->toString()+"\n";
                }
                return ret;
            }
        }
     
    void Graphes::createSommet(){
        Sommets* s=new Sommets();
        addSommet(s);
    }
     
    void Graphes::createArete(Sommets* p_somm1,Sommets* p_somm2){
        Aretes* a=new Aretes();
        addArete(a,p_somm1,p_somm2);
    }
     
     
    void Graphes::addArete(Aretes* p_arete,Sommets* p_somm1,Sommets* p_somm2){
        if (p_arete->getArete_dans()==NULL){
            p_arete->setArete_dans(this);
        }
        p_arete->setSommets(p_somm1, p_somm2);
        p_somm1->setSommet_dans(this);
        p_somm2->setSommet_dans(this);
        p_somm1->addArete(p_arete);
        p_somm2->addArete(p_arete);
        //on ajoute l'arête dans le graphe
        aretes.push_back(p_arete);
        //on ajoute les sommets dans le graphe
        sommets.push_back(p_somm1);
        sommets.push_back(p_somm2);
    }
     
    void Graphes::addSommet(Sommets* p_sommets,Aretes* p_aret) {
        if (p_sommets->getSommet_dans()==NULL){
            p_sommets->setSommet_dans(this);
        }
        p_sommets->addArete(p_aret);
        sommets.push_back(p_sommets);
    }
     
    void Graphes::addSommet(Sommets* p_sommets) {
        if (p_sommets->getSommet_dans()==NULL){
            p_sommets->setSommet_dans(this);
        }
        sommets.push_back(p_sommets);
    }
     
    Aretes* Graphes::deleteArete(Aretes* p_arete){
        int rech=rechercheArete(p_arete);
        if (rech!=-1){
            aretes.erase(aretes.begin()+rech);
            //l'arête ne référence plus le graphe
            p_arete->setArete_dans(NULL);
            //l'arête ne référence plus ses deux sommets
            p_arete->setSommets(NULL, NULL);
            return p_arete;
        }else{
            return NULL;
        }
    }
     
    int Graphes::rechercheArete(Aretes* p_arete){
        int i=0;
        while (i<aretes.size() && strcmp(aretes.at(i)->nom_arete.c_str(),p_arete->nom_arete.c_str())!=0){
            i++;
        }
        if (i<aretes.size()){
            return i;
        }else{
            return -1;
        }
    }
     
    Sommets* Graphes::deleteSommet(Sommets* p_sommet){
        int rech=rechercheSommet(p_sommet);
        if (rech!=-1){
            sommets.erase(sommets.begin()+rech);
            p_sommet->setSommet_dans(NULL);
            //le sommet ne référence plus le graphe
            //il faut maintenant supprimer toutes les aretes incidentes
            //du graphe
            vector<Aretes*>::iterator i = p_sommet->aret_incidents.begin();
            while (i!=p_sommet->aret_incidents.end()){
                deleteArete(*i);
                i++;
            }
            return p_sommet;
        }else{
            return NULL;
        }
    }
     
    int Graphes::rechercheSommet(Sommets* p_sommet){
        int i=0;
        while (i<sommets.size() && strcmp(sommets.at(i)->nom_sommet.c_str(),p_sommet->nom_sommet.c_str())!=0){
            i++;
        }
        if (i<sommets.size()){
            return i;
        }else{
            return -1;
        }
    }
     
    Graphes::~Graphes() {
        // TODO Auto-generated destructor stub
    }

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Normalement, tu n'es pas censé mettre les includes du projet dans stdafx.h, seulement ceux du système et des bibliothèques.

    Ensuite, stdafx.h doit être le premier header inclus, car tout ce qui le précède est ignoré par le compilo (c'est comme ça les precompiled headers!)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut Erreurs enfin résolues
    Merci pour tous vos conseils et remarques. Effectivement le fameux stdafx.h doit être mis au début encore fallait-il le savoir. J'en ai profité pour appliquer le conseil que tu m'as donné:
    tu n'es pas censé mettre les includes du projet dans stdafx.h, seulement ceux du système et des bibliothèques.
    . Ce qui est beaucoup plus pratique pour la suite. Après avoir généré j'ai eu des erreurs de links. Avec pas mal de patience j'ai réussi à tous les résoudre. A priori il aime pas la déclaration:
    (plutôt bizarre...)
    Il m'a fait une erreur de lien dessus. Enfin bref, je me suis débrouillé pour qu'il n'y ai plus aucune erreur ni de syntaxe ni de lien.
    Merci à tous pour vos réponses. Je mets ce sujet en résolu en espérant qu'il pourra servir pour la suite...

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

Discussions similaires

  1. Erreurs lors de l'installation de Visual Editor 1.4.0
    Par mesrine dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 05/11/2009, 01h24
  2. erreur de link au passage de visual studio 2005 vers 2008
    Par blueLight dans le forum Visual C++
    Réponses: 2
    Dernier message: 21/04/2008, 15h02
  3. Erreur : More than one part (Document/literal)
    Par ahulane dans le forum Services Web
    Réponses: 4
    Dernier message: 06/08/2007, 09h11
  4. Erreur lors de l'ouverture de Visual Basic Editor
    Par snoopy69 dans le forum Access
    Réponses: 8
    Dernier message: 09/05/2006, 11h39
  5. Une erreur venant de nullle part
    Par elaum dans le forum C
    Réponses: 4
    Dernier message: 17/09/2005, 23h02

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