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 :

vector subscript out of range: qu'est-ce ?


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut vector subscript out of range: qu'est-ce ?
    Bonjour
    voilà j'ai un problème et j'espère bien que vous pouviez m'aider.
    le problème c'est que je développe une librairie qui lie des DTED(digital terrain elevation data ) et l'un de ses fonctions est la fonction findlist qui cherche dans un chemin donnée (_path) toutes les extention (.dt0) et les sauvegarde dans une liste(paths)
    crée avec des vecteurs.comme vous voyer ci-dessous.

    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
    bool LoaderDTED0::findList(const boost::filesystem::path  & _path, std::vector<boost::filesystem::path>& paths, int& nbLevel)
        {
                if ( !exists( _path )||(nbLevel<0) ) return false;
                directory_iterator end_itr;
                paths.resize(500);
                for ( directory_iterator itr(_path );(itr != end_itr);++itr )
                {
                    if ( is_directory(itr->status()) )
                    {
                        nbLevel--;
                        if ( findList( itr->path(), paths, nbLevel ) ) return true;
                    }
     
                    else if ( extension(itr->leaf()) == ".dt0")
                    {
                        paths.push_back(itr->path());
                    }
                }
                return false;
            }

    le problème c'est que tt se compile tres bien mais lors de l'exécution il m'affiche l'erreur suivante : "vector su bscript out of range".
    je sais pas d'ou vient l'erreur je suis vraiment besoin de votre aide.merci d'avance de votre réponse

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue sur developpez.com

    Cette erreur est levée par la classe vector de la STL(*) lorsqu'on tente d'accéder à un élément du vecteur qui est en dehors de l'intervalle de ce dernier.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<int> v(2); // crée un vecteur de 2 éléments
    v[0] = 1; //ok
    v[1] = 2; // ok
    v[3] = 3; // <-- plantage: vector subscript out of range
    Hope it helps.

    *: je ne suis pas certain que toutes les implémentations de la STL respèctent cela. Je ne suis pas non plus certain que ce soit précisé dans la norme.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    directory_iterator end_itr;
    ne semble pas initialisé avant le debut de la boucle.
    C'est pourtant la condition d'arret.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Half HS :
    Selon des souvenirs, c'est at qui lance une exception, pas operator[].

    Edit: Je confirme
    23.1.1:12§: The member function at() provides bounds-checked access to container elements. at() throws out_of_range if n >= a.size().
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    @Luther13: bien vu!

    @Davibrcz: Je ne trouve pas que tu sois HS du tout, bien au contraire, tu apporte une précision importante. Je crois d'ailleurs qu'il y a une raison importante qui explique pourquoi l'operateur [] ne lève pas d'exception, contrairement au at() . Peut-être une histoire de vitesse d'exécution?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Exactement, en théorie at est poil plus lente que operator[] car elle doit vérifier la pré-condition concernant n (n<v.size() et normalement n >=0 bien que cette dernière ne soit pas mentioné dans la norme).

    Par contre, la vrai question est de savoir si cette contre performance a un réel coût ? J'avoue que je n'en sais, n'ayant jamais fait de bench.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,
    Citation Envoyé par Davidbrcz Voir le message
    Exactement, en théorie at est poil plus lente que operator[] car elle doit vérifier la pré-condition concernant n (n<v.size() et normalement n >=0 bien que cette dernière ne soit pas mentioné dans la norme).

    Par contre, la vrai question est de savoir si cette contre performance a un réel coût ? J'avoue que je n'en sais, n'ayant jamais fait de bench.
    Par définition, tout test a un cout, fusse-t-il de quelque cycles d'horloge, et même si le test en question revient à faire une égalité entre deux variables mises dans des registres.

    Or, il n'y a rien à faire, étant donné le test de la pré condition, il faut s'attendre à ce que la méthode at() soit implémentée sous une forme proche de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T& Contener::at(size_t ind)
    {
        if(ind>=size()) //pourrait aussi utiliser un membre de la classe ;) */
            throw out_of_range();
        /* recherche de l'élément à renvoyer et renvoi de celui-ci */
    }
    La question à se poser n'est donc pas "cette méthode a-t-elle un cout", mais bien "le cout de cette méthode est il en rapport avec la sécurité qu'elle apporte " ou encore "le cout de cette méthode n'est il pas, selon le contexte, prohibitif du point de vue des performances" (pour ceux qui tiennent absolument à chasser le moindre cycle d'horloge inutilement utilisé )
    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

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut re
    merci pour vos réponses mais jusqu'à maintenant je vois pas où est l'erreur,c'est le bout de code qui me génére l'erreur.merci de préciser

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Half HS :
    Selon des souvenirs, c'est at qui lance une exception, pas operator[].
    Quand on est en dehors du range, at lance une exception, d'accord sur ce point.
    Quand on est en dehors du range avec [], c'est un comportement indéfini. Donc le compilateur a le droit de faire ce qu'il veut, y compris la chose intelligente qui consiste à lancer une exception. En pratique, les bons compilateur auront en mode non optimisé un comportement identique entre [] et at, et en mode optimisé le code le plus rapide pour [] et le plus sur pour at.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Pour info, Luther13, le code du tutorial de boost::filesystem utilise aussi un directory_iterator "non initialisé" car la constructeur par défaut de directory_iterator le met automatiquement à la fin du répertoire.
    (La phrase exacte est "default construction yields past-the-end", mais je ne suis pas sur à 100% de ma traduction )

    Edit: ton débbugeur te donne quoi comme erreur/info/... ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci pour tt les réponses mais je vois pas comment résoudre ce problème d 'erreur déclanché "vector subscript out of range".merci pour vos aide

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Vu que tu n'accèdes pas aux éléments du vecteur paths ici, l'erreur doit être ailleurs que dans ce code.

    Par contre, deux points me semblent louches dans ton code :

    - Le paths.resize[500] : Il ne sert à rien (puisque tu fais des push_back), va créer des objets vides au début, et à chaque appel récursif tu va tronquer ta liste, supprimant les vrais données pour ne garder que les 500 vides crées.

    - Le passage par référence du niveau
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Vu que tu n'accèdes pas aux éléments du vecteur paths ici, l'erreur doit être ailleurs que dans ce code.
     
    Par contre, deux points me semblent louches dans ton code :
     
    - Le paths.resize[500] : Il ne sert à rien (puisque tu fais des push_back), va créer des objets vides au début, et à chaque appel récursif tu va tronquer ta liste, supprimant les vrais données pour ne garder que les 500 vides crées.
     
    - Le passage par référence du niveau
    pour paths.resize[500] on l'a pas utilisé au début mais on a essayé de l'utilsé pusique l'erreur générée est dû au taille du vecteur mais ça genere tjrs le mem probleme

    pour le passage par référence parcque on voulias utilsé que des pointeurs pour réduire l'espace memoire.
    sinon vous savez pas quelle déclaration pourra générer cette erreur

  14. #14
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Points : 68
    Points
    68
    Par défaut
    Attention, car en passant ton nbLevel par référence, il pourra être modifié par les fonctions appelées, notamment par
    La valeur de nbLevel dans les fonctions appelantes sera également affecté par cette décrémentation.
    D'autre part, la taille d'un int n'est pas si grosse que ça comparé à une adresse, tu peux donc à mon avis le passer par valeur sans t'inquiéter pour la mémoire. Si tu veux absolument le passer par référence, fais-le par référence constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction(const int & i)

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    N'as-tu pas un debuggeur qui te permettrait de savoir exactement où cette erreur est déclenchée ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    non merci j'ai trouvé où est le probleme c'est comme vs avez dit c'est en dehors de code.merci infiniment pour vos aide

Discussions similaires

  1. Erreur "vector subscript out of range" - OpenCV
    Par bblanchon dans le forum SL & STL
    Réponses: 3
    Dernier message: 07/06/2012, 14h42
  2. 'subscript out of range'
    Par NulenVBA dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/10/2008, 11h03
  3. Réponses: 1
    Dernier message: 23/04/2008, 11h37
  4. vector subscript out of range
    Par nightwar dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/03/2008, 19h35
  5. error9 subscript out of range
    Par tomy7 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/03/2008, 13h25

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