Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] problema di segmentation fault

    Salve,
    Il codice dovrebbe generare un albero di ricerca derivato da un array e stampare la visita simmetrica purtroppo mi da segmentation fault subito dopo aver immesso i valori dell'array ,
    tramite varie prove son riuscito a capire che l'errore deve stare nelle righe tra l'inizio del main e l'allocazione dinamica del puntatore alla struct nodo p,
    qualcuno è così gentile da spiegarmi come mai incorro in questa segmentation fault ? proprio non riesco a spiegarmi il perchè

    codice:
    // VISITA SIMMETRICA RICORSIVA ALL'ALBERO
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct nodo* punt;
    
    struct nodo{
      int dato;
      punt sx;
      punt dx;
    };
    
    void NodeGen(int *A, int i, punt p){
      punt temp;
      punt predec;
      
      temp=(punt)malloc(sizeof(struct nodo));
       
      predec=(punt)malloc(sizeof(struct nodo));
      *predec=*p;
      
      
      while(predec!=NULL){
       
        *temp=*predec;
        if(A[i]>predec->dato)
          predec=predec->dx;
        else
          predec=predec->sx;
      }
      
      if(A[i]>temp->dato)
        temp->dx=predec;
      if(A[i]<temp->dato)
        temp->sx=predec;
       
      predec->dato=A[i]; 
      predec->sx=NULL;
      predec->dx=NULL;
      
     
     
    }
    
    void VisitaSimmetrica(punt p){
      
      if(p->sx!=NULL && p->dx!=NULL){
        VisitaSimmetrica(p->sx);
        printf("%d", p->dato);
        VisitaSimmetrica(p->dx);
      }
         
      else{
          if(p->sx==NULL ){
    	if(p->dx==NULL){
    	  printf("%d",p->dato);
    	}
    	else{
    	  printf("%d",p->dato);
    	  VisitaSimmetrica(p->dx);
    	}
          }
          else{
    	if(p->dx==NULL){
    	  VisitaSimmetrica(p->sx);
    	  printf("%d",p->dato);
    	}
    	
          }
      } 
    }
    
    int main(){
      int i,N;
      int *A;
      punt p;
      
      scanf("%d",&N);
      
      A=malloc(N*sizeof(int));
      
      for(i=0;i<N;i++)
      scanf("%d",&A[i]);
      
      printf(" è ora della Segmentation Fault ");
      p=(punt)malloc(sizeof(struct nodo)); 
     
      p->dato=A[0];
      p->sx=NULL;
      p->dx=NULL;
    
      
      for(i=1;i<N;i++)
        NodeGen(A,i,p);
      
      VisitaSimmetrica(p);
    
      
      
    }

  2. #2
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116
    a occhio sembra che nel passaggio
    codice:
      predec->dato=A[i]; 
      predec->sx=NULL;
      predec->dx=NULL;
    il puntatore predec punti a NULL, pertanto c'e' l'errore.
    Comunue usa nomi "sensati" per le variabili :'( please, ogni volta che si legono questi codici ci si perde sempre tempo a capire cos'e' P o A o Z o V, un bel nome tipo Puntatore_Testa oppure Root_Pointer o Root_P, cosa simile, pleeeeeeeease :'(
    codice:
     $(".canaglia").show()

  3. #3
    non credo che l'errore dipenda da quegli assegnamenti , li sto solo riempendo i campi della nuova foglia dell'albero( si chiama predec perchè precede temp seguendo il percorso dell'albero fino a diventare null ).
    L'errore non può risiedere lì ( secondo me) perchè la segmentation fault avviene prima che si lanci la funzione NodeGen ( che serve a generare i nodi dell'albero) - lo ho provato mettendo una printf all'entrata della funzione e osservando che questa non veniva stampata-

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    No Ifrit ha ragione, avevo constatato anche io che il segmentation fault si verificasse in corrispondenza delle istruzioni che dice lui e mi ero dato la stessa spiegazione che dice lui.

    Quanto usi delle printf() di debug ricorda di mettere sempre '\n' alla fine della stringa di formato, altrimenti è probabile che questa non ti venga stampata fino alla prossima istruzione di output a video (e nel tuo programma "la prossima" non c'è, visto che quella è l'unica), invece con '\n' forzi lo svuotamento dello stream di output.

    Per esempio, compilando ed eseguendo il tuo codice così com'è ottengo:

    codice:
    5
    1
    2
    3
    4
    5
    Segmentation fault
    invece, aggiundendo semplicemente '\n' qui:

    codice:
      printf(" è ora della Segmentation Fault \n");
    ottengo

    codice:
    5
    1
    2
    3
    4
    5
     è ora della Segmentation Fault
    Segmentation fault
    In ogni caso, giusto per quotare in toto il post di Ifrit, mi associo al suo "grido di dolore": fate sì che il codice sia facilmente intellegibile (oltre che leggibile!) senza costringere chi vuole tentare di darvi una mano a martellarsi il cranio per capire cosa voi avevate intenzione di fare... l'ideale è usare non solo nomi di variabili sensate ma anche i benedetti commenti
    every day above ground is a good one

  5. #5
    Son davvero ignorante, scusate.
    Tra l'altro Ifrit mi ha individuato anche un altro errore.
    Grazie cercherò di usare nomi di variabili + significativi.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.