PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > comp.lang.cplus > SEGFAULTS cant figure it out
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
SEGFAULTS cant figure it out

Réponse
 
LinkBack Outils de la discussion
Vieux 11/12/2007, 04h48   #1
rez151@gmail.com
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut SEGFAULTS cant figure it out

trying to create a tree of hash nodes, with each node having a max of
5 objects, and a maximum of 5 child nodes...we insert 6 sucesfully and
"explode" to create 3 child nodes, but when it gets to 7 our temp node
has null pointers???


DRIVER PROGRAM::
#include <iostream>
#include "MLH.h"
using std::cout;
using std::endl;

int main()
{
MLH< int > tree;

for(int i = 1; i<=300; i++)
{
tree.MLH_insert(i, i );

}

tree.print();


}







MLH.H (data structure)::

#include <iostream>
using std::cout;
using std::endl;
#define Max_levels 8
#include "node.h"
#include "ML_hash.h"

template< typename T >
class MLH
{
friend class Node< T >;
public:
MLH();
int MLH_insert(int, const T &data);
int MLH_delete(int);
int MLH_get(int);
int explode(Node< T > *current, Object< T > *newObj);
int collapse(Node< T > *curr, int);
void print_rec(Node< T > *temporary);
void print();
private:
Node< T > Sentinel;
Node< T > *temp;
int Dlevel;
Node< T > nodecount[Max_levels];
int counter;
};

template< typename T >
MLH< T >::MLH()
{
// for (int i = 0; i < Max_levels; i++)
// nodecount[i] = 0;
counter = 0;
Dlevel = 0;

}

template< typename T >
int MLH< T >::MLH_insert(int id, const T &data)
{

temp = &Sentinel;
Node< T > *countpath;
int nextnode;

while(1)
{
if (temp->count > num_ob) //checks if the node is a stem node
{

nextnode = ML_hash(temp->level + 1, id);
if (temp->nArray[nextnode]==NULL)
{
Node< T > *newNode = new Node< T >();
Object< T > *newObj = new Object< T >(id, data);

temp->nArray[nextnode] = newNode;
newNode->up = temp;
newNode->level= temp->level +1;
counter++;
if (newNode->level > Dlevel)
Dlevel = newNode->level;

temp = newNode;

int r = 0;
while (temp->objectarray[r] != NULL && r<5)
{
r++;
}
temp->objectarray[r] = newObj;

cout<< "You have successfully inserted the
object! Noobsicle!" << endl;
counter++;
countpath = temp;
while (countpath->up != NULL)
{
countpath->count++;
counter++;
countpath = countpath->up;
}
Sentinel.count++;
return 1;
}
else{
temp= temp->nArray[nextnode];

counter++;

// continue;
}
}

if (temp->count < num_ob) /*checks if node has enough space in it*/
{
for(int i = 0; i < num_ob; i++)
{
if (temp->objectarray[i] != NULL)
{
if (temp->objectarray[i]->key == id)
{
cout << "Object is already in list! Noobsicle!" << endl;
counter++;
return 0;

}

}


}
for(int h = 0; h < num_ob; h++)
{
if(temp->objectarray[h] == NULL)
{

Object< T > *newObj = new Object< T >(id, data);
temp->objectarray[h] = newObj;

cout<< "You have successfully inserted the object! Noobsicle!" <<
endl;
counter++;
countpath = temp;
while (countpath->up != NULL)
{
countpath->count++;
counter++;
countpath = countpath->up;
}
Sentinel.count++;
return 1;
}

}
break;
}

if (temp->count == num_ob)
{
//first need to check to see if the element is already there
for(int j = 0; j < num_ob; j++)
{


if (temp->objectarray[j]->key == id)
{
cout << "Object is already in list! Noobsicle!"
<< endl;
counter++;
return 0;
}

}
Object< T > *newObj = new Object< T >(id, data);
explode(temp, newObj);//moves the current objects in that node into
another node below it
//then it inserts the object we wish to insert
return 1;
}
}


}



template< typename T >
int MLH< T >::MLH_delete(int id)
{
temp = &Sentinel;
int nextnode;
Node< T > *countpath;
int noob;

while(1)
{
if (temp->count > num_ob)
{


nextnode = ML_hash(temp->level + 1, id);
temp = temp->nArray[nextnode];
counter++;
continue;
}

if (temp->count < num_ob)
{
for(int i = 0; i < num_ob; i++)
{
if (temp->objectarray[i] != NULL)
{
if (temp->objectarray[i]->key == id)
{
// temp->count--;
countpath = temp;
// noob = i;
while (countpath->up != NULL)
{
countpath->count--;
countpath = countpath->up;
counter++;
}
Sentinel.count--;



delete temp->objectarray[i];

while(temp->objectarray[i+1] != NULL && (i+1) < num_ob ){

temp->objectarray[i] = temp->objectarray[i+1];
i++;
}
temp->objectarray[i] = NULL;
cout << "Object was Deleted! Noobsicle!" << endl;
collapse(temp, nextnode);
counter++;
return 1;

}

}
}
for(int h = 0; h < num_ob; h++)
{
if(temp->objectarray[h] == NULL)
{

counter++;
cout<< "The object you are looking for was not found! Noobsicle!"
<< endl;
return 0;
}

}
break;
}

if (temp->count == num_ob)
{
for(int j = 0; j < num_ob; j++)
{


if (temp->objectarray[j]->key == id)
{
// temp->count--;
countpath = temp;
// noob = j;

while (countpath->up != NULL)
{
countpath->count--;
counter++;
countpath = countpath->up;
}
Sentinel.count--;

delete temp->objectarray[j];

while(temp->objectarray[j+1] != NULL && (j+1) < num_ob){
temp->objectarray[j] = temp-
>objectarray[j+1];

j++;
}
temp->objectarray[j] = NULL;
counter++;
cout << "Object was Deleted! Noobsicle!" <<
endl;
collapse(temp, nextnode);
//run collapse() or should i make check in here?
return 1;
}

}
}
}




}



template< typename T >
int MLH< T >::MLH_get(int id)
{

temp = &Sentinel;
int nextnode;

while(1)
{
if (temp->count > num_ob)
{
nextnode = ML_hash(temp->level + 1, id);
counter++;
temp = temp->nArray[nextnode];
continue;
}

if (temp->count < num_ob)
{
for(int i = 0; i < num_ob; i++)
{
if (temp->objectarray[i] != NULL)
{
if (temp->objectarray[i]->key == id)
{
counter++;
cout << "Object was found! Noobsicle!" << endl;
return 1;

}

}
}
for(int h = 0; h < num_ob; h++)
{
if(temp->objectarray[h] == NULL)
{

counter++;
cout<< "The object you are looking for is was not found!
Noobsicle!" << endl;
return 0;
}

}
break;
}

if (temp->count == num_ob)
{
for(int j = 0; j < num_ob; j++)
{


if (temp->objectarray[j]->key == id)
{
cout << "Object was found Noobsicle!" <<
endl;
counter++;
return 1;
}

}
}
}




}





template< typename T >
int MLH< T >::explode(Node< T > *current, Object< T > *newObj)
{
int hashpath;
int ki;
int x=0;
Node< T > *countpath;

while(x != 1){

for (int k = 0; k < num_ob; k++)
{
ki = current->objectarray[k]->key;
hashpath = ML_hash(current->level+1 , ki);
if (current->nArray[hashpath]==NULL){
Node< T > *newNode = new Node< T >();
current->nArray[hashpath] = newNode;
newNode->up = current;
newNode->level= current->level +1;
counter++;
if (newNode->level > Dlevel)
Dlevel = newNode->level;
}
int r=0;
while (current->nArray[hashpath]->objectarray[r] != NULL && ( r <
num_ob) ){
r++;
}
current->nArray[hashpath]->objectarray[r] = current->objectarray[k];
current->nArray[hashpath]->count++;

/* ignore
countpath = current->nArray[hashpath];
while (countpath->up != NULL)
{
countpath->count++;
countpath = countpath->up; //doesnt add to Sentinel's count
}
Sentinel.count++;
*/
}



hashpath = ML_hash(current->level+1, newObj->key); //hashpath of the
element that i want to insert

if (current->nArray[hashpath]==NULL){
Node< T > *newNode = new Node< T >();
current->nArray[hashpath] = newNode;
newNode->up = current;
newNode->level= current->level + 1;
counter++;
if (newNode->level > Dlevel)
Dlevel = newNode->level;
}


for(int b=0; b<num_ob; b++)
{
if (current->nArray[hashpath]->objectarray[b] == NULL)
x=1;
//there is space in the node

}

if (x!=1){
current = current->nArray[hashpath];
continue;

}

int r=0;
while (current->nArray[hashpath]->objectarray[r] != NULL && r
< num_ob ){
r++;
}
current->nArray[hashpath]->objectarray[r] = newObj;

countpath = current->nArray[hashpath];
while (countpath->up != NULL)
{
countpath->count++;
countpath = countpath->up;
counter++;
}
Sentinel.count++;
return 1;

}

}


template< typename T >
int MLH< T >::collapse(Node< T > *curr, int nn) /*return 0 if no need
to collapse*/
{

for (int f=0; f<num_ob; f++)
{
if (curr->objectarray[f] != NULL) //there is an object in the node
{
return 0;
}
}

if (curr == Sentinel)
return 0;

if (curr->level == Dlevel)
Dlevel--;
delete curr->up->nArray[nn];
curr->up->nArray[nn] = NULL;
curr = curr->up;

int i= 0;

while (curr->up->nArray[i] != curr) //not sure if this works???
{
i++; //location of curr in the nArray of the node above it
}

/*
for(int i = 0; i<num_ob; i++)
{
if (curr->up->nArray[i] == curr) //not sure if this works
break;

}
*/
collapse(curr, i);

}

template< typename T >
void MLH< T >::print()
{
Node< T > *tem = &Sentinel;

if (tem->count <= num_ob)
{


for (int i = 0; i < num_ob; i++)
{
if (tem->objectarray[i] != NULL)
{
cout << "Object: " << tem->objectarray[i]->data << " Level: " <<
tem->level << endl;
}
}

}
else{
for (int i = 0; i < num_ob; i++)
{
if(tem->nArray[i] != NULL)
{
print_rec(tem->nArray[i]);
}

}


}
cout << "Number of Objects in list: " << Sentinel.count << endl;
cout << "Deepest node level in repository: "<< Dlevel <<endl;


}


template< typename T >
void MLH< T >::print_rec(Node< T > *tem)
{

if (tem->count <= num_ob)
{


for (int i = 0; i < num_ob; i++)
{
if (tem->objectarray[i] != NULL)
{
cout << "Object: " << tem-
>objectarray[i]->data << " Level: " << tem->level << endl;

}
}

}
else{
for (int i = 0; i < num_ob; i++)
{
if(tem->nArray[i] != NULL)
{
print_rec(tem->nArray[i]);
}

}


}
cout << "Number of Objects in list: " << Sentinel.count <<
endl;
cout << "Deepest node level in repository: "<< Dlevel <<endl;


}





  Réponse avec citation
Vieux 11/12/2007, 05h10   #2
Xcool2004@gmail.com
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: SEGFAULTS cant figure it out

It looks like u took a shit on your keyboard to make this explosive
piece of glassy shit. You should probably go cut off your hands and
never program again unless u rly like drowning kittens in the sea of
shit u produce.
  Réponse avec citation
Vieux 11/12/2007, 14h57   #3
Ondra Holub
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: SEGFAULTS cant figure it out

On 11 Pro, 05:48, rez...@gmail.com wrote:
> trying to create a tree of hash nodes, with each node having a max of
> 5 objects, and a maximum of 5 child nodes...we insert 6 sucesfully and
> "explode" to create 3 child nodes, but when it gets to 7 our temp node
> has null pointers???
>
> DRIVER PROGRAM::
> #include <iostream>
> #include "MLH.h"
> using std::cout;
> using std::endl;
>
> int main()
> {
> MLH< int > tree;
>
> for(int i = 1; i<=300; i++)
> {
> tree.MLH_insert(i, i );
>
> }
>
> tree.print();
>
> }
>
> MLH.H (data structure)::
>
> #include <iostream>
> using std::cout;
> using std::endl;
> #define Max_levels 8
> #include "node.h"
> #include "ML_hash.h"
>
> template< typename T >
> class MLH
> {
> friend class Node< T >;
> public:
> MLH();
> int MLH_insert(int, const T &data);
> int MLH_delete(int);
> int MLH_get(int);
> int explode(Node< T > *current, Object< T > *newObj);
> int collapse(Node< T > *curr, int);
> void print_rec(Node< T > *temporary);
> void print();
> private:
> Node< T > Sentinel;
> Node< T > *temp;
> int Dlevel;
> Node< T > nodecount[Max_levels];
> int counter;
>
> };
>
> template< typename T >
> MLH< T >::MLH()
> {
> // for (int i = 0; i < Max_levels; i++)
> // nodecount[i] = 0;
> counter = 0;
> Dlevel = 0;
>
> }
>
> template< typename T >
> int MLH< T >::MLH_insert(int id, const T &data)
> {
>
> temp = &Sentinel;
> Node< T > *countpath;
> int nextnode;
>
> while(1)
> {
> if (temp->count > num_ob) //checks if the node is a stem node
> {
>
> nextnode = ML_hash(temp->level + 1, id);
> if (temp->nArray[nextnode]==NULL)
> {
> Node< T > *newNode = new Node< T >();
> Object< T > *newObj = new Object< T >(id, data);
>
> temp->nArray[nextnode] = newNode;
> newNode->up = temp;
> newNode->level= temp->level +1;
> counter++;
> if (newNode->level > Dlevel)
> Dlevel = newNode->level;
>
> temp = newNode;
>
> int r = 0;
> while (temp->objectarray[r] != NULL && r<5)
> {
> r++;
> }
> temp->objectarray[r] = newObj;
>
> cout<< "You have successfully inserted the
> object! Noobsicle!" << endl;
> counter++;
> countpath = temp;
> while (countpath->up != NULL)
> {
> countpath->count++;
> counter++;
> countpath = countpath->up;
> }
> Sentinel.count++;
> return 1;
> }
> else{
> temp= temp->nArray[nextnode];
>
> counter++;
>
> // continue;
> }
> }
>
> if (temp->count < num_ob) /*checks if node has enough space in it*/
> {
> for(int i = 0; i < num_ob; i++)
> {
> if (temp->objectarray[i] != NULL)
> {
> if (temp->objectarray[i]->key == id)
> {
> cout << "Object is already in list! Noobsicle!" << endl;
> counter++;
> return 0;
>
> }
>
> }
>
> }
> for(int h = 0; h < num_ob; h++)
> {
> if(temp->objectarray[h] == NULL)
> {
>
> Object< T > *newObj = new Object< T >(id, data);
> temp->objectarray[h] = newObj;
>
> cout<< "You have successfully inserted theobject! Noobsicle!" <<
> endl;
> counter++;
> countpath = temp;
> while (countpath->up != NULL)
> {
> countpath->count++;
> counter++;
> countpath = countpath->up;
> }
> Sentinel.count++;
> return 1;
> }
>
> }
> break;
> }
>
> if (temp->count == num_ob)
> {
> //first need to check to see if the element is already there
> for(int j = 0; j < num_ob; j++)
> {
>
> if (temp->objectarray[j]->key == id)
> {
> cout << "Object is already in list! Noobsicle!"
> << endl;
> counter++;
> return 0;
> }
>
> }
> Object< T > *newObj = new Object< T >(id, data);
> explode(temp, newObj);//moves the current objects in that node into
> another node below it
> //then it inserts the object we wish to insert
> return 1;
> }
> }
>
> }
>
> template< typename T >
> int MLH< T >::MLH_delete(int id)
> {
> temp = &Sentinel;
> int nextnode;
> Node< T > *countpath;
> int noob;
>
> while(1)
> {
> if (temp->count > num_ob)
> {
>
> nextnode = ML_hash(temp->level + 1, id);
> temp = temp->nArray[nextnode];
> counter++;
> continue;
> }
>
> if (temp->count < num_ob)
> {
> for(int i = 0; i < num_ob; i++)
> {
> if (temp->objectarray[i] != NULL)
> {
> if (temp->objectarray[i]->key == id)
> {
> // temp->count--;
> countpath = temp;
> // noob = i;
> while (countpath->up != NULL)
> {
> countpath->count--;
> countpath = countpath->up;
> counter++;
> }
> Sentinel.count--;
>
> delete temp->objectarray[i];
>
> while(temp->objectarray[i+1] != NULL && (i+1) < num_ob ){
>
> temp->objectarray[i] = temp->objectarray[i+1];
> i++;
> }
> temp->objectarray[i] = NULL;
> cout << "Object was Deleted! Noobsicle!" << endl;
> collapse(temp, nextnode);
> counter++;
> return 1;
>
> }
>
> }
> }
> for(int h = 0; h < num_ob; h++)
> {
> if(temp->objectarray[h] == NULL)
> {
>
> counter++;
> cout<< "The object you are looking for wasnot found! Noobsicle!"
> << endl;
> return 0;
> }
>
> }
> break;
> }
>
> if (temp->count == num_ob)
> {
> for(int j = 0; j < num_ob; j++)
> {
>
> if (temp->objectarray[j]->key == id)
> {
> // temp->count--;
> countpath = temp;
> // noob = j;
>
> while (countpath->up != NULL)
> {
> countpath->count--;
> counter++;
> countpath = countpath->up;
> }
> Sentinel.count--;
>
> delete temp->objectarray[j];
>
> while(temp->objectarray[j+1] != NULL && (j+1) < num_ob){
> temp->objectarray[j] = temp->objectarray[j+1];
>
> j++;
> }
> temp->objectarray[j] = NULL;
> counter++;
> cout << "Object was Deleted! Noobsicle!" <<
> endl;
> collapse(temp, nextnode);
> //run collapse() or should i make check in here?
> return 1;
> }
>
> }
> }
> }
>
> }
>
> template< typename T >
> int MLH< T >::MLH_get(int id)
> {
>
> temp = &Sentinel;
> int nextnode;
>
> while(1)
> {
> if (temp->count > num_ob)
> {
> nextnode = ML_hash(temp->level + 1, id);
> counter++;
> temp = temp->nArray[nextnode];
> continue;
> }
>
> if (temp->count < num_ob)
> {
> for(int i = 0; i < num_ob; i++)
> {
> if (temp->objectarray[i] != NULL)
> {
> if (temp->objectarray[i]->key == id)
> {
> counter++;
> cout << "Object was found! Noobsicle!" << endl;
> return 1;
>
> }
>
> }
> }
> for(int h = 0; h < num_ob; h++)
> {
> if(temp->objectarray[h] == NULL)
> {
>
> counter++;
> cout<< "The object you are looking for is was not found!
> Noobsicle!" << endl;
> return 0;
> }
>
> }
> break;
> }
>
> if (temp->count == num_ob)
> {
> for(int j = 0; j < num_ob; j++)
> {
>
> if (temp->objectarray[j]->key == id)
> {
> cout << "Object was found Noobsicle!" <<
> endl;
> counter++;
> return 1;
> }
>
> }
> }
> }
>
> }
>
> template< typename T >
> int MLH< T >::explode(Node< T > *current, Object< T > *newObj)
> {
> int hashpath;
> int ki;
> int x=0;
> Node< T > *countpath;
>
> while(x != 1){
>
> for (int k = 0; k < num_ob; k++)
> {
> ki = current->objectarray[k]->key;
> hashpath = ML_hash(current->level+1 , ki);
> if (current->nArray[hashpath]==NULL){
> Node< T > *newNode = new Node< T >();
> current->nArray[hashpath] = newNode;
> newNode->up = current;
> newNode->level= current->level +1;
> counter++;
> if (newNode->level > Dlevel)
> Dlevel = newNode->level;
> }
> int r=0;
> while (current->nArray[hashpath]->objectarray[r] != NULL&& ( r <
> num_ob) ){
> r++;
> }
> current->nArray[hashpath]->objectarray[r] = current->objectarray[k];
> current->nArray[hashpath]->count++;
>
> /* ignore
> countpath = current->nArray[hashpath];
> while (countpath->up != NULL)
> {
> countpath->count++;
> countpath = countpath->up; //doesnt add to Sentinel's count
> }
> Sentinel.count++;
> */
> }
>
> hashpath = ML_hash(current->level+1, newObj->key); //hashpath ofthe
> element that i want to insert
>
> if (current->nArray[hashpath]==NULL){
> Node< T > *newNode = new Node< T >();
> current->nArray[hashpath] = newNode;
> newNode->up = current;
> newNode->level= current->level + 1;
> counter++;...
>
> èíst dál >>


Your example is quite long for quick answer and I am afraid that
you'll find hardly someone to go through whole code. Try to reduce
your code to minimal size, where the problem still remains. It usualy
leads to identification of problem. When not, try to post some
minimized code again.
  Réponse avec citation
Vieux 11/12/2007, 15h27   #4
anon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: SEGFAULTS cant figure it out

rez151@gmail.com wrote:
> trying to create a tree of hash nodes, with each node having a max of
> 5 objects, and a maximum of 5 child nodes...we insert 6 sucesfully and
> "explode" to create 3 child nodes, but when it gets to 7 our temp node
> has null pointers???
>
>


Why don't you debug it yourself? You can take a look at valgrind's memcheck.
  Réponse avec citation
Vieux 11/12/2007, 20h09   #5
Default User
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: SEGFAULTS cant figure it out

Xcool2004@gmail.com wrote:

> It looks like u


Need to be plonked.




Brian
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 07h37.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,25562 seconds with 13 queries