Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618

Пропадают значения переменной

07.12.2019, 07:52. Показов 1104. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всё дело в указателе на cv::Point p. Код ниже даёт случайные ошибки выхода за пределы памяти. Если объявлять, p как New cv::Point() - (указано в коде), ошибки пропадают, но значения указателя равно всегда нулю.

Вызов функции:
C++
1
    this->window->isImagePresentThenPressWithShift(900, 300, 400, 700, "Images/FinishTask.png", 500);
C++
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
void isImagePresentThenPressWithShift(int x, int y, int x2, int y2, const char* c, int msec = 0, int shiftx = 0, int shifty = 0);
 
void GameWindow::isImagePresentThenPressWithShift(int x, int y, int x2, int y2, const char* c, int msec, int shiftx, int shifty){
    cv::Point* p; // <------ Здесь = New cv::Point();
    float diff = getScreenshotAndfoundImageGiveDiff(x, y, x2, y2, c, p);
    std::cout << p->x + shiftx << " " << p->y + shifty << std::endl;
    if(diff > 0.9 )
        TheHelper::mouseMoveAndPressLeft(p->x + shiftx, p->y + shifty, &(this->windowsize), msec);
    delete p;
}
 
float GameWindow::getScreenshotAndfoundImageGiveDiff(int x, int y, int x2, int y2, const char* c, cv::Point* point){
    cv::Mat* src = this->getScreenshot(x, y, x2, y2);
    this->serviceShowImage(src);
    return takeScreenshotAndfoundImageGiveDiff(src, c, point);
}
 
float GameWindow::takeScreenshotAndfoundImageGiveDiff(cv::Mat* src, const char* c, cv::Point* point){
    cv::Mat templ = cv::imread(c, cv::IMREAD_COLOR);
    cv::Mat res;
    cv::Point minLoc;
    double minval, maxval;
    matchtemplaitingAndMinLoc(src, &templ, &res, &minLoc, &minval, &maxval);
    point = new cv::Point (minLoc.x + templ.cols/2, minLoc.y+templ.rows/2); // <----- Здесь значения minLoc и maxLoc ненулевые.
    src->release();
    return float(maxval-minval);
}
Добавлено через 3 часа 2 минуты
Нашёл решение. В 24 строчке значение указателя переписывается на новый адресс.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2019, 07:52
Ответы с готовыми решениями:

Ключи отображает корректно, а значения нет (при новом товаре пропадают старые значения)
Добрый день! Имеется база для отпуска товаров с магазинного склада, учет товаров происходит по партиям. при формировании...

Пропадают значения свойств в товарах
Здравствуйте, пропадают значения свойств в товарах. Подскажите плиз, с чем может быть связана проблема и как её решить.

В режиме Release пропадают значения переменных
Здравствуйте, уважаемые форумчане! Помогите разобраться с проблемкой. Программа запускается без ошибок в режиме отладки(debug), всё...

3
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.12.2019, 10:32
_20_, если у вас p планировался как output параметр, то его надо было передавать по ссылке (или по указателю - т.е. в вашем случае будет указатель на указатель).

Например:
C++
1
2
3
4
5
6
7
float GameWindow::getScreenshotAndfoundImageGiveDiff(int x, int y, int x2, int y2, const char* c, cv::Point* & point){
 
....
 
float GameWindow::takeScreenshotAndfoundImageGiveDiff(cv::Mat* src, const char* c, cv::Point* & point) {
 
....
Тогда вот это
C++
1
2
    cv::Point* p;
    float diff = getScreenshotAndfoundImageGiveDiff(x, y, x2, y2, c, p);
сработает как вы хотели.
1
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618
09.12.2019, 21:59  [ТС]
Всё - таки я не до конца понимаю. Сначала я создаю указатель, потом передаю его в функцию, потом передаю в другую функцию, там присваиваю ему значение. Почему при выходе из функции он обнуляется?

Перепишу ещу раз пример без лишнего кода.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void isImagePresentThenPressWithShift(int x, int y, int x2, int y2, const char* c, int msec = 0, int shiftx = 0, int shifty = 0);
 
void GameWindow::isImagePresentThenPressWithShift(int x, int y, int x2, int y2, const char* c, int msec, int shiftx, int shifty){
    cv::Point* p; // <------ Здесь = New cv::Point();
    float diff = getScreenshotAndfoundImageGiveDiff(x, y, x2, y2, c, p);
    delete p;
}
 
float GameWindow::getScreenshotAndfoundImageGiveDiff(int x, int y, int x2, int y2, const char* c, cv::Point* point){
    ....
    return takeScreenshotAndfoundImageGiveDiff(src, c, point);
}
 
float GameWindow::takeScreenshotAndfoundImageGiveDiff(cv::Mat* src, const char* c, cv::Point* point){
    point = new cv::Point (minLoc.x + templ.cols/2, minLoc.y+templ.rows/2); // <----- Здесь значения minLoc и maxLoc ненулевые.
    return float(maxval-minval);
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
09.12.2019, 22:05
_20_, потому что наделяете указатель какими-то магическими свойствами, когда на самом деле это точно такая же переменная, как например, int.

Добавлено через 1 минуту
Цитата Сообщение от _20_ Посмотреть сообщение
там присваиваю ему значение.
Не ему, а его копии.

Цитата Сообщение от _20_ Посмотреть сообщение
Почему при выходе из функции он обнуляется?
Не обнуляется, а остается в прежнем состоянии, как был до вызова.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.12.2019, 22:05
Помогаю со студенческими работами здесь

Пропадают значения isset($_GET['patid'])
Здравствуйте. Есть таблица которая передает значения методом $_GET на другую страницу. Там они принимаются isset($_GET). Я решил...

Как поменять значение числовой переменной в зависимости от значения текстовой переменной
Доброго вам времени суток! Ломаю голову на следующей задачей, и не знаю, где ошибка: может быть в JS или в html коде. Не могу...

Вычислить значение переменной Y по одному из заданных выражений в зависимости от значения переменной X
1)Для Вашего варианта таблицы 4.1 задайте в окне ввода значение переменной X с учетом заданного подтипа данных. При вводе маленьких или...

Изменение значения переменной, название которой находится в текстовой переменной
Подскажите как мне сделать: у меня есть цикл _0_gray = 1 for i in range(9): peremen = &quot;_&quot; + str(i) + &quot;_gray&quot;\ ...

Передача значения переменной одной формы в описание переменной другой
Всем привет. Не могу найти решение проблемы. На первой форме имеется глобальная переменная kol, которая содержит в себе число. на второй...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru