Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
1

Как правильно передать вектор в функцию и вызвать эту функцию?

28.08.2018, 20:56. Показов 2220. Ответов 20

Author24 — интернет-сервис помощи студентам
Здравствуйте, объясните как исправить ошибку. Возникает после for(), выдается, что размер polygon = 0. Вот так функции объявлены в классе:

C++ (Qt)
1
2
void CreatePolygon();
int PointInPoly(QPolygon &polygon, int n, int x, int y);
Вот вызов функции:
C++ (Qt)
1
2
3
4
5
6
void MyGraphicView::TestIntersection(QPolygon& polygon)
{
    PointInPoly(polygon, 2, x, y);
 
    QDialog dlg(this);
    dlg.setWindowTitle(tr("My dialog"));}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void MyGraphicView::CreatePolygon()
{
    QPolygon polygon;   // Используем класс полигона, чтобы отрисовать треугольник
                        // Помещаем координаты точек в полигональную модель
    polygon
        << QPoint(0, 85) << QPoint(75, 75)
        << QPoint(100, 10) << QPoint(125, 75)
        << QPoint(200, 85) << QPoint(150, 125)
        << QPoint(160, 190) << QPoint(100, 150)
        << QPoint(40, 190) << QPoint(50, 125)
        << QPoint(0, 85);
    scene->addPolygon(polygon);
 
}
 
int MyGraphicView::PointInPoly(QPolygon& polygon, int n, int x,int y) //n - количество углов
{
    for(int i=0;i<n;i++)
    { 
        if ((x > polygon.at(n).x()) && ((y > polygon.at(n).y())))
        {
            //точка находится вне области
        }
 
        if ((x > polygon.at(n).x()) || ((y > polygon.at(n).y())))
        {
            //точка находится в области
        }
 
        if ((x = polygon.at(n).x()) && ((y = polygon.at(n).y())))
        {
            //точка находится в области
        }
    }
    return 1;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2018, 20:56
Ответы с готовыми решениями:

Как правильно передать параметр в функцию?
Есть вот такой код. В качестве примера пытаюсь вызвать метаметод layout() у наследника от QWidget...

Как в функцию передать функцию, которая будет слотом?
Как в функцию передать функцию, которая будет слотом? То, что написано в интернете и тут...

Как правильно передать вектор по ссылке?
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std;...

Как вызвать c++ функцию?
всем привет, уже перечиал кучу статей и примеров по qt, но нигде так и не увидел примера того как...

20
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
29.08.2018, 08:52 2
Что сюда передаётся то хоть?
C++ (Qt)
1
void MyGraphicView::TestIntersection(QPolygon& polygon)
0
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
29.08.2018, 09:00 3
А где использование счетчика i в цикле for?

Добавлено через 1 минуту
Цитата Сообщение от ilia53v Посмотреть сообщение
polygon.at(n).x())
возможно выход за границы массива
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 09:03  [ТС] 4
void MyGraphicView::TestIntersection(QPolygon& polygon)

Сюда передается polygon с размером 0
0
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
29.08.2018, 09:51 5
Цитата Сообщение от ilia53v Посмотреть сообщение
Сюда передается polygon с размером 0
А почему тут уже не 0 а 2? Ну и про n в цикле уже написали.
C++ (Qt)
1
PointInPoly(polygon, 2, x, y);
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 09:57  [ТС] 6
n задумывалось как количество углов, к тому же это : PointInPoly(polygon, 2, x, y); - вызов функции. А почему там должно быть ноль?

Добавлено через 26 секунд
n в цикле я поправил
0
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
29.08.2018, 10:02 7
Цитата Сообщение от ilia53v Посмотреть сообщение
почему там должно быть ноль?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    for(int i=0;i<n;i++)
    { 
        if ((x > polygon.at(i).x()) && ((y > polygon.at(i).y())))
        {
            //точка находится вне области
        }
 
        if ((x > polygon.at(i).x()) || ((y > polygon.at(i).y())))
        {
            //точка находится в области
        }
 
        if ((x = polygon.at(i).x()) && ((y = polygon.at(i).y())))
        {
            //точка находится в области
        }
    }
Не знаю, как оно задумывалось, но у тебя (если я правильно понял, как ты исправил цикл) идёт перебор точек полигона от 0 до (n-1). Как ты собрался перебирать точки от 0-ой до 1-ой, если у тебя
Сюда передается polygon с размером 0
Или я что-то не правильно понял?
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 10:04  [ТС] 8
Вот именно про это и был вопрос: как передать полигон с размером 11?
0
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
29.08.2018, 10:09 9
А можно обойтись без n?
Заменить его на размер polygon.size()

Добавлено через 1 минуту
А еще - зачем выдумывать велосипед, если в классе QPolygon уже есть функция
C++ (Qt)
1
bool QPolygon::containsPoint
?
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 10:16  [ТС] 10
Потому что только начал изучать qt

