Отладка Visual Studio 2010 "if (var == NULL)" не запускается - PullRequest
6 голосов
/ 17 ноября 2010

Решено - Проблема с конструктором

Мэтью Флашен и Майкл Барр указал на проблему перегруженного конструктора Node(int), вызывающего Node(), который не работает , потому что ... Спасибо, ребята!


Я создал программу (я отлаживаю ее) и столкнулся со странной проблемой ... Оператор `if` не запускается, когда это должно быть ... Это школьный проект, в котором мы должны создать Дерево AVL с хотя бы одной «оптимизирующей» функцией.

Я уверен и проверил, что `rdown` и` ldown` работают (как факторы балансировки) - дерево не идеально сбалансировано. Скорее он основан на высоте ветвей (то есть - «balance ()» должен возвращать только (1,0, -1), в противном случае он не сбалансирован.

Надеюсь, этого достаточно, чтобы решить эту странную проблему ... Я никогда не сталкивался с чем-то подобным в Microsoft Visual Studio 2010.

Структура узла:

struct Node {
    int data;           // the data in the Node
    int rdown;          // the number of ellements below the node on the right side
    int ldown;          // the number of ellements below the node on the left side
    Node * parrent;     // the node's parrent
    Node * lchild;      // the nodes left child
    Node * rchild;      // the nodes right child

    Node () { rdown = 0, ldown = 0; data = 0; parrent = NULL; lchild = NULL; rchild = NULL; }
    Node (int dat) {rdown = 0, ldown = 0; parrent = NULL; lchild = NULL; rchild = NULL; data = dat; } 
    bool end() { if (lchild == NULL && rchild == NULL) return true;     // check if this node is the 'end of the line' - where it doesn't
                 return false; }                                        // have any children
    bool goodToAdd() { if (lchild == NULL || rchild == NULL) return true;   // make sture the current node has at least one spot to add
                       return false; }                                      // a new node to - either lchild or rchild must be NULL

    int balance() { return (ldown - rdown); }                           // get a balance number for the node
};

Функция поиска, вызывающая проблемы

Node * AVL_Tree::search(const Node * num) {
 Node * tmpNode = AVL_Tree::root;      // tmpNode is a place holder for the search
 for (int i = 1; true; i++) {     // increment int i to check for excess searching -> pervents endless loop
  if (tmpNode == NULL) //****** causing problems********  // the search has reached a dead end (the data is not contained) ==>  NULL
   return NULL;
  if (tmpNode->data == num->data)   // if the data of num is the same as tmpNode the data is contained ==>  Node *
   return tmpNode;
            // since the node has not been found yet move down the tree...
  if (tmpNode->data > num->data && tmpNode->lchild != NULL) // if the data is smaller than the tmpNode move to the lchild
   tmpNode = tmpNode->lchild;
  else if (tmpNode->rchild != NULL)    // since the node has been proven to not be = to the data to be searched for
   tmpNode = tmpNode->rchild;    // and it is not smaller... move to the right

  if (i > (root->ldown + 1) && i > (root->rdown + 1) ) {  // the while loop has searched suffecent time and has not ended
   string tmp = "the search incountered a critical error... aborting..."; // to prevent an endless loop the string error
   throw tmp;            // is thrown (should not happen) - indicates a broken tree
  }
 }
}

Скриншот первого столкновения с for loop

alt text

Снимок экрана второй встречи с for loop

Если вы заметили на вкладке «Авто» внизу, что все данные и адрес самого узла - NULL - все же на следующем снимке экрана это продолжается alt text

Программа продолжается !!! что?>!

Я нажал F-10 (кнопка «перейти к следующей команде») ... и она перепрыгнула прямо через оператор? Зачем? alt text

Ответы [ 4 ]

4 голосов
/ 17 ноября 2010

0xcdcdcdcd не является указателем NULL - это значение используется в отладочных сборках MSVC для памяти, которая была выделена, но не инициализирована.

См. Когда и почему ОС инициализирует память0xCD, 0xDD и т. д. для malloc / free / new / delete? для получения более подробной информации.

Корень вашей проблемы может быть в конструкторе, который принимает параметр int:

Node (int dat) { Node(); data = dat; } 

Оператор Node(); в конечном итоге ничего не делает.Этот конструктор не инициализирует большинство членов структуры.

2 голосов
/ 17 ноября 2010

tmpNode не равно нулю на любом снимке экрана.

Сначала 0x00294820, затем 0xcdcdcdcd.Вторым является магическое значение отладки для неинициализированной malloc редактируемой памяти.

1 голос
/ 17 ноября 2010

NULL в C ++ имеет тенденцию быть (но не обязательно) 0.

На ваших вторых / третьих скриншотах tmpNode = 0xcdcdcdcd, что не NULL.0xcdcdcdcd - это значение, которое Visual Studio присваивает неинициализированным переменным (при запуске отладочной версии).

Убедитесь, что инициализированы все поля всех ваших узлов:

Node* root = NULL;
or
Node* root = new Node(); //Don't forget to delete!

Установка полей в NULLв C ++ не выполняется автоматически, как в других языках, таких как Java и C #.

0 голосов
/ 17 ноября 2010

tmpNode ссылается на неинициализированную память, которая, как правило, не гарантируется равной нулю.Например, следующее утверждение не гарантирует, что tmpNode является нулевым.

Node* tmpNode;  // or assignment to another uninitialized variable.

Вы присваиваете tmpNode для root, и я подозреваю, что root неинициализирован, следовательно, ненулевоезначение tmpNode.Пожалуйста, проверьте вашу инициализацию root - я не могу комментировать это, поскольку вы не опубликовали этот конкретный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...