25 июля 2019 г. 12:07

Реализация алгоритма для поиска обьекта

Qt

Всем привет.
Я не силен в алгаритмах, но вот тут возникла проблемка, надо код который работает но с ошибками (да еще и с go to) переделать на нормальный человеческий вид.
Его принцип такой что надо ходить в цикле по обьектам пока не найдем тот который нужно. Движение в направлениях только вверх и вниз.
Ниже привожу кусок кода что является тем который работает но требует как в песне перемен.

QQuickItem * Stack::find(StackItem item, Stack::Direction direction)
{
    QQuickItem *res = nullptr;
    QQuickItem *itemPage = item.page;
    QQuickItem *itemFocus = item.focus;
    QList<QQuickItem *> list; // siblings
    QQuickItem *itemPrev;
    QQuickItem *itemNext; // parent, next    int i;



int i = -1;

    if(itemFocus)
        itemPrev = qobject_cast<QQuickItem *>(itemFocus->parent());
    else
        itemPrev = itemPage;

    if(!itemPrev)
        return nullptr;
    list = childrenOf(itemPrev);

    if(itemFocus)
        i = list.indexOf(itemFocus);


try_another:
    if(direction == Direction::Up && list.length() > i+1)
        i++;
    else if(direction == Direction::Down && i > 0)
        i--;
    else
    {
        itemNext = itemPrev;
        itemPrev = qobject_cast<QQuickItem *>(qobject_cast<QQuickItem *>(itemPrev)->parent());

        if(itemPrev)
        {
            if(itemNext == itemPage)
                return nullptr;

            list = childrenOf(itemPrev);
            i = list.indexOf(itemNext);

            goto try_another;
        }
        else
            return nullptr;
    }

deeper:
    if(i < 0 || i > (list.length()-1))
    {
        qDebug() << "fuck invalid index, parent" << itemPrev << i;
        return nullptr;
    }

    itemNext = list[i];

    if(itemNext->isVisible() && itemNext->isEnabled())
    {
        if(isEnabledOn(itemNext))
        {
            res = itemNext;
            goto result;
        }
        else
        {
            if(childrenOf(itemNext).count())
            {
                if(direction == Direction::Down)
                    i = 0;
                else
                    i = childrenOf(itemNext).count()-1;

                itemPrev = itemNext;
                list = childrenOf(itemPrev);

                goto deeper;
            }
            goto try_another;
        }
    }
    else
        goto try_another;
result:
    return res;
}

А вот так выглядит часть начатой реализации в которой как раз есть нужные циклы за счет которых будет происходить поиск. То есть то что выше в коде надо в правильном порядке чтоли перетащить сюда.

QQuickItem *res = nullptr;
    QQuickItem *itemPage = item.page;
    QQuickItem *itemFocus = item.focus;
    QList<QQuickItem *> list; // siblings
    QQuickItem *itemPrev;
    QQuickItem *itemNext; // parent, next    int i;


    int i = -1;

    if(itemFocus)
        itemPrev = itemFocus->parentItem();
    else
        itemPrev = itemPage;

    if(!itemPrev)
        return nullptr;
    list = childrenOf(itemPrev);

    if(itemFocus)
        i = list.indexOf(itemFocus);

    list = childrenOf(itemFocus->parentItem());

    bool found = false;

    while (!found) // TODO: if not found
    {
        if(direction == Direction::Down)
        {
            // TODO: если индекс карента не последний
            while () // TODO: if last
            {
                // visible and enabled
            }
        }
        else if(direction == Direction::Up)
        {
            while () // TODO: if first
            {
                // visible and enabled
            }
        }
    }

    return res;

Так же я думаю важным отличием от кода с go to и на что надо переписать так это несколько переменных что будут помогать в поиске. first, last, direction, childre(yes, no)
И прикрепляю файлик с самим алгаритмом. В нем расмотренны все варианты. И само представленеи обьектов по которым происходит поиск.
Дерево
Алгоритм

Надеюсь кто то сможет с этим помочь.
Спасибо.

Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking
0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
D
16 августа 2019 г. 11:58
Damir

C++ - Тест 003. Условия и циклы

  • Результат:92баллов,
  • Очки рейтинга8
D
16 августа 2019 г. 11:46
Damir

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
u
14 августа 2019 г. 13:55
unrealproro

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
Последние комментарии
19 августа 2019 г. 6:41
Андрей Янкович

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
18 августа 2019 г. 5:09
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
17 августа 2019 г. 8:04
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Сейчас обсуждают на форуме
20 августа 2019 г. 12:37
Александр Панюшкин

Добрый день. Я бы хотел добавить, что в вашем коде можно было бы использовать слово auto и цикл for с перебором. Так код получился бы компактнее: auto map = new QMap<Qstring, QString&…
20 августа 2019 г. 12:17
Евгений Легоцкой

Добрый день. Вы делаете некорректную попытку создать исключение. Исключения генерируются кодом, то есть любое исключение, которое вы перехватываете, всегда генерируется оператором th…
20 августа 2019 г. 8:04
IscanderChe

Ещё раз здравствуйте. Собираю Qt-проект с помощью CMake. Применяю к полученному exe-файлу windeployqt. В результате подцепляются почему-то dll-ки, оканчивающиеся в наименованиях на "d": Qt…
20 августа 2019 г. 7:46
IscanderChe

Да, с таргетом тоже работает. Спасибо!
Ищу работу?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB