?

Log in

No account? Create an account
14 мар, 2006 @ 14:23 чувствую себя идиотом!


вот код, который дебажу:

inline void centrePosition()
{
if (m_position.x > m_centerX)
{
fix32 x = m_position.x-m_centerX;
m_distance += x;//m_position.x-m_centerX;
m_distance += x;

m_position.x -= x<<16;

m_position.x = m_centerX;
}
}


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

вот объясните как такое может быть?!

вообще, тестирую на эмуляторе под BREW (мобильник).

sergey_orel:
From:anatas
Date:Март, 14, 2006 03:55 (UTC)
(Ссылка)
бывает если дебажиш под релизом, то дебаговая инфа принимает произволные значения. проверь отладочные опции компилятора.
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 03:58 (UTC)
(Ссылка)
опции проверял и даже пробовал менять.
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 04:26 (UTC)
(Ссылка)
пробуй все выводить в трейс
вычитать/прибавлять константы, или, например, может прибавить не х, а 2*х и трассировать
какой тип у икса?
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 04:27 (UTC)
(Ссылка)
проверь на всякий случай все типы, заведи еще переменных этого же и других типов, посмотри как они себя ведут...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 04:31 (UTC)
(Ссылка)
проверял типы. даже адреса переменных сравнивал :/
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 04:33 (UTC)
(Ссылка)
кросавчег, попробуй арифметику проверить
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:01 (UTC)
(Ссылка)
кросавчег, а что проверять-то?! m_distance+=x?! мошь скажешь где здесь ошибка?!
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:05 (UTC)
(Ссылка)
выше четай... попробуй поскладывать константы и прочее... еще у тебя там сдвиг есть... его посмотри...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:11 (UTC)
(Ссылка)
про сдвиг забудь - его нет =) я ниже написал про это
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 04:34 (UTC)
(Ссылка)
чето я тупанул...
m_position.x -= x<<16; - вот эта строчка че делает?..
скобки поставь...

почему два раза m_distance += x; ?
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:06 (UTC)
(Ссылка)
тьфу бля!

inline void centrePosition()
{
if (m_position.x > m_centerX)
{
fix32 x = m_position.x-m_centerX;
m_distance += x;
m_position.x = m_centerX;
}
}

вот код. все остальное было в комментах - просто не вырезал :/
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:15 (UTC)
(Ссылка)
сделай m_distance = m_distance + x;
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:16 (UTC)
(Ссылка)
о! это наверное изза inline!..
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:20 (UTC)
(Ссылка)
у меня тоже такая мысль возникла. но если убрать, то СИЛЬНО фпс упадет :/ хотя... если поможет, то можно сделать условную компиляцию для дебага и для релиза...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:21 (UTC)
(Ссылка)
#ifndef DEBUG
inline
#endif
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:25 (UTC)
(Ссылка)
если уж на то пошло, то на много эффективней сделать так:
#ifndef DEBUG
#define _INLINE_ inline
#else
#define _INLINE_
#endif

и везде где надо вставлять _INLINE_, а не inline
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:31 (UTC)
(Ссылка)
хм... не помогло...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:31 (UTC)
(Ссылка)
проверяй все с нуля, везде трассируй, что тут можно сказать, гдето крешится, даже не понятно изза чего...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:33 (UTC)
(Ссылка)
на девайсе все ок :/ явно либо с компилятором, либо с эмулятором траблы.
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:38 (UTC)
(Ссылка)
видимо эмулятор
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:16 (UTC)
(Ссылка)
кстати, глянь че за код на ассемблере он собирает...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 05:34 (UTC)
(Ссылка)
inline void centrePosition()
{
023A207A push ebp
023A207B mov ebp,esp
023A207D push ecx
023A207E push ecx
023A207F mov dword ptr [ebp-8],ecx

if (m_position.x > m_centerX)
023A2082 mov eax,dword ptr [this]
023A2085 mov ecx,dword ptr [this]
023A2088 mov eax,dword ptr [eax+8]
023A208B cmp eax,dword ptr [ecx+44h]
023A208E jle CCrab::centrePosition+40h (23A20BAh)
{
fix32 x = m_position.x-m_centerX;
023A2090 mov eax,dword ptr [this]
023A2093 mov ecx,dword ptr [this]
023A2096 mov eax,dword ptr [eax+8]
023A2099 sub eax,dword ptr [ecx+44h]
023A209C mov dword ptr [x],eax
m_distance += x;//m_position.x-m_centerX;
023A209F mov eax,dword ptr [this]
023A20A2 mov eax,dword ptr [eax+4Ch]
023A20A5 add eax,dword ptr [x]
023A20A8 mov ecx,dword ptr [this]
023A20AB mov dword ptr [ecx+4Ch],eax

/* u32 x = (m_position.x-m_centerX)>>16;

m_distance += x;

m_position.x -= x<<16;

*/

m_position.x = m_centerX;
023A20AE mov eax,dword ptr [this]
023A20B1 mov ecx,dword ptr [this]
023A20B4 mov ecx,dword ptr [ecx+44h]
023A20B7 mov dword ptr [eax+8],ecx
}
}
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:alex_ez
Date:Март, 14, 2006 05:31 (UTC)
(Ссылка)
а
#define inline inline
нельзя сделать?.. ;)
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:sergey_orel
Date:Март, 14, 2006 06:42 (UTC)
(Ссылка)
товарисчи! это пиздетс!

было
u8 m_angleFrame;
fix32 m_distance;
сделал
u16 m_angleFrame;
fix32 m_distance;

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

заменил на u32 - фффсе заработало! какие еще будут соображения?!
(Ответить) (Ветвь дискуссии)