Что за .....
От: Anpek  
Дата: 12.05.11 08:09
Оценка:
Вот простенький кодец


BoundingBox& BoundingBox::combine(const BoundingBox& bx)
{
    if (m_IsEmpty && !bx.m_IsEmpty)
    {
        m_Lower= bx.m_Lower;    //  111
        m_Upper= bx.m_Upper;
        m_IsEmpty= bx.m_IsEmpty;
    }
...
}


После строчки 111 меняется константная структура bx

И как это понимать? А главное — как это поправить?
Re: Что за .....
От: Сергей Мухин Россия  
Дата: 12.05.11 08:10
Оценка: +1
Здравствуйте, Anpek, Вы писали:


A>И как это понимать? А главное — как это поправить?


this == bx??
---
С уважением,
Сергей Мухин
Re[2]: Что за .....
От: Anpek  
Дата: 12.05.11 08:15
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>this == bx??


Вроде единственно разумное объяснение, но нет , перепроверил this — это не bx.
Сначала думал на кривую оптимизацию компилятора, но тожде не она — отключил все оптимизации
Re[3]: Что за .....
От: Сергей Мухин Россия  
Дата: 12.05.11 08:18
Оценка:
Здравствуйте, Anpek, Вы писали:


A>Вроде единственно разумное объяснение, но нет , перепроверил this — это не bx.


а поля set/get и простые данные

A>Сначала думал на кривую оптимизацию компилятора, но тожде не она — отключил все оптимизации


нуну. 99% это ошибки пользователя, еще 0.99% ошибки отладчика и тп.

а уж про компилятор, да в таком простом случае — даже не думайте.
---
С уважением,
Сергей Мухин
Re[2]: Что за .....
От: uzhas Ниоткуда  
Дата: 12.05.11 08:22
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:


СМ>this == bx??

странно, что при этом прорвались через if

TC:
вы слишком маленький код предоставили
покажите определение BoundingBox
возможно, m_Lower является ссылкой, которая указывает на потроха bx
Re: Что за .....
От: Centaur Россия  
Дата: 12.05.11 08:27
Оценка:
Здравствуйте, Anpek, Вы писали:

A>BoundingBox& BoundingBox::combine(const BoundingBox& bx)
A>{
A>    if (m_IsEmpty && !bx.m_IsEmpty)
A>    {
A>        m_Lower= bx.m_Lower;    //  111
A>        m_Upper= bx.m_Upper;
A>        m_IsEmpty= bx.m_IsEmpty;
A>    }
A>...
A>}


A>После строчки 111 меняется константная структура bx

A>
A>И как это понимать? А главное — как это поправить?

Каким образом определено, что структура меняется? Каким образом определено, что она меняется именно после этой строчки? Если это всё определено наблюдением за окном watch или локальных переменных в отладчике Visual Studio, то откуда уверенность, что отладчик показывает именно то, что происходит в действительности?
Re[3]: Что за .....
От: Сергей Мухин Россия  
Дата: 12.05.11 08:28
Оценка:
Здравствуйте, uzhas, Вы писали:


СМ>>this == bx??

U>странно, что при этом прорвались через if

да, но может цитата коротковата.
Например тип поляЮ или операция ! хз какая и тп
---
С уважением,
Сергей Мухин
Re[2]: Что за .....
От: Anpek  
Дата: 12.05.11 08:29
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Каким образом определено, что структура меняется? Каким образом определено, что она меняется именно после этой строчки? Если это всё определено наблюдением за окном watch или локальных переменных в отладчике Visual Studio, то откуда уверенность, что отладчик показывает именно то, что происходит в действительности?


Да, именно через это окно и слежу за этой структурой. Она точно меняется, потому что программа некорректно себя ведет. И ведет себя именно так, как если бы эта структруа менялась
Re: Локализованнее
От: Anpek  
Дата: 12.05.11 08:39
Оценка:
m_Lower — это вектор в пространстве. Таким обазом строчка
m_Lower= bx.m_Lower;

Это оператор присваивания вот такой

inline Vector3d& operator = (const Vector3d &vect)
    {
        if (this != &vect) 
            memcpy(m_Vector, vect.m_Vector, sizeof(double) * 3);
        return *this;
    }


где m_Vector — это double[3]

