?

Log in

No account? Create an account
14 мар, 2006 @ 17:53 осмелюсь сделать новый пост


оригинальные посты:
http://community.livejournal.com/ru_programming/450360.html?#cutid1
http://community.livejournal.com/ru_programmers/68984.html?#cutid1
http://community.livejournal.com/gamedev_ru/48603.html?#cutid1

есть код:
inline void centrePosition()
{
if (m_position.x > m_centerX)
{
fix32 x = m_position.x-m_centerX;
m_distance += x;
}
}

fix32 - это знаковый 4-байтный целый тип.
все переменные имеют этот тип.

итак, при входе в ф-ю, имеем вот такие значения:
m_distance 0x00000000 long
m_position.x 0x003ce664 long
m_centerX 0x003c0000 long

трассируем. получаем, что
x 0x0000e664 long

все вроде ок. но стоит сделать m_distance += x, как она имеет такие значения:
m_distance 0x64000000 long


после долгого и глубокого дебага, а также премудорствований, пришел к тому, что убирание во всем коде inline ничем не помогло. анализ асмовского кода тоже ничего не дал.

но тут пришла безумно глупая мысль. вот ее суть:

было
u8 m_angleFrame;
fix32 m_distance;

сделал
u16 m_angleFrame;
fix32 m_distance;

что должно было быть в m_distance в действительности: 0x0000e664
что было в первом случае: 0x64000000
что стало во втором: 0xe6640000

заменил на u32 - фффсе заработало!

u32, u16, u8 - это беззнаковые целые 32-битные, 16-битные, 8-битные типы соответственно.

какие еще будут соображения?!
sergey_orel:
[User Picture Icon]
From:alex_ez
Date:Апрель, 6, 2006 02:49 (UTC)
(Ссылка)
он их криво складывает...
(Ответить) (Ветвь дискуссии)