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

Qt Discussion :

ASSERT failure in QList<T>::operator[]


Sujet :

Qt

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut ASSERT failure in QList<T>::operator[]
    Bonjour,

    J'obtiens l'erreur suivante: ASSERT failure in QList<T>::operator[]: "index out of range"
    Voila le code qui vient avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        QList< QList<int > > distance;
        int i, j, cost;
     
        for (i=0; i<string1.size();i++){
            distance[i][0] = i;
        }
    Pourtant je ne vois rien de choquant. Le programme plante à la ligne distance[i][0] = i pour i=0. Qu'est-ce qui se passe?

    Merci de votre aide.

    Cordialement

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 402
    Par défaut
    Pourtant, l'heure est assez explicite. Qu'est ce que tu ne comprends pas dans "out of range" ?
    Quelle est la taille de tes listes ? Est ce que tu accèdes à un élément existant ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    Ce que j'ai mis c'est le tout début de mon code. Il n'y a rien avant. J'ai compris ce que signifie "out of range". Ce que je ne comprends pas c'est que j'ai cette erreur alors que i vaut 0 :/
    La liste est créée à la ligne QList< QList<int > > distance; donc non, je n'accède pas à un élément existant.
    Les listes font une taille de 5.

    EDIT: J'ai essayé de copier ce bout de code dans un projet vierge => même bug

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 402
    Par défaut
    Citation Envoyé par Avatar36 Voir le message
    La liste est créée à la ligne QList< QList<int > > distance; donc non, je n'accède pas à un élément existant.
    Les listes font une taille de 5.
    A quel moment tu donnes une taille de 5 a ta liste dans ton code ? (HS : tu ne viendrais pas d'un autre langage, dans lequel les listes se dimensionnent automatiquement ? Ce n'est pas le cas en C++)

    Si tu accèdes à un élément qui n'existe pas, c'est normal d'avoir une erreur

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    C'est ce que je m'étais dit aussi mais dans la doc de la classe QList, ils n'indiquent à aucun moment la taille de ce QList. (HS: et faisant beaucoup de VBA en ce moment j'avoue que ça ne m'a pas choqué. Damn reflexes) Du coup je suis censé indiquer la taille des QList à quel endroit?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 402
    Par défaut
    Tu peux connaître la taille d'un conteneur en utilisant size(). Et une bonne pratique est de toujours tester la taille d'un conteneur avant d'utiliser [] (ce n'est pas spécifique à Qt, c'est valable aussi pour tous les conteneurs du C++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // version Qt
    Q_ASSERT(list.size() >= i) // ou assert
    list[i]
    Pour la taille de la liste :
    • sois tu définies une taille par défaut dans le constructeur
    • sois tu redimenssionnes avec resize()
    • sois tu utilies une fonction qui adapte la taille (push_back, append, insert, etc)

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    ok merci, je vais tester ça

    Le truc c'est que dans la doc, à aucun moment ils ne spécifient de taille pour une QList, même si ça me semble évident. Enfin bref, j'ai résolu mon problème en faisant un tableau à deux dimensions de int du c++ sans utiliser Qt. Et ça marche.

    Cordialement

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 402
    Par défaut
    Citation Envoyé par Avatar36 Voir le message
    Le truc c'est que dans la doc, à aucun moment ils ne spécifient de taille pour une QList, même si ça me semble évident. Enfin bref, j'ai résolu mon problème en faisant un tableau à deux dimensions de int du c++ sans utiliser Qt. Et ça marche.
    Si. La doc dit :
    Constructs an empty list.
    pour le constructeur par défaut. Vide = 0 élément. Donc si tu essaies d'accéder au premier élément d'une liste qui en contient aucun, tu as un bug. Rien de surprenant à cela

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    ah oui effectivement. Moi j'avais lu que la partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if (list[0] == "Bob")
         list[0] = "Robert";
    alors qu'avant il y a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QList<QString> list;
     list << "one" << "two" << "three";
    Dans tous les cas, ça ne rend pas le remplissage par les indices très intuitif. A mon avis pour mon cas, mieux vaut utiliser le tableau à deux dimensions tel que je l'ai fait. Surtout quand les données sont des int.

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 402
    Par défaut
    C'est le comportement classique de [], c'est pareil pour les autres conteneurs de Qt ou de la STL.

    C'est parce que tu n'es pas encore habitué au C++. Dans les autres langages, si tu tentes d'accéder à un élément qui n'existe pas, on va le créer pour toi. En C++, on va considérer que c'est une erreur

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/11/2013, 15h20
  2. ASSERT failure in QVector<T>::operator
    Par Invité dans le forum Qt
    Réponses: 1
    Dernier message: 09/01/2010, 01h03
  3. debug assertion failure
    Par anslab dans le forum C++
    Réponses: 5
    Dernier message: 22/05/2007, 16h33
  4. Kernel-error "kernel: Assertion failure sous RedHat
    Par peppena dans le forum Administration système
    Réponses: 1
    Dernier message: 08/03/2006, 13h30

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