Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: [C] segmentation fault

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    28

    [C] segmentation fault

    Qualcuno mi sa dire perchè un programma molto semplice che legge da file e scrive su file, sul mio pc mi da errore di segmentation fault, e invece in un vecchio pc con soli 64 MB di ram mi compila e mi funziona bene con lo stesso compilatore (DEV-C++ IDE)?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C] segmentation fault

    Originariamente inviato da danytogo
    Qualcuno mi sa dire perchè ...
    No ... (senza vedere il programma)

    Ma il computer non c'entra.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    28
    scusate....

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main(int argc, char **args)
    {
      FILE *fpa, *fpouta;
      char in[15], *nomefilein=in;
      int  i;
      int long timestamp;
      char AP[13];                                    
      
      printf("Inserire il nome del file: \n\n");
      gets(in);
      fpa=fopen(in, "r");
           if(fpa==NULL){printf("Impossibile aprire il file \n\n");
                         exit(1);
                        }
                        
      while(!feof(fpa))                                          
        {                                                                                          
         if(fscanf(fpa, "%d",&timestamp) != EOF)
         if(fscanf(fpa, "%s", &AP) != EOF)
           {printf("Timestamp: %d  AP: %s \n", timestamp, AP);  
            fgetc(fpa);   
            fpouta=fopen("A.txt", "a+");           
            fprintf(fpouta, "%d  %s \n", timestamp, AP);
            fclose(fpouta);    
           } 
         }   
      fclose(fpa);
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Un esempio di file di input ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    28
    sul vecchio pc non mi da nessun errore e mi funziona perfettamente. Praticamente ricopia il file letto...

    codice:
     
    1034622028	AcadBldg14AP1
    1034628353	OFF
    1034685931	AcadBldg14AP1
    1034715360	OFF
    1034855719	AcadBldg14AP1
    1034857264	OFF
    1034951849	AcadBldg14AP1
    1034952407	OFF
    1034955029	AcadBldg14AP1
    1034955088	OFF
    1035380722	AcadBldg14AP1
    1035404209	OFF
    1035460268	AcadBldg14AP1
    1035480107	OFF
    1035554673	AcadBldg14AP1
    1035577361	OFF
    1035814786	AcadBldg14AP1
    1035844376	OFF
    1035895662	AcadBldg14AP1
    1035929649	OFF
    1035981856	AcadBldg14AP1
    1036012508	OFF
    1036153913	AcadBldg14AP1
    1036167871	OFF
    1036439802	AcadBldg14AP1
    1036441847	OFF
    1036500836	AcadBldg14AP1
    1036530868	OFF
    :

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Visto che il dato da leggere in AP è di 13 caratteri, questa non può essere di 13 caratteri ma superiore ... Utilizza

    char AP[15];

    Il fatto che sull'altro PC non dia errori non significa che non ci siano. Questo tipo di errori (corruzione di memoria a runtime) ha esiti imprevedibili.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    28
    Ho provato anche con AP[15] ma lo stesso...

    forse non mi rimane che lavorare sul vecchio pc...


  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da danytogo
    Ho provato anche con AP[15] ma lo stesso...
    Con i dati che hai fornito, questa modifica è sufficiente.

    Certo ... se nel file hai stringhe ancora piu' lunghe, allora AP[15] non basta.

    Se posti *tutto* il file da elaborare (magari un link per scaricarlo) allora lo provo ...

    forse non mi rimane che lavorare sul vecchio pc...
    Allora, non hai letto quello che ho scritto fino ad ora ...

    Il computer "vecchio" non c'entra niente e l'errore lo hai anche in quel caso (soltanto che non si manifesta nello stesso modo).

    Devi correggere il problema ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    codice:
      char in[15], *nomefilein=in;
    Forse hai inserito un nome di file più lungo di 15 caratteri; in generale comunque le variabili contenenti percorsi di file dovrebbero essere di 260 caratteri (o MAX_PATH se lavori con le API di Windows).
    Tra l'altro, perché dichiari quel puntatore che poi non usi più?
    codice:
      int long timestamp;
    long int (o, più semplicemente, long), semmai.
    codice:
      gets(in);
    Sostituisci la gets (che può essere causa di buffer overflow) con la sua parente "sicura" fgets, fornendole le dimensioni del buffer (sizeof(in)).
    codice:
                         exit(1);
    Meglio return 1;
    codice:
      while(!feof(fpa))
    La condizione non è sufficiente, devi anche controllare ferror: se si verificasse un errore il loop continuerebbe all'infinito.
    codice:
         if(fscanf(fpa, "%d",&timestamp) != EOF)
         if(fscanf(fpa, "%s", &AP) != EOF)
    Il codice di formato per i long non è %d, ma %ld.
    Se la fscanf ha problemi a leggere il file non restituisce EOF, ma 0 (in generale, le funzioni della famiglia scanf restituiscono il numero di campi che sono riuscite a leggere e convertire). Inoltre se si verifica un problema devi uscire dal while, non semplicemente evitare di eseguire il blocco centrale del codice.
    codice:
            fpouta=fopen("A.txt", "a+");           
            fprintf(fpouta, "%d  %s \n", timestamp, AP);
            fclose(fpouta);
    Perché continui ad aprire e richiudere il file nel while? Aprilo all'inizio e chiudilo alla fine, come hai fatto per il file di input.
    codice:
    }
    Manca il return 0.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    28
    I dati sono esttamente quelli, AP è di 13 caratteri massimo oppure "OFF", non ho postato tutto il file perchè è molto lungo. Anche con AP[15] non mi compila.
    Il file l'ho ricevuto via mail.

    Può essere il compilatore? provo a reinstallarlo?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.