Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
#1

Оператор =. Не могу найти объяснение ситуации - C++

11.05.2012, 21:56. Просмотров 382. Ответов 7
Метки нет (Все метки)

вот этот код работает безошибочно и выдаёт всегда верные результаты
C++
1
2
3
4
5
6
7
8
            qDebug() << "oX[0] = " << pixelToRealX(zoomRect.x() + ( zoomRect.width() < 0 ) * zoomRect.width());
            qDebug() << "oX[1] = " << pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
            GLfloat cnt = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
            *oX = pixelToRealX(zoomRect.x() + ( zoomRect.width() < 0 ) * zoomRect.width());
            oX[1] = cnt;
            oX[2] = 0.;
            qDebug() << "oX[0] = " << *oX;
            qDebug() << "oX[1] = " << oX[1] << cnt << oX[1] - cnt;
а этот, в свою очередь, всегда работает не так как можно ожидать...
C++
1
2
3
4
5
6
7
            qDebug() << "oX[0] = " << pixelToRealX(zoomRect.x() + ( zoomRect.width() < 0 ) * zoomRect.width());
            qDebug() << "oX[1] = " << pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
            *oX = pixelToRealX(zoomRect.x() + ( zoomRect.width() < 0 ) * zoomRect.width());
            oX[1] = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
            oX[2] = 0.;
            qDebug() << "oX[0] = " << *oX;
            qDebug() << "oX[1] = " << oX[1];
гипотезы? предположения? какие числа выпадут в консоль если pixelToRealX - константный метод не меняющий аргументы
Код
oX[0] =  -0.508466 
oX[1] =  0.508466 
oX[0] =  -0.508466 
oX[1] =  1.61194 

oX[0] =  -3.01448 
oX[1] =  2.52417 
oX[0] =  -3.01448 
oX[1] =  2.53666 

oX[0] =  -2.02176 
oX[1] =  -0.484253 
oX[0] =  -2.02176 
oX[1] =  0.161972

oX[0] =  -2.00282 
oX[1] =  -0.397635 
oX[0] =  -2.00282 
oX[1] =  -0.392783
вот несколько примеров чисел попадающих в отладочную консоль... первая пара чисел всегда расчитана верно и всё путём... третье число, соответственно тоже. четвёртое - всегда ошибочно
oX объявлено как GLfloat oX[3]
pixelToRealX - функция inline GLfloat pixelToRealX(GLuint p) const { return XBegin() + ( XWidth() / linePlant.width() ) * (p - linePlant.x()); }
zoomRect и linePlant - надёжные библиотечные структуры данных.

Помогите разобраться в различиях между приведенными кодами
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2012, 21:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор =. Не могу найти объяснение ситуации (C++):

Что делает оператор init в данной ситуации (работа с двумерными массивами) - C++
Есть фрагмент кода C++. const int ROWS = 10, COLUMNS = 10; int matrix; init(&amp;matrix); int temp, sum = 0;

Оператор цикла. Не могу понять в чем ошибка - C++
Дано натуральное число. Найти сумму цифр этого числа. Верно ли, что число начинается и заканчивается одной и той же цифрой. //...

Как перегрузить оператор для класса. Хоть убейте, не могу - C++
Нужно поэлементно скопировать строки. Поэлементно, потому что задания другие, но мне нужно хотя бы это. Дальше уже легко. #include...

Проверьте пожалуйста правильность решения задачи и не могу понять тернарный оператор - C++
Задача из книги Васильева А.Н. &quot;Самоучитель С++&quot; Глава 1-я. Задача №4. Не могу понять как работает тернарный оператор или не заморачиваться...

Не могу найти нормальное объяснение, что такое замыкание(closure) в java. - Java SE
Не могу найти нормальное объяснение, что такое замыкание(closure) в java. Можете привести пример? Я так понял, это когда мы можем...

Найти в коде программы строку. Не могу найти где прописан конкретный оператор и действие - Turbo Pascal
Помогите пожалуйста найти в этом коде оператор или строку которая находит второй элемент, значение которого по модулю больше 5. 1. Дан...

