Errore durante l'esecuzione del programma (segmentation fault)

di il
23 risposte

Errore durante l'esecuzione del programma (segmentation fault)

Salve a tutti,
avrei bisogno di una mano. Premetto che non sono pratica di questa materia e non capisco se mi parlate molto tecnico. Devo fare un esame di fondamenti di informatica. Vorrei capire dove sto sbagliando. Ho fatto un semplice programmino che sto cercando di far girare su un compilatore online di c++. Mi da il seguente problema: sgmentation fault. Ma che significa? Qualcuno può inidcarmi dove c'è l'errore?
Grazie Anna

#include <stdio.h>
#include <string.h>
#define MAX_DIM 20

struct studenti
{char nome [10];
char cognome [10];
int voto;
};

int leggi_file (FILE*, struct studenti*);
void ordina_alfabetico_cognome (struct studenti*, int);
void ordina_voto (struct studenti*, int);
void salva_su_file (FILE, struct studenti*, int);

int main()
{
FILE *fo, *fr;
struct studenti classe [MAX_DIM];
int N=0, i;
fo= fopen ("oggi.txt", "r");
if(fo==NULL)
printf ("Il file è inesistente");
else
N= leggi_file (fo, classe);
ordina_alfabetico_cognome (classe, N);
for (i=0; i<N; i++)
{printf ("i cognomi sono: %s\n", classe[i].cognome);
for (i=0; i<N; i++)
{printf ("che voto vuoi dare al signore: %s %s\n", classe[i].nome, classe[i].cognome);
scanf ("%d", &classe[i].voto);
}
}
fclose (fo);

ordina_voto (classe,N);

fr= fopen ("risultati.txt", "w");
if (fr!=NULL)
salva_su_file (fr, classe, N);
fclose (fr);
}

int leggi_file (FILE*f, struct studenti*A)
{ 
int i=0;
while(fscanf(f, "%s %s", A[i].nome, A[i].cognome)!=EOF)
i++;
return(i);
}

void ordina_alfabetico_cognome (struct studenti*A, int dim)
 { int i, j, imin, test;
   struct studenti temp;
   for (i=0; i<dim-1;i++)
  { imin = i;
    for (j=0; j<dim; j++)
   { test = strcmp(A[j].cognome, A[imin].cognome);
     if (test<0)
    imin = j;
   }
     temp = A[i];
     A[i] = A[imin];
     A[imin] = temp;
  }
 }


void ordina_voto (struct studenti*A, int n)
 { int i, j, imax;
   struct studenti temp;
   for (i=0; i<n; i++)
  { imax = i;
    for (j=i+1; j<n; j++)
   { if(A[j].voto > A[imax].voto)
    { imax = j; }
   temp = A[i];
   A[i] = A[imax];
   A[imax] = temp;
   }
  }
 }

void salva_su_file (FILE*g, struct studenti*A, int n)
{
int i;
for (i=0; i<n; i++)
{fprintf (g,"%s %s %d", A[i].cognome, A[i].nome,
A[i].voto);}
}

