Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глюк с if

1.6K
30 мая 2004 года
Tdr
154 / / 13.11.2003
Код:
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;


Чео за сабж такой?P(
2.0K
30 мая 2004 года
Androth
54 / / 07.03.2004
Цитата:
Originally posted by Tdr
// node->dwRpaz = 0. Здесь глюк.
if (node->dwRpaz != 0)
{
// node->dwRpaz == 0. Но попадаем сюда всеравно!
DelWallObj((void*)node->dwRpaz);
}

delete node;
break;



да не может там глюка быть, там и глючить то нечему
если попадает в ИФ, значит условие все таки соблюдено, следовательно глюк где то у тебя.

1.6K
30 мая 2004 года
Tdr
154 / / 13.11.2003
Цитата:
Originally posted by Androth


да не может там глюка быть, там и глючить то нечему
если попадает в ИФ, значит условие все таки соблюдено, следовательно глюк где то у тебя.


Так фишка в том, что TRACE и иже с ним выдают что переменная РАВНА НУЛЮ(!)
Я уже не знаю в каком месте надо бубном постучать...

1.6K
30 мая 2004 года
Tdr
154 / / 13.11.2003
Все, нашел.
У меня эти указатели хранятся в массиве, так после удаления SPaz размер его изменяется, и SWindow надо затирать в массиве по другому адресу.
Действительно надо было бубном... по голове!:D
1.6K
30 мая 2004 года
Tdr
154 / / 13.11.2003
Но все таки почему при нуле в if попадал?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог