Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Segmentation fault
Forum - C/C++ - Segmentation fault - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 12:33
Domenica, 05/02/2012
effettivamente sono solo 3-4 mesi che programmo ad oggetti.
Ho iniziato il corso a settembre.

Comunque ho corretto, ma persiste l' errore di segmentazione, che il debug di Code::blocks (programmo sotto ubuntu) mi segnala alla riga 44 del file class_function.cpp

Intanto ti ringrazio, perchè sei stato molto disponibile con un newbie come me.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:01
Domenica, 05/02/2012
Infatti ti avevo detto di non aver controllato il resto del codice ... penso che ci siano altri problemi e correggendo il prossimo non è detto che non ce ne sia un altro e così via ...

Dato che la riga 44 per te non so quale sia, dovresti sempre indicare quale è nel codice ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 13:18
Domenica, 05/02/2012
Ho aggiornato il file class_func.cpp con le tue correzioni, e sempre secondo il debug l'errore è al while della riga 44

Codice sorgente - presumibilmente C++

  1. #include  "class_header.h"
  2.  
  3. PILA padre;     // stack globale per trovare nodo padre
  4.  
  5. // inizializza albero vuoto
  6. /*RB RedBlack::build (RB tree) {
  7.           tree = new RedBlack;
  8.           tree = NULL;
  9.           tree->left = NULL;
  10.           tree->right = NULL;
  11.           return tree;
  12. };*/
  13.  
  14. RedBlack::RedBlack () {
  15.     left = right = parent = NULL;
  16.     colore = red;
  17.     }
  18.  
  19. // pulisco lo stack ed inserisco una sentinella
  20. void RedBlack::erase () {
  21.         padre.clear();
  22.         padre.push_back (NULL);
  23. };
  24.  
  25.  
  26. RB RedBlack::balance (RB &tree,RB &nodo,string chiave) {
  27.     tree = insert (tree,nodo,chiave);
  28.     RB root = new RedBlack ();
  29.     root = tree;
  30.  
  31.     // se è radice, colore è nero.
  32.     if (nodo == root) {
  33.         nodo->parent = NULL;
  34.         nodo->colore = black;
  35.         }
  36.  
  37.     else nodo->colore = red;
  38.  
  39.     // ripristina lo stack per trovare il padre
  40.     erase ();
  41.  
  42.     RB y = new RedBlack ();
  43.  
  44.     while ((nodo->parent->colore == red) && (nodo->parent != NULL))  {     // e se il colore del padre è ROSSO
  45.             if (nodo->parent == nodo->parent->parent->left) {
  46.              y = nodo->parent->parent->right;
  47.  
  48.             if (y->colore == red) {
  49.                 nodo->parent->colore = black;
  50.                 y->colore = black;
  51.                 nodo->parent->parent->colore = red;
  52.                 nodo = nodo->parent->parent;
  53.                 }   // fine IF
  54.  
  55.             else if (nodo == nodo->parent->right) {
  56.                 nodo = nodo->parent;
  57.               left_rotate (nodo,root);    // albero nodo
  58.                 nodo->parent->colore = black;
  59.                 nodo->parent->parent->colore = red;
  60.                 //right_rotate;   // albero padre padre nodo
  61.                 } // fine ELSE IF
  62.         } // if IF GENERALE
  63.     // -------------------------------------------------------
  64.             else  {
  65.             y = nodo->parent->parent->left;
  66.  
  67.             if (nodo == nodo->parent->left) {
  68.                 nodo = nodo->parent;
  69.                 left_rotate (nodo,root);    // albero nodo
  70.                 nodo->parent->colore = black;
  71.                 nodo->parent->parent->colore = red;
  72.                // right_rotate;   // albero padre padre nodo
  73.                 } // fine IF
  74.  
  75.  
  76.             } // fine ELSE
  77.         }   // fine WHILE
  78.  
  79.         return tree;
  80. }
  81.  
  82. // inserisco il termine all' interno dell' albero
  83. RB RedBlack::insert(RB &tree, RB &nodo, string chiave)  {
  84.  
  85.     // inserisci il termine
  86.     if (tree == NULL) {
  87.     nodo = new RedBlack();
  88.  
  89.     nodo->parola = chiave;
  90.     nodo->left = NULL;
  91.     nodo->right = NULL;
  92.     nodo->parent = padre.back();                        // il padre è l' ultimo nodo esaminato
  93. //    tree = nodo;
  94.     return nodo;
  95.     }
  96.  
  97.     // determina la posizione del nodo
  98.     else if (chiave < tree->parola) {
  99.        padre.push_back (tree);                         // salva il nodo appena esaminato per trovare il padre
  100.         return insert (tree->left,nodo,chiave);
  101.     }
  102.  
  103.     else if (chiave > tree->parola) {
  104.          padre.push_back (tree);
  105.             return insert (tree->right,nodo,chiave);
  106.     }
  107. }
  108.  
  109.  
  110. RB RedBlack::left_rotate (RB &nodo,RB& root) {
  111.     RB y = new RedBlack ();
  112.     y = nodo->right;
  113.     nodo->right = y->left;
  114.  
  115.     if (y->left != NULL) {
  116.         y->left->parent = nodo;
  117.         y->parent = nodo->parent;
  118.  
  119.         if (nodo->parent == NULL) root = y;
  120.         else if (nodo == nodo->parent->left) nodo->parent->left = y;
  121.         else nodo->parent->right = y;
  122.  
  123.     y->left = nodo;
  124.     nodo->parent = y;
  125.     } // fine IF
  126.  
  127.     return nodo;
  128. }
  129.  
  130. // stampa l' albero
  131. void RedBlack::write (RB tree,int i) {
  132.     if (tree != NULL) {
  133.         write (tree->right,i+1);
  134.         for (int j = 1; j <= i; j++) cout << "   ";
  135.  
  136.         cout << tree->parola << endl;
  137.         write (tree->left,i+1);
  138.     }
  139. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:45
Domenica, 05/02/2012
Facendo un po' di debug si capisce che il problema è determinato dal fatto che in quel punto

nodo->parent

è null


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 18:06
Domenica, 05/02/2012
E quindi non dovrebbe proprio entrare nel while essendoci una and?
Comunque, come posso risolvere la questione?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:42
Domenica, 05/02/2012
Perchè non dovrebbe entrare? Come fa se non valuta tutte e due le parti della and?

Per risolvere devi fare in modo che se

nodo->parent

è NULL allora NON deve esaminare il valore di

nodo->parent->colore

altrimenti avrai l'errore.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 16:24
Martedì, 07/02/2012
quindi suggerisci di scrivere 2 volte il corpo del while che cambia solo se nodo->parent è uguale a NULL. altrimenti rimane lo stesso?

Perdonami se ti chiedo di trattarmi come un bambino da imboccare, ma non ho ancora acquisito la giusta dimestichezza al momento...

EDIT: con questa soluzione mi stampa solo l' ultimo elemento caricato. Deduco quindi di aver capito male

Ultima modifica effettuata da flavio89 il 07/02/2012 alle 16:32
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:52
Martedì, 07/02/2012
Sì, ho capito che inizi a programmare però io ti posso dire quali sono i problemi per cui il programma si blocca non se il criterio che hai scelto è corretto (se hai scelto un algoritmo appropriato e se l'hai convertito in codice altrettanto corretto).

Ovvero, per capirci, io ti dico che quel puntatore è null e quindi hai l'errore. Stop.

Il perché è null e cosa fare per correggere il programma rendendolo funzionante secondo quello che tu vuoi fare, tocca a te ...

Per esempio, hai corretto il codice ma non hai mostrato come lo hai corretto, perché hai fatto quelle correzioni, cosa ti aspetti dal ciclo che hai corretto e cosa invece succede ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo