LINUX.ORG.RU

QStringList как обезопасить себя от обращения к несуществующему элементу ?

 


0

2

Понятно, что можно каждый раз контролировать размер size. Но это не очень удобно. Охота более простой способ. at не возвращает пустую строку.

Перемещено Zhbert из general

Не пиши на крестах.

Zhbert ★★★★★
()

Но это не очень удобно

Напиши обёртку, которая будет делать это за тебя.

ox55ff ★★★★★
()

А зачем ты вообще к нему обращаешься?

ya-betmen ★★★★★
()

Во-первых, в development. Во-вторых, вопрос абстрактен, соответственно, и ответы будут абстрактные. Давай конкретику, с кодом

XMs ★★★★★
()
Ответ на: комментарий от XMs

Вот при обращение к 3 элементу массива программа падает.

QStringList people = { "Tom", "Bob", "Sam" };
qDebug() << "вывод текста" << people.at(0) << people.at(1) << people.at(2);
Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Ну так не обращайся к нему, либо лови исключение.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Alex_Golubev
$ cat ../main.cpp 
#include <QStringList>
#include <QTextStream>
#include <Qt>
#include <cstdlib>



int main()
{
        QTextStream out(stdout);
        QStringList l = { "aaa", "bbb", "ccc" };
        out << l.size() << Qt::endl;
        out << l.at(0);
        out << l.at(1);
        out << l.at(2);
        out << Qt::endl;
        return EXIT_SUCCESS;
}
$ ./stringlisttest 
3
aaabbbccc
$ 

Не сходится. На твоей синтетике никаких исключений нет. Давай больше кода

XMs ★★★★★
()
Ответ на: комментарий от Alex_Golubev

Зойчем тебе четвертый элемент если у тебя в массиве всего три?


for ( const auto& person : people )
{
    qDebug() << person;
}

ya-betmen ★★★★★
()
Ответ на: комментарий от XMs

$ cat ../main.cpp 
#include <QStringList>
#include <QTextStream>
#include <Qt>
#include <cstdlib>



int main()
{
        QTextStream out(stdout);
        QStringList l = { "aaa", "bbb", "ccc" };
        out << l.size() << Qt::endl;
        out << l.at(0);
        out << l.at(1);
        out << l.at(2);
        out << l.at(3); // так работать будит?
        out << Qt::endl;
        return EXIT_SUCCESS;
}
$ ./stringlisttest 
3
aaabbbccc
$ 
Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Так — очевидно, нет. Ну так тебе уже порекомендовали использовать range-based for для исключения подобной ситуации. Но я предполагаю (наивно надеюсь), что у тебя ситуация сложнее и интереснее, и вопрос больше про проектирование

XMs ★★★★★
()
Ответ на: комментарий от Alex_Golubev

Используй вместо at() функцию value(). Она будет возвращать пустую строку для несуществующих индексов

Beewek ★★
()
Ответ на: комментарий от Beewek

Используй вместо at() функцию value(). Она будет возвращать пустую строку для несуществующих индексов

Ну зачем же так сразу. Надо же ещё 500+ постов по этой важной теме сделать.

pathfinder ★★★★
()
Ответ на: комментарий от Beewek

Она будет возвращать пустую строку

Можно не пустую, а дефолтное значение — какое укажешь в параметрах value.

otto ★★★
()
Ответ на: комментарий от Alex_Golubev

Понятно, что можно каждый раз контролировать размер size. Но это не очень удобно.

  1. И пример искусственный, и заявление спорное. На самом деле в подавляющем большинстве случаев работа с QStringList идёт либо через макрос foreach, либо через for по контейнерам (если доступен компилятор C++11 или выше, это более правильный вариант), либо через итераторы, на крайняк, если важен номер позиции – через обычный for, в последнем случае да, size контролируется вручную, один раз в заголовке цикла. Случаи, когда номер элемента приходит извне, не так часты, и их действительно совсем не вредно проверить на корректность по приходу. :)

  2. Не совсем по теме, но на всякий случай напоминаю, что если уж надо писать в тексте программы нелатинские литералы, писать их надо, например, так:

QString::fromUtf8("вывод текста")

А так, как у тебя, скорее всего, под одной ОС заработает, под другой выведет кракозябры.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 2)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.