Добавлено через 1 минуту
Но все-таки как правильно передавать вектор здесь?
0
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
29.08.2018, 10:20 11
Цитата Сообщение от ilia53v Посмотреть сообщение
как передать полигон с размером 11?
Ну ты как-то передаешь пустой ( где-то вне приведённого кода)? Так же и передавай. Запихни в него точки предварительно, как делаешь в void MyGraphicView::CreatePolygon().
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 10:24  [ТС] 12
Нет не передаю. Программа крашится на 1 цикле if.
Миниатюры
Как правильно передать вектор в функцию и вызвать эту функцию?  
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 10:31  [ТС] 13
Даже если я вызываю CreatePolygon() в самом начале PointInPoly(), polygon все равно пустой
0
279 / 88 / 37
Регистрация: 10.06.2015
Сообщений: 261
29.08.2018, 10:32 14
Тебе про 2 и polygon.size() ещё раз написать? Мухи с котлетами не смешивай. У тебя проблема не с тем, как передать условный "полигон с размером 11", а с тем, что ты упорно игнорируешь количество точек в полигоне и пытаешься извлечь нулевую и первую точку из пустого полигона.
Даже если я вызываю CreatePolygon() в самом начале PointInPoly(), polygon все равно пустой
Уже пару раз просил показать, что ты передаешь в void MyGraphicView::TestIntersection(QPolygon& polygon). Ты только отписался, мол - пустой полигон. Я могу попытаться угадать, но лучше не буду.
0
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
29.08.2018, 10:33 15
Ошибка - выход за границы массива.
Твоя проблема в том, что в функции void MyGraphicView::CreatePolygon() ты создаешь полигон, заполняешь его данными, а потом этот полигон запихиваешь в сцену.
Далее ты пытаешься вызвать функцию PointInPoly(polygon, 2, x, y); в которую передаешь какой-то непонятный polygon, который нигде заранее не был заполнен данными.

Передавай в PointInPoly либо полигон из scene, либо вынеси этот полигон выше из функции CreatePolygon на уровень самого класса.
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 10:45  [ТС] 16
Теперь n=polygon.size(); и да все работает.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int MyGraphicView::PointInPoly(QPolygon& polygon, int x,int y) //n - количество углов
{
    int n = polygon.size();
    for(int i=0;i<n;i++)
    { 
        if ((x > polygon.at(i).x()) && ((y > polygon.at(i).y())))
        {
            //точка находится вне области
        }
 
        if ((x > polygon.at(i).x()) || ((y > polygon.at(i).y())))
        {
            //точка находится в области
        }
 
        if ((x = polygon.at(i).x()) && ((y = polygon.at(i).y())))
        {
            //точка находится в области
        }
    }
    return 1;
}
Добавлено через 2 минуты
Можно сразу вопрос: как передать polygon из scene?
0
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
29.08.2018, 10:59 17
Цитата Сообщение от ilia53v Посмотреть сообщение
Можно сразу вопрос: как передать polygon из scene?
Для этого лучше сохранить ссылку на него.
Например, функция addPolygon возвращает QGraphicsPolygonItem*, который можно где-либо сохранить в переменной класса, а затем уже обращаться к ней.
Либо организовать в классе MyGraphicView вектор
QVector<QGraphicsPolygonItem*> polygons;
в который помещать указатели на все добавленные в сцену полигоны, например так
polygons.append(scene->addPolygon(polygon));
и уже через этот вектор обращаться к полигонам
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 11:07  [ТС] 18
То есть обращение к точке polygon будет примерно следующим: polygons.polygon.at(i).x()?
0
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
29.08.2018, 11:18 19
Что-то вроде такого должно быть
C++ (Qt)
1
polygons.at(num).polygon().toPolygon().point(i).x();
где num - это номер полигона а векторе

Добавлено через 1 минуту
чтобы было яснее
QPolygon polygon = polygons.at(num).polygon().toPolygon();
а затем уже
polygon.at(i).x()
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 37
29.08.2018, 11:20  [ТС] 20
при этом он ругается на polygon - class QPoint не содержит члена polygon
0
29.08.2018, 11:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2018, 11:20
Помогаю со студенческими работами здесь

Как вызвать функцию в дочерней форме
Создаю в основной форме новую форму через NewForm *newForm = new NewForm(this); newForm-&gt;show();...

Как вызвать функцию в Qt с переменной, которая берется из другой формы?
Есть две формы (firstForm и MainWindow). В firstForm присутствует SpinBOX, из которого мне нужно...

Как передать указатель на виджет в функцию?
Добрый день, Подскажите пожалуйста, можно ли передать виджет в функцию? void...

Как в Qt передать указатель на CallBack функцию WinAPI ? :-)
Есть ли в Qt такое понятие как CallBack или нет? Конечно же тут проскакивает аналогия со слотом,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru