2010-11-13 8 views
0

Ok, donc je travaille sur une mission et pour la vie de moi, je ne peux pas comprendre pourquoi je reçois ces failles de segmentation. Je suis encore en train d'apprendre le C++, la programmation en général, alors j'espérais que quelqu'un de plus sage que moi puisse m'aider. Le programme est un arbre de recherche binaire auto-organisé et je n'avais pas trop de difficulté avec ça jusqu'à maintenant. Voici le début d'un programme principal que j'utilise pour tester ma classe BST, je ne peux pas modifier le programme mian puisqu'il s'agit d'une affectation.Bizarre erreurs de segmentation de la segmentation

int main() { 
string input; 

// get a list of integer values 
cout << "Enter a list of integer values in one line: "; 
getline(cin, input); 

cout << "\n**CHECKPOINT 1**\n"; 

// create a binary search tree 
BST<int> bst1(input); 


if (!bst1.empty()) { 
    cout << "\n**CHECKPOINT 2**\n"; 
    cout << "Inorder traversal: "; 
    bst1.printInOrder(); 
    cout << "Level order traversal: "; 
bst1.printLevelOrder(); 

Je dois encore franchir la fonction printInOrder(), voici le code pour que

template <typename T> 
void BST<T>::printInOrder(BSTNode* t) const 
{ 
    if (t->left != NULL) 
     printInOrder(t->left); 
    std::cout << " " << t->data << " "; 
    if (t->right != NULL) 
     printInOrder(t->right); 
} 

La chose vraiment étrange qui me confond si cela quand j'ajoute un Cout rapide < < « Quelque chose » à la première ligne de la fonction printInOrder, tout d'un suddent sera la ligne d'impression

cout << "Inorder traversal: "; 

et il sera également commencer à imprimer quelques-uns des chiffres dans e L'arbre avant de me donner finalement un défaut de segmentation. Donc, je serais vraiment reconnaissant si quelqu'un pouvait m'expliquer WTF se passe. L'ajout ou la soustraction d'une ligne de cout simple ne devrait pas changer les choses comme ça le devrait? En outre, je pense qu'il y a de meilleures façons de déboguer cela, si quelqu'un a des techniques qu'ils utilisent pour comprendre ce truc, s'il vous plaît partager :) Merci d'avance! J'ai essayé le débogueur GDB, j'ai été incapable de le comprendre, mais je ne suis pas très bien versé dans les fonctionnalités avancées des débogueurs, donc j'ai peut-être raté quelque chose. La seule autre fonction exécutée est le constructeur à construire à partir de l'entrée de chaîne. D'après ce que je pourrais dire à partir du débogueur est que le constructeur semble fonctionner très bien, mais est néanmoins ici le code

template <typename T> 
BST<T>::BST(const std::string input, int th) 
{ 
    threshold = th; 
    root = NULL;   
    T v; 
    // Make Input String Stream for easy use of >> operator 
    std::istringstream iss (input); 
    do 
    { 
     iss >> v; 
     insert(v, root); 
    }while(iss.good()); 
} 

EDIT2:

Voici le code de ma fonction d'insertion, Merci pour l'aide Tout le monde! :) dans l'arbre

template <typename T> 
void BST<T>::insert(const T& v, BSTNode *&t) 
{ 
    if(t == NULL) 
     { 
      t = new BSTNode; 
      t->left = NULL; 
      t->right = NULL; 
      t->data = v; 
      t->searchCount = 0; 
     } 
    else if(v < t->data) 
     insert(v, t->left); 
    else 
     insert(v, t->right); 
} 
+0

Avez-vous essayé d'utiliser un débogueur pour voir où il s'est écrasé? – kennytm

+1

Si vous utilisez la sortie debug, utilisez peut-être 'std :: cerr' car il ne sera pas tamponné comme' std :: cout' – UncleBens

+0

Je pense que nous avons besoin de plus de code ici, ... peut-être que le problème est avec l'entrée. ..mais c'est vraiment impossible à dire sans plus de code ... –

Répondre

0

Dans le constructeur vous insérez v même si la lecture des données avec iss >> v échoué. Probablement que vous voulez plutôt quelque chose comme ceci:

while (iss >> v) { 
    insert(v, root); 
} 

Mais sans doute la vraie cause de votre erreur de segmentation réside dans insert(), par exemple, si cette fonction insère simplement un pointeur sur le paramètre (Superposer alloué), il reçoit dans l'arbre. La variable de paramètre sortira de la portée à la fin de la fonction (et cessera donc d'exister). Si vous venez de stocker un pointeur sur cette variable dans l'arborescence, ce pointeur ne pointera plus vers rien d'utile.

+0

Malheureusement, la modification de ces lignes n'a pas semblé résoudre le problème:/ – Ben

1

Il y a un manque marqué de nouvelles lignes dans votre sortie. Souvent, la mise en mémoire tampon de ligne signifie que vous ne voyez rien jusqu'à ce qu'un saut de ligne soit rencontré.

Je modifie la ligne après la PrintOnOrder à ceci: -

cout << "\nLevel order traversal: "; 
+0

Les retours à la ligne ne vident pas nécessairement le tampon avec le caractère de saut de ligne, IIRC. Cependant, l'utilisation de std :: endl va vider le tampon. –

0

Je ne vois rien de mal ici.Comme d'autres l'ont souligné, la mise en mémoire tampon de sortie peut signifier que votre code termine effectivement printInOrder() avec succès, puis se bloque quelque part plus tard.