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 (portée de variable)


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Erreur de compilation (portée de variable)
    Bonsoir à tous

    J'essaie de me créer un petit programme pour réviser du vocabulaire d'anglais, d'espagnol, de turc etc
    Bref ce que fais mon programme n'est pas important.

    J'ai trois erreurs de compilation.

    "NB_MOTS was not declared in this scope"
    "T_mot was not declared in this scope"
    "T_traduction was not declared in this scope"

    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
     
    int main(){
     
    ifstream fichier("dictionnaires/dico.txt",ios::in);
    if (fichier){
     
    // compter le nombre de mot du dictionnaire
    int i(0);
    string ligne;
    while(getline(fichier,ligne)){ i++; }
    int NB_MOTS=(0.5*i);
     
    // creer deux tableaux qui contiennent les motsss du dico
    string T_mot[NB_MOTS];
    string T_traduction[NB_MOTS];
    for(int i(0);i<NB_MOTS;i++)
    {
    getline(fichier,T_mot[i]);
    getline(fichier,T_traduction[i]);
    }
     
    fichier.close();
    }
    else
    cout << "Impossible d'ouvrir le fichier" << endl;
     
    // aléatoire
    srand(time(NULL));
    int i=0;
    int* t=NULL;
    t=init_sans_doublons(0,NB_MOTS);
    melanger(t,NB_MOTS);
     
    // exercice
    int j;
    for(i=0;i<NB_MOTS;i++){
        j=t[i];
        cout << T_mot[j] << " ?" << endl;
        string reponse;
        cin >> reponse;
        if (reponse==T_traduction[j])
            cout << "gg" <<endl;
        else{
            cout << "Non. Encore un essai" << endl;
            cin >> reponse;
            if (reponse==T_traduction[j])
                    cout << "gg" <<endl;
                else
                    cout << "Non. " << T_mot[j] << " signifie " << T_traduction[j] << endl;
    }
     
     
        return 0;
    }
    }
    Il me semble que ces erreurs sont dues à la portée de mes variables qui n'est que dans la première boucle.
    Pouvez vous me dire comment augmenter la portée de ces variables ?
    J'avais pensé aux constantes ou aux variables globales mais T_mot et T_traduction sont deux tableaux alors je ne pense pas que ce soit faisable. Sinon dois-je le faire avec des pointeurs/allocation dynamiques ? Je ne sais pas comment m'y prendre ni s'il y a une autre solution.

    Je remercie ceux qui ont pris la peine de me lire,
    bonne soirée.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    En commençant par indenter correctement ton code afin de clairement les voir, ces portées
    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
     
    int main(){
     
        ifstream fichier("dictionnaires/dico.txt",ios::in);
        if (fichier){
     
            // compter le nombre de mot du dictionnaire
            int i(0);
            string ligne;
            while(getline(fichier,ligne)){ i++; }
            int NB_MOTS=(0.5*i);
     
            // creer deux tableaux qui contiennent les motsss du dico
            string T_mot[NB_MOTS];
            string T_traduction[NB_MOTS];
            for(int i(0);i<NB_MOTS;i++)
            {
                getline(fichier,T_mot[i]);
                getline(fichier,T_traduction[i]);
            }
     
            fichier.close();
        } //                            NB_MOTS, T_mot et T_traduction n'existent plus à partir d'ici
        else
            cout << "Impossible d'ouvrir le fichier" << endl;
     
        // aléatoire
        srand(time(NULL));
        int i=0;
        int* t=NULL;
        t=init_sans_doublons(0,NB_MOTS);
        melanger(t,NB_MOTS);
     
        // exercice
        int j;
        for(i=0;i<NB_MOTS;i++){
            j=t[i];
            cout << T_mot[j] << " ?" << endl;
            string reponse;
            cin >> reponse;
            if (reponse==T_traduction[j])
                cout << "gg" <<endl;
            else{
                cout << "Non. Encore un essai" << endl;
                cin >> reponse;
                if (reponse==T_traduction[j])
                    cout << "gg" <<endl;
                else
                    cout << "Non. " << T_mot[j] << " signifie " << T_traduction[j] << endl;
            }
     
     
            return 0;
        }
    }
    cf commentaire ligne 23

    À noter qu'à la fin de ta boucle while(getline(fichier,ligne)){ i++; } tu es à la fin de ton fichier et le flag associé est levé.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci pour cette réponse. J'ai codé un peu à la va vite trop préssée du résultat mais merci c'est beaucoup plus clair à lire comme ça

    Alors ça confirme ce que je pensais mais savez vous comment je peux résoudre ce problème ... ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Et bien une variable, sa portée est limitée par les accolades les plus proches. Pour "augmenter sa portée", tu ... la remontes d'un niveau ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  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
    Citation Envoyé par Bousk Voir le message
    Et bien une variable, sa portée est limitée par les accolades les plus proches. Pour "augmenter sa portée", tu ... la remontes d'un niveau ?
    Et, surtout, tu utilises la bibliothèque standard!!! Dans ton code, tu utilises (très mal, d'ailleurs) des tableau de taille fixe. Or, tu n'as absolument aucun moyen de connaitre le nombre de mots que tu trouveras dans ton fichier.

    Tu dois donc utiliser des tableaux de taille dynamique (AKA : inconnue à la compilation), et ca, ca t'est fourni au travers de la classe vector, accessible (comme tout ce qui a trait à la bibliothèque standard) dans l'espace de noms std grâce à l'inclusion du fichier d'en-tête <vector>
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Si dans mon fichier il y a NB_MOTS mots. dans mon dictionnaire j'écris un mot par ligne, les lignes impaires se sont les mots anglais et les lignes paires se sont les mots français. Donc je connais la taille de mes tableaux : elle est égale au nombre de lignes de mon fichier divisé par deux. D'où NB_MOTS=0.5*i

    Donc je n'ai pas besoin d'allocation dynamique car je connais la taille du tableau.

    Vous me dites de remonter les variables de niveaux. Si je remonte les variables, et que je leur donne une valeur dans un niveaux plus bas, est-ce que quand je sors de ce niveau les variables garderont leur valeur ?

  7. #7
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Lu'!

    Un tableau de taille fixe, c'est un tableau dont la taille est connue au moment de la compilation, c'est une valeur fixe, en dur.
    Or ici, la taille n'est pas connue au moment de la compilation, si tu changes le nombre de mot dans le fichier, la taille change.

    Donc utilise std::vector. C'est fait pour ça.

  8. #8
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    merci KsassPeuk

    je n'avais jamais utilisé les vector car en cours de programmation on n ous interdit ce genre de classes prêtes à l'emploi. Maintenant je n'ai plus d'erreurs de compilation, et je connais un nouvel outils bien pratique pour programmer encore merci!!!

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

Discussions similaires

  1. [AC-2010] Erreur de compilation : Fonction ou variable attendue
    Par Plantakwatix dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/03/2013, 14h43
  2. Erreur à la compilation:Duplicate local variable
    Par manguigs dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/03/2009, 12h05
  3. Erreur de compilation 'variably modified' ?
    Par Grulim dans le forum C
    Réponses: 9
    Dernier message: 09/08/2008, 16h05
  4. Réponses: 14
    Dernier message: 16/07/2008, 17h05
  5. [erreur] portée de variables
    Par bhdih1 dans le forum Access
    Réponses: 11
    Dernier message: 12/11/2005, 18h20

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