7
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
11.05.2012, 22:45 #2
неверный код - точная копия того, что у вас в реальности?
к голову приходит только одна теория с нарушением доступа к памяти при записи в массив. но моя теория может оказаться правильной только если код на самом деле неколько другой (без упрощений для форума).
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
12.05.2012, 18:25  [ТС] #3
нет. код выдран из контекста без изменений...
0
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
12.05.2012, 20:29 #4
Большая вероятность, что ошибка всё-таки где-то в другом месте и небольшая, что ошибка в компиляторе/библиотеке. Хотя, конечно, не исключено, что я просто не вижу чего-то важного.
1
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.05.2012, 21:13 #5
моя теория заключалась в том, что oX все таки другого размера. и oX[1] - это выход за пределы.
далее, в первом варианте сразу же после объявления этого массива следовала переменная GLfloat cnt. ну она следующая по стеку за таким массивом и адреса &oX[1] и &cnt совпадают. Далее при вызове всяких там функция стек растет и заполняется всякой херней. перед выводом он возвращается к исходному размеру. Так вот в случае наличия переменной cnt весь хлам в памяти находится за этой переменной. поэтму oX[1] - это ссылка на эту переменную и в ней корректное значение. В случае, когда такой переменной нет &oX[1] - это как раз адрес начала хаоса и при попытке интерпретировать этот адрес как переменнюу типа GLfloat выводилось рандомное число.
Но раз все скопипасченно в точности, то эта теория не работает.
Можно попробовать поставить брейк поинт на адрес в памяти (&oX[1]) и соответственно увидеть, в каких местах идет обращения и изменения этой памяти.
1
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
12.05.2012, 21:26  [ТС] #6
oX объявлен как член класса задолго до вызова метода содержащего код. Нету ни малейшего шанса что он не из трёх элементов Мне очень интересно что спровоцировало такую ошибку... Дело в том, что даже если где-то ещё я как-то нарушил разграничение памяти (что в прочем противоречит моему стилю программирования и опровергается корректной работой остального кода), это же оператор =. Что бы я там не отчебучил, он должен записать в область памяти oX + 1 всё, что вернёт функция pixelToRealX и ничего более. Он же записывает число с какой-то погрешностью. Причём, не случайной. Во первых она есть всегда. Во вторых она пропорциональна (пропорция правда не линейная, и с ходу прикинуть какой-нибудь закон мне не удаётся) величине *oX.
Поверить в ошибку именно в этом месте действительно не легко. Но нет иного способа объяснить значения попадающие в отладочную печать.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.05.2012, 21:46 #7
есть еще вариант, когда локальная переменная скрывает переменную-член класса.
в вашем случае всегда должны совпадать (первое и третье числа) и (второе и четвертое). ведь несколько подряд идущих вызовов одного и того же всегда должены приводить к возврату одного и того же результата:
C++
1
2
3
4
5
6
7
val1 = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
val2 = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
val3 = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
val4 = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
...
valn = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
val1 == val2 == val3 == val4 ...
Можно побольше поэкспериментировать. что будет, если вот так вот написать например:
C++
1
2
3
4
5
6
7
8
9
const GLfloat 0x_0 = pixelToRealX(zoomRect.x() + ( zoomRect.width() < 0 ) * zoomRect.width());
const GLfloat 0x_1 = pixelToRealX(zoomRect.x() + ( zoomRect.width() > 0 ) * zoomRect.width());
*oX = 0x_0;
oX[1] = 0x_1;
oX[2] = 0.;
qDebug() << "oX[0] = " << 0x_0;
qDebug() << "oX[1] = " << 0x_1;
qDebug() << "oX[0] = " << *oX;
qDebug() << "oX[1] = " << oX[1];
Ну и самое надежное - отслеживать в дебагере изменение памяти по адресу 0x[1] в течении выполнения указанных глючных строчек.
1
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
12.05.2012, 22:00  [ТС] #8
Цитата Сообщение от DU Посмотреть сообщение
если вот так вот написать например:
так ошибки не возникает...
0
12.05.2012, 22:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2012, 22:00
Привет! Вот еще темы с ответами:

Не могу найти оператор-> - PHP
Встретил следующую строчку, не могу её прочитать while(false !== ($entry = $d-&gt;read())) Цикл Делать пока в переменной entry не...

Не могу найти ошибку с программой использующей оператор цикла с параметром - Turbo Pascal
Составить программу используя оператор цикла с параметром: Задана последовательность из n вещественных чисел. Определить сумму...

Напишите, пожалуйста объяснение к каждой строчке кода. Если можно, и объяснение некоторых функций - C (СИ)
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; void random(int * a, int size) { while(size--) *a++ = rand() % 9 + 1; } ...

Нужно найти выход из ситуации с опубликовкой - PHP
Имеется форма. в ней есть текстареа для заполнения. Пишу визуальный редактор яваскрипта. В конце формы есть кнопка сохранить изменения....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.