23 Risposte

  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Ma perché hai scritto nel thread di un altro utente?
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Perchè è lo stesso problema e non posso aprire un altro topic?
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Ciao anna ti faccio presente che ci sono delle regole. Uno delle tante é quello di non contaminare i thread degli altri utenti almeno che non sia un proseguimento di pensiero. Un altro é quelli di mettere i tag code nella parte dove hai scritto del codice. Questo per essere compresi meglio e facilitarci con la risoluzione del problema. Adesso vedo se posso rimediare ma la prossima volta la fai tu ok
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    an2 ha scritto:


    perchè è lo stesso problema e non posso aprire un altro topic?
    E' "lo stesso errore" ma il tuo programma è diverso. E non si può rispondere contemporaneamente nello stesso thread a due utente che hanno programmi diversi.

    Non ho capito la questione del "compilatore online" ... alla fine hai un eseguibile da testare nel tuo PC?

    E il file da leggere "oggi.txt" è presente ? Quali dati contiene ?

    Non sono riuscito a replicare il tuo problema. Quando te lo dà?
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Scusatemi, ma non ho capito proprio che errore ho fatto nel violare le regole. Dovevo aprire un altro topic per questo problema nonostante sia lo stesso ma per un programma diverso? inoltre cos'è un tag code? lo ammetto in materia sono ignorante!! Non mi sono mai iscritta ad un forum per cui sono nuova di zecca, perdonatemi per l'errore.
    E' una traccia di esame. Il file oggi.txt contiene solo nomi e cognomi...il professore richiedeva: aprire il file, verificare l esistenza, ordinare i cognomi in maniere crescente quindi alfabetica, poi stampare a video: che voto vuoi assegnare a tizio e caio? assegnare il voto (sempre a video), infine ordinare il voto in maniera decrescente e salvare tutto in un file chiamato risultati.txt, di cui bisogna verificare l'esistenza. Ho provato a farlo, e l'ho fatto girare su un sito ....che ha quindi un compliatore online. Così come vedete il programma mi da il problema di segmentation fault. (Essendo lo stesso errore, ho pensato di non aprire un altro topic con lo stesso nome e problema, vi chiedo ancora scusa e aspetto indicazioni più semplice però ). Grazie a tutti.
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

        if (fr!=NULL)
        salva_su_file (fr, classe, N);
    Da notare che salva_su_file aspetta un FILE e tu li passi un FILE *. Da qui la domanda:

    Ma si può sapere che compilatore on line hai usato se il tuo codice non è neanche compilabile?
    Se sei nuova significa prima leggere le regole di un forum e poi agire.
    Il problema deriva dal fatto che il compilatore non vede il file.txt passato e quindi ti stampa che il file è inesistente nella riga 23, non viene eseguito la parte else e infine chiudi con fclose(fo) un file inesistente da cui il segmentation fault.
    Tutto questo lo scoperto facendo il debug del codice cosa che devi saper fare anche tu.
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Quando dichiaro la funzione salva su file ho ricopiato male qui e ho saltato il puntatore. Dunque se lo mettessi il problema sarebbe risolto? non capisco cosa vuoi dirmi sono proprio negata per questa materia. Inizialmente scrivo File *fo, *fr. Da dopo apro il file e verifico se questo già esiste altrimenti stampa che il file è inesistente. Dopo lo legge, lo ordina per cognome e lo chiude. L'errore dov'è? quando scrivo che fo==NULL affermo che è inesistente oppure verifica l esistenza?
    dimenticavo uso un compilatore online chiamato codepad...
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Ok supponi che il file sia inesistente. Dove va il flusso del programma? Cioè in altre parole cosa succede se il file non esiste?
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Quel else non funge da un altrimenti? cioè nel caso il file non esiste il programma si blocca, se invece esiste lo legge e lo ordina?
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Cosa significa si blocca? Spiegati meglio.
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Significa che non va avanti per me...cioè che nè lo leggerà e nè farà nulla...quindi sullo schermo comparirà che il file non esiste e si chiude.
    Perdona l'ignoranza...è il mio primo programmino e non sono proprio tagliata per questa materia...o meglio non ho proprio le giuste basi.
    Ma questo esame è fondamentale per me...mi gioco la laurea a breve se mi fa fuori (cosa probabile).
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Controlla le modifiche in tanto. Il programma non si blocca, non si esegue l'else ma poi prossegue con l'ordinamento di qualcosa che non ha letto, poi alla chiusura di un file inesistente. E' così complicato per te seguire le righe e vedere cosa fa un programma e come prossegue la sua esecuzione in caso di casi imprevisti?
    #include <stdio.h>
    #include <string.h>
    #define MAX_DIM 20
    
    struct studenti
    {
        char nome [10];
        char cognome [10];
        int voto;
    };
    
    int leggi_file (FILE*, struct studenti*);
    void ordina_alfabetico_cognome (struct studenti*, int);
    void ordina_voto (struct studenti*, int);
    void salva_su_file (FILE *, struct studenti*, int);
    
    int main()
    {
        FILE *fo, *fr;
        struct studenti classe [MAX_DIM];
        int N=0, i;
        fo = fopen ("oggi.txt", "r");
        if(fo==NULL)
        {
            printf ("Il file è inesistente");
            return 0;
        }
        else
        {
            N= leggi_file (fo, classe);
            fclose (fo);
        }
    
        ordina_alfabetico_cognome (classe, N);
        for (i=0; i<N; i++)
        {
            printf ("i cognomi sono: %s\n", classe[i].cognome);
            for (i=0; i<N; i++)
            {
                printf ("che voto vuoi dare al signore: %s %s\n", classe[i].nome, classe[i].cognome);
                scanf ("%d", &classe[i].voto);
            }
        }
    
        ordina_voto (classe,N);
    
        fr= fopen ("risultati.txt", "w");
        if (fr!=NULL)
        {
            salva_su_file (fr, classe, N);
            fclose (fr);
        }
    }
    
    int leggi_file (FILE*f, struct studenti*A)
    {
        int i=0;
        while(fscanf(f, "%s %s", A[i].nome, A[i].cognome)!=EOF)
            i++;
        return(i);
    }
    
    void ordina_alfabetico_cognome (struct studenti*A, int dim)
    { 
        int i, j, imin, test;
        struct studenti temp;
        for (i=0; i<dim-1;i++)
        { 
            imin = i;
            for (j=0; j<dim; j++)
            { 
                test = strcmp(A[j].cognome, A[imin].cognome);
                if (test<0)
                    imin = j;
            }
            temp = A[i];
            A[i] = A[imin];
            A[imin] = temp;
        }
    }
    
    
    void ordina_voto (struct studenti*A, int n)
    { 
        int i, j, imax;
        struct studenti temp;
        for (i=0; i<n; i++)
        { 
            imax = i;
            for (j=i+1; j<n; j++)
            { 
                if(A[j].voto > A[imax].voto)
                { 
                    imax = j;
                }
                temp = A[i];
                A[i] = A[imax];
                A[imax] = temp;
           }
        }
    }
    
    void salva_su_file (FILE*g, struct studenti*A, int n)
    {
        int i;
        for (i=0; i<n; i++)
        {
            fprintf (g,"%s %s %d", A[i].cognome, A[i].nome,A[i].voto);
        }
    }
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Cosa intendi per seguire le righe?verificare cosa avviene ad ogni riga? quindi se avviene un errore?
    L'ho messo sul compilatore e mi dice appunto che il file è inesistente.
    Dunque non va avanti nel leggerlo ecc....
    In pratica hai aperto il file, verificato se è esiste, nel caso stampa la frase a video che è inesistente...e quel return 0 sta ad indicare che appunto il file è inesistente dunque che il ritorno è nullo...poi la chiamata della funzione ordina e l'assegnazione del voto l'hai messa al di fuori dell'apertura e chiusura file...e ti chiedo: è un errore quello che ho fatto io? cioè metterlo all'interno?
    Non capisco perchè dopo aver verificato l'esistenza non va avanti...cioè se il file appunto esiste perchè non esegue le funzioni dopo l'else?
    Non riesco a capirlo perchè per me è logico ragionare per esclusione...
    cioè ad esempio devo verificare un colore di un abito ....verifico se è rosso, se non lo è vedo se è blu...etc fino ad andare per esclusione e trovare il colore. Perchè qui non avviene?
  • Re: Errore durante l'esecuzione del programma (segmentation fault)

    Come fa un file ad esistere su INTERNET se quello risiede nel tuo PC?
    Seguire le righe significa fare il debug del programma e non lo puoi fare con un compilatore on-line. Installa un compilatore degno di nota su tuo PC e prossegui da lì.
    Consiglio: Code::Blocks
Devi accedere o registrarti per scrivere nel forum
23 risposte