Так вот, в этом операторе дебаггер заходит в ветку if (this != &vect) и (OOO, УЖАС), после вызова memcpy меняется vect.m_Vector

Указатели m_Vector и vect.m_Vector — разные.

Какого ....
Re[2]: Локализованнее
От: Anpek  
Дата: 12.05.11 08:52
Оценка: :))
Здравствуйте, Anpek, Вы писали:

Офигеть. Вместо

memcpy(m_Vector, vect.m_Vector, sizeof(double) * 3);


Поставил тупое

m_Vector[0] = vect.m_Vector[0];
m_Vector[1] = vect.m_Vector[1];
m_Vector[2] = vect.m_Vector[2];


И ... ВСЕ ЗАРАБОТАЛО!!!

Что за херня творится? Сегодня какая-то особенная фаза луны?
Re[2]: Локализованнее
От: minorlogic Украина  
Дата: 12.05.11 09:01
Оценка:
Здравствуйте, Anpek, Вы писали:

A>Это оператор присваивания вот такой


A>
A>inline Vector3d& operator = (const Vector3d &vect)
A>    {
A>        if (this != &vect) 
A>            memcpy(m_Vector, vect.m_Vector, sizeof(double) * 3);
A>        return *this;
A>    }
A>


A>где m_Vector — это double[3]


Тогда зачем вы переопределили оператор присванвания ? если он ведет себя как дефолтный ? внести побольше багов?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Локализованнее
От: Skipy Rich Россия  
Дата: 12.05.11 10:41
Оценка:
Здравствуйте, Anpek, Вы писали:

sizeof(double) * 3 равен ли sizeof(m_Vector)? может нестандартное выравнивание установлено?
Re[3]: Локализованнее
От: Vain Россия google.ru
Дата: 12.05.11 21:26
Оценка:
Здравствуйте, Anpek, Вы писали:

A>Офигеть. Вместо

A>
A>memcpy(m_Vector, vect.m_Vector, sizeof(double) * 3);
A>

A>Поставил тупое
A>
A>m_Vector[0] = vect.m_Vector[0];
A>m_Vector[1] = vect.m_Vector[1];
A>m_Vector[2] = vect.m_Vector[2];
A>

A>И ... ВСЕ ЗАРАБОТАЛО!!!
A>Что за херня творится? Сегодня какая-то особенная фаза луны?
А если заменить на:
memcpy(m_Vector, vect.m_Vector, sizeof(m_Vector));
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Локализованнее
От: gegMOPO4  
Дата: 13.05.11 13:33
Оценка: :))
Здравствуйте, Anpek, Вы писали:
A>Так вот, в этом операторе дебаггер заходит в ветку if (this != &vect) и (OOO, УЖАС), после вызова memcpy меняется vect.m_Vector
A>Указатели m_Vector и vect.m_Vector — разные.
A>Какого ....

#define memcpy(a,b,c) memcpy((void*)(b),(a),(c))
Re: Что за .....
От: Vain Россия google.ru
Дата: 14.05.11 09:23
Оценка:
Здравствуйте, Anpek, Вы писали:

A>Вот простенький кодец

A>
A>BoundingBox& BoundingBox::combine(const BoundingBox& bx)
A>{
A>    if (m_IsEmpty && !bx.m_IsEmpty)
A>    {
A>        m_Lower= bx.m_Lower;    //  111
A>        m_Upper= bx.m_Upper;
A>        m_IsEmpty= bx.m_IsEmpty;
A>    }
A>...
A>}
A>

A>После строчки 111 меняется константная структура bx
A>
A>И как это понимать? А главное — как это поправить?
А reinterpret_cast'ов над типом до этого никаких не делали? Может оно вообще до этого было другим типом?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Локализованнее
От: trophim Россия  
Дата: 15.05.11 07:04
Оценка: -1
А может и вовсе виртуальные функции у вектора есть... Тада memcpy — это пипец
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Let it be! — Давайте есть пчелу!
Re[5]: Локализованнее
От: wander  
Дата: 15.05.11 11:01
Оценка:
Здравствуйте, trophim, Вы писали:

T>А может и вовсе виртуальные функции у вектора есть... Тада memcpy — это пипец

Там вектор — double[3].
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.