Errore di segmentazione (core dump creato) in C

di Anonimizzato13746 il
6 risposte
Ciao a tutti , scrivo un programma che preleva dei dati (numeri reali scritti con la seguente sintassi: z1 4 5.5) da un file e li mette in un albero per poi stamparli in modo ordinato ....purtroppo mi da l errore scritto nel titolo.... vi posto il codice

grazie mille

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct bin_tree {
char codice[4];
double reale;
double immaginaria;
struct bin_tree * right, * left;
};
typedef struct bin_tree node;

void insert(node **tree, char *cod_id, double val_reale, double val_immag );
void print_inorder(node *tree);

int main(void){
	
	/*Dichiarazioni delle variabili locali alla funzione*/
	
	FILE *file_numeri_reali;
	node *root;
	//node *temp;
		
	/* Acquisire i dati dal file */
	
    char buf[200];
	char *res;
	
	
	printf ("Lettura dati dal file e salvataggio dati nell albero binario \n");

		/* apre il file */
	file_numeri_reali=fopen("numeri_reali.txt", "r");
	if( file_numeri_reali==NULL ) {
		perror("Errore in apertura del file");
		return 1;
  }


		/* legge e stampa ogni riga */
	while(1) {
		char cod[4];
		double real=0;
		double immag=0;
		res=fgets(buf, 200, file_numeri_reali);
		if( res==NULL )
			break;
		
		sscanf (buf, "%s %lf %lf", cod, &real, &immag);
		
		
		
		printf("%s %lf %lf \n", cod, real, immag);
		
		insert (&root, cod, real, immag);
		
	}


	/* chiude il file */
	fclose(file_numeri_reali);
	
	printf("In Order Display\n");
    print_inorder(&root);

	return (0);
}

/*Definizione della funzione per inserire i valori nell albero*/

void insert(node **tree, char *cod_id, double val_reale, double val_immag )
{
    node *temp = NULL;
    if(!(*tree))
    {
        temp = (node *)malloc(sizeof(node));
        temp->left = temp->right = NULL;
        
		strcpy(temp->codice, cod_id);
		printf("codice %s \n", temp->codice);
        temp->reale = val_reale;
        temp->immaginaria = val_immag; 
        printf("parte reale %lf \n", temp->reale);
        printf("parte immaginaria %lf \n", temp->immaginaria);
        *tree = temp;
        return;
    }

    if(val_reale < (*tree)->reale)
    {
        insert(&(*tree)->left, cod_id, val_reale, val_immag);
    }
    else if(val_reale > (*tree)->reale)
    {
        insert(&(*tree)->right, cod_id, val_reale, val_immag);
    }

}

void print_inorder(node *tree)
{
    if (tree)
    {
        print_inorder(tree->left);
        printf("%s %lf %lf \n", tree->codice, tree->reale, tree->immaginaria);
        print_inorder(tree->right);
    }
}

edit :ho aggiornato il codide

6 Risposte

  • Hai fatto debugging?

    Hai trovato la linea che causa l'errore?

    Perché apri il file due volte?
  • Ciao Grazie per la risposta no non ho fatto il debug e appena torno a casa (tra poco) aggiornò il codice in cui ho corretto anche la copia della stringa con strcpy

    edit: ho aggiornato il codice
  • oregon ha scritto:


    Hai fatto debugging?

    Hai trovato la linea che causa l'errore?

    Perché apri il file due volte?
    ho fatto il debugging ...l errore è questo:
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000400b54 in print_inorder ()
    
    ma penso che ci sia qualche errore anche nella creazione dell albero

    edit :

    ora mi da quest errore :
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000400890 in insert ()
  • Nessuno?
  • A occhio e croce incolperei la scanf.
    Prova a leggere code con %3s 3 perché devi ricordarti dello \0
  • Ho sistemato era infatti un problema dello scanf
Devi accedere o registrarti per scrivere nel forum
6 risposte