Глюк с if
Код:
struct SWindow
{
DWORD dwNodeID; // тип ( = WALL_OBJ_WINDOW);
DWORD dwLpaz; // указатель на SPaz;
DWORD dwRpaz; // указатель на SPaz;
};
struct SPaz
{
DWORD dwNodeID; // тип ( = WALL_OBJ_PAZ);
DWORD dwParent; // указатель на SWindow;
};
BOOL DelWallObj(void* pObj)
{
switch(*(DWORD*)pObj) // здесь проверяется dwNodeID
{
...
case WALL_OBJ_WINDOW:
{
SWindow *node = (SWindow*)pObj;
if (node->dwLpaz != 0)
{
DelWallObj((void*)node->dwLpaz);
}
if (node->dwRpaz != 0)
{
DelWallObj((void*)node->dwRpaz);
}
delete node;
break;
}
...
case WALL_OBJ_PAZ:
{
SPaz *node = (SPaz*)pObj;
if (node->dwParent)
{
SWindow *w = (SWindow*)node->dwParent;
if (w->dwLpaz == (DWORD)node)
{
w->dwLpaz = NULL;
}
else if (w->dwRpaz == (DWORD)node)
{
w->dwRpaz = NULL;
}
}
delete node;
break;
}
...
}
// Есть несколько структур в памяти:
struct SWindow (SWindow* = 111111)
dwNodeID = WALL_OBJ_WINDOW;
dwLpaz = 222222;
dwRpaz = 333333;
struct SPaz (SPaz* = 222222)
dwNodeID = WALL_OBJ_PAZ;
dwParent = 111111;
struct SPaz (SPaz* = 333333)
dwNodeID = WALL_OBJ_PAZ;
dwParent = 111111;
// Допустим, сначала киляем SPaz:
DelWallObj(333333);
// Тогда SWindow =
dwNodeID = WALL_OBJ_WINDOW;
dwLpaz = 222222;
dwRpaz = 0;
// Теперь киляем SWindow:
DelWallObj(111111);
// Вот здесь и происходит интересное:
SWindow *node = (SWindow*)pObj;
// node->dwLpaz = 222222. Тут все нормально.
if (node->dwLpaz != 0)
{
DelWallObj((void*)node->dwLpaz);
}
// node->dwRpaz = 0. Здесь глюк.
if (node->dwRpaz != 0)
{
// node->dwRpaz == 0. Но попадаем сюда всеравно!
DelWallObj((void*)node->dwRpaz);
}
delete node;
break;
{
DWORD dwNodeID; // тип ( = WALL_OBJ_WINDOW);
DWORD dwLpaz; // указатель на SPaz;
DWORD dwRpaz; // указатель на SPaz;
};
struct SPaz
{
DWORD dwNodeID; // тип ( = WALL_OBJ_PAZ);
DWORD dwParent; // указатель на SWindow;
};
BOOL DelWallObj(void* pObj)
{
switch(*(DWORD*)pObj) // здесь проверяется dwNodeID
{
...
case WALL_OBJ_WINDOW:
{
SWindow *node = (SWindow*)pObj;
if (node->dwLpaz != 0)
{
DelWallObj((void*)node->dwLpaz);
}
if (node->dwRpaz != 0)
{
DelWallObj((void*)node->dwRpaz);
}
delete node;
break;
}
...
case WALL_OBJ_PAZ:
{
SPaz *node = (SPaz*)pObj;
if (node->dwParent)
{
SWindow *w = (SWindow*)node->dwParent;
if (w->dwLpaz == (DWORD)node)
{
w->dwLpaz = NULL;
}
else if (w->dwRpaz == (DWORD)node)
{
w->dwRpaz = NULL;
}
}
delete node;
break;
}
...
}
// Есть несколько структур в памяти:
struct SWindow (SWindow* = 111111)
dwNodeID = WALL_OBJ_WINDOW;
dwLpaz = 222222;
dwRpaz = 333333;
struct SPaz (SPaz* = 222222)
dwNodeID = WALL_OBJ_PAZ;
dwParent = 111111;
struct SPaz (SPaz* = 333333)
dwNodeID = WALL_OBJ_PAZ;
dwParent = 111111;
// Допустим, сначала киляем SPaz:
DelWallObj(333333);
// Тогда SWindow =
dwNodeID = WALL_OBJ_WINDOW;
dwLpaz = 222222;
dwRpaz = 0;
// Теперь киляем SWindow:
DelWallObj(111111);
// Вот здесь и происходит интересное:
SWindow *node = (SWindow*)pObj;
// node->dwLpaz = 222222. Тут все нормально.
if (node->dwLpaz != 0)
{
DelWallObj((void*)node->dwLpaz);
}
// node->dwRpaz = 0. Здесь глюк.
if (node->dwRpaz != 0)
{
// node->dwRpaz == 0. Но попадаем сюда всеравно!
DelWallObj((void*)node->dwRpaz);
}
delete node;
break;
Чео за сабж такой?P(
Цитата:
Originally posted by Tdr
// node->dwRpaz = 0. Здесь глюк.
if (node->dwRpaz != 0)
{
// node->dwRpaz == 0. Но попадаем сюда всеравно!
DelWallObj((void*)node->dwRpaz);
}
delete node;
break;
// node->dwRpaz = 0. Здесь глюк.
if (node->dwRpaz != 0)
{
// node->dwRpaz == 0. Но попадаем сюда всеравно!
DelWallObj((void*)node->dwRpaz);
}
delete node;
break;
да не может там глюка быть, там и глючить то нечему
если попадает в ИФ, значит условие все таки соблюдено, следовательно глюк где то у тебя.
Цитата:
Originally posted by Androth
да не может там глюка быть, там и глючить то нечему
если попадает в ИФ, значит условие все таки соблюдено, следовательно глюк где то у тебя.
да не может там глюка быть, там и глючить то нечему
если попадает в ИФ, значит условие все таки соблюдено, следовательно глюк где то у тебя.
Так фишка в том, что TRACE и иже с ним выдают что переменная РАВНА НУЛЮ(!)
Я уже не знаю в каком месте надо бубном постучать...
У меня эти указатели хранятся в массиве, так после удаления SPaz размер его изменяется, и SWindow надо затирать в массиве по другому адресу.
Действительно надо было бубном... по голове!:D
Но все таки почему при нуле в if попадал?