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 431also 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 zwischen1
und19
erzeugt (), die zurückgegebeneQList
aber 19 Einträge und damit Indizes von0
bis18
hat. Wenn der Zufallsgenerator eine 19 in der Liste erzeugt hat, dann istm_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 }
``
-
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(Korrektur) Bei der ersten Schleifeniteration greifst du auch nicht aufj = 0 dann
liste[0]
zu, sondern aufliste[liste[0]]
, also auf den Index, den der Zufallsgenerator an Position0
der Liste erzeugt hat. Das kann z.b. eine19
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 Loopm_intList = {1, 2, 4}; // definiert als: QList<int> m_intList; for (int i : m_intList) { ui->intList->append(QString::number(i)); }