QList::at: "index out of range"



  • Ich habe mal wieder ein Problem, bei dem ich nicht verstehe, warum ich es überhaupt habe 🙂

    QList<int> MainWindow::rundomNumbers()
    {
        const int numberOfInts = 19;
        const int high = 20;
        QList<int> list;
        for (int i = 0; i < numberOfInts; i++) {
            list += QRandomGenerator::global()->bounded(1,high);
        }    return list;
    }
    

    Simpel und funktioniert auch immer.
    Aber dann mach ich folgendes:

    m_intList = rundomNumbers();
       // definition sieht so aus: QList<int> m_intList;
       for (int j : m_intList) {
           ui->intList->append(QString::number(m_intList.at(i)));
           // ui->intList ist ein QTextEdit
       }
    

    Sieht für mich auch simpel aus, funktioniert aber nur, wenn high < numberOfInts ist. Verstehe ich nicht, high ist die größtmöglich Zahl, numberOfInts die Anzahl der Elemente in der Liste.

    Das ist die Fehlermeldung:
    ASSERT failure in QList::at "index out of range", file C:/qt/6.6.0/mingw_64/include/QtCore/qlist.h, line 431

    also dort:

    const_reference at(qsizetype i) const noexcept
       {
           Q_ASSERT_X(size_t(i) < size_t(d->size), "QList::at", "index out of range");
           return data()[i];
       }
    

    Das kommt zur Laufzeit in der Schleife gleich beim j=0 (aber wie gesagt nur wenn high < numberOfInts.

    Kann mir jemand sagen, was ich da wieder nicht verstehe?



  • Welchen Wert hat denn i in deinem unteren Code?

    PS. Du meinst wohl randomNumbers() 😉



  • ui->intList->append(QString::number(m_intList.at(i)))
    

    meinte ich, aber ich hab hier i statt j geschrieben also korrekt steht da

    ui->intList->append(QString::number(m_intList.at(j)))
    

    und schon bei j=0 kommt der Fehler



  • @Feetless sagte in QList:🇦🇹 "index out of range":

    ui->intList->append(QString::number(m_intList.at(i)))
    

    meinte ich, aber ich hab hier i statt j geschrieben also korrekt steht da

    ui->intList->append(QString::number(m_intList.at(j)))
    

    Tippst du das echt ab, oder wie kommt das zustande? Ist das nicht superaufwändig? 😨

    Mach am besten einfach Copy+Paste. Das macht allen die Arbeit leichter. Ich habe z.B. zuerst gedacht es handelt sich evtl. um ein uninitialisiertes i, das in den allermeisten Fällen ebenfalls zu einem solchen Fehler führen würde.

    und schon bei j=0 kommt der Fehler

    Nun zu deinem Problem: Ich denke, das liegt daran, dass wenn ich die Doku richtig lese QRandomGenerator::global()->bounded(1,high) Zufallszahlen zwischen 1 und 19 erzeugt ([1,19][1, 19]), die zurückgegebene QList aber 19 Einträge und damit Indizes von 0 bis 18 hat. Wenn der Zufallsgenerator eine 19 in der Liste erzeugt hat, dann ist m_intList.at(i), bzw. m_intList.at(19) "out of range".

    Ich denke, der richtige Indexzugriff wäre hier eher m_intList.at(i - 1). Kann das sein?



  • @Feetless sagte in QList:🇦🇹 "index out of range":

    for (int j : m_intList) {
           ui->intList->append(QString::number(m_intList.at(j)));
           // ui->intList ist ein QTextEdit
       }
    

    Du iterierst doch schon über den Inhalt, du möchtest doch eigentlich das hier:

    for (int j : m_intList) {
           ui->intList->append(QString::number( j );
           // ui->intList ist ein QTextEdit
       }
    


  • @DocShoe sagte in QList:🇦🇹 "index out of range":

    Du iterierst doch schon über den Inhalt, du möchtest doch eigentlich das hier:

    Ich habe auch den Verdacht, aber so richtig klar ist das nicht.

    @Feetless, das ist hier möglicherweise ein XY-Problem. Es ist nicht verkehrt in Zukunft noch dazu zu schreiben, was du eigentlich erreichen willst, dann kann man zielgerichteter helfen, weil man sich z.B. nicht sinnlos damit aufhält herauszufinden, warum es hier zu einem Range-Error kommt 😁



  • Ne, tippe ich nicht ab 🙂 Ich hatte nur das j geändert, damit hier nicht zwei gleiche Schleifenvariable stehen.

    Danke für den Hinweis,

    for (int j : m_intList)
    

    gibt eigentlich schon den passenden index.
    Die Fehlermeldung kommt schon bei j=0; und das auch nur, wenn die größte Zahl in der Liste größer als die Anzahl der Elemente in der Liste ist.

    ich habe es nochmal einfacher versucht (ohne Zufallszahlen):

    Das funktioniert:

    m_intList = {1, 2, 0};
        // definiert als: QList<int> m_intList;
        for (int i : m_intList) {
            ui->intList->append(QString::number(m_intList.at(i)));
            // ui->intList ist ein QTextEdit
        }
    

    Aber das funktioniert nicht:

    m_intList = {1, 2, 4};
        // definiert als: QList<int> m_intList;
        for (int i : m_intList) {
            ui->intList->append(QString::number(m_intList.at(i)));
            // ui->intList ist ein QTextEdit
        }
    

    ``



  • @Feetless

    Du benutzt ein Element des Arrays als Index für den Arrayzugriff.
    In deinem letzten Beispiel benutzt du das Element "4" als Index, und das fliegt dir um die Ohren, weil die Liste nur drei Elemente hat.
    Range-based-for loops laufen über die Elemente eines Containers, nicht über die gültigen Indexe.



  • @Feetless sagte in QList:🇦🇹 "index out of range":

    gibt eigentlich schon den passenden index.
    Die Fehlermeldung kommt schon bei j=0; und das auch nur, wenn die größte Zahl in der Liste größer als die Anzahl der Elemente in der Liste ist.

    Wenn j = 0 dann (Korrektur) Bei der ersten Schleifeniteration greifst du auch nicht auf liste[0] zu, sondern auf liste[liste[0]], also auf den Index, den der Zufallsgenerator an Position 0 der Liste erzeugt hat. Das kann z.b. eine 19 sein und damit außerhalb der gültigigen Indizes einer Liste mit 19 Elementen.

    Aber das ist alles nebensächlich! Siehe den Post von @DocShoe. Was willst du tatsächlich erreichen mit deinem Code?



  • @Feetless: Du scheinst die Range-based-for Schleife nicht richtig zu verstehen.

    for (int j : m_intList)
    

    entspricht

    for (size_t i = 0; i < m_intList.size(); i++)
    {
        j = m_intList[i]; // bzw. m_intList.at(i)
    }
    

    j ist also der Listeneintrag, nicht der Index (wie schon @DocShoe und @Finnegan geschrieben haben).



  • Danke @DocShoe und @Finnegan. Klar, bereichsbasierte Schleife war Mist
    So gehts:

    for (int j = 0; j < m_intList.size(); j++)
    


  • @Th69 sagte in QList:🇦🇹 "index out of range":

    @Feetless: Du scheinst die Range-based-for Schleife nicht richtig zu verstehen.

    for (int j : m_intList)
    

    entspricht

    for (size_t i = 0; i < m_intList.size(); i++)
    {
        j = m_intList[i]; // bzw. m_intList.at(i)
    }
    

    j ist also der Listeneintrag, nicht der Index (wie schon @DocShoe und @Finnegan geschrieben haben).

    ja danke @Th69 🙂



  • @Feetless
    Da Range based Schleifen schöner sind, als mit Index, hier dein Beispiel mit range based Loop

    m_intList = {1, 2, 4};
        // definiert als: QList<int> m_intList;
    for (int i : m_intList) {
        ui->intList->append(QString::number(i));
    }
    

Log in to reply