Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56

    [C] Segmentation Fault in fclose()

    Salve a tutti,
    è la prima discussione che apro, grazie a chi la leggerà
    Come ho scritto nel titolo il problema si verifica in fclose() di un file di testo

    void printlist(char *filename, char **list, int length,int size) {
    FILE *out=fopen(filename,"w");
    int i;

    for(i=0; i<length; i++) {
    list[i][size] = '\0';
    fprintf(out,"%s\n",list[i]);
    }

    fclose(out);
    }

    Questa è la funzione incriminata..
    L'errore non si verifica sempre,
    ma lo fa solamente con delle lunghezze particolari di stringhe cioè 12,20,28..
    e quando il **list contiene più di 100.000 elementi.
    inoltre il file in output che crea è corretto :berto:

    Lo stavo testando con Cygwin in ambiente Windows e pensando che fosse un baco
    nella gestione della memoria, ho provato con Debian ma purtroppo l'errore è lo stesso
    Ho notato che c'è una distanza di 8 nelle lunghezze che danno l'errore
    ma ho idea del perchè.. stò finendo i neuroni a pensarci

    Se qualcuno ha un idea..

    GRAZIE
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Facci vedere tutto il resto ... il main, la dichiarazione della list, la chiamata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Ho tralasciato delle cose:

    Lavora su un set di stringhe di uguale lunghezza create random
    length è il numero di stringhe,
    size è l'intero che restituisce la funzione strlen

    questa è la dichiarazione dell'array di puntatori
    codice:
    list=(char **)malloc((*length)*sizeof(char *));
    questa è la chiamata
    codice:
    printlist((char *)argv[2],list,length,size);
    il problema si verifica dopo il for.. mandandolo in run alla fine crea un file
    ....exe.stackdump di 0kb, vuoto.

    Se c'è bisogno posto tutto il codice..

    Grazie intanto
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    1) Perche' usi

    (*length)

    nella formula ?

    2) Dopo che hai allocato l'insieme di puntatori, quando allochi lo spazio per ogni singolo puntatore ?


    Forse e' meglio che posti tutto il codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    codice:
    int main(int argc, const char *argv[]) {
    	char **list;	
    	int length,size;
    
    	list=loadlist((char *)argv[1],&length,&size);
    	list=sortlist(list,length,size);	
    	printlist((char *)argv[2],list,length,size);
    
    	return 0;
    }
    codice:
    void readsize(char *filename, int *length, int *size) {
    	FILE *in=fopen(filename,"r");
    	int i=0,j=0;
    	char tmp;
    
    	while(fscanf(in,"%c",&tmp)!=EOF && tmp!='\n') j++;
    	rewind(in);
    	while(fscanf(in,"%*s\n")!=EOF) i++;
    	(*length)=i; (*size)=j;
    	fclose(in);
    }
    
    char *readline(FILE *in,int size) {
    	char *line=(char *)malloc(size*sizeof(char)), tmp;
    	int i=0;
    
    	while(i<size && fscanf(in,"%c",&line[i])!=EOF) i++;
    	fscanf(in,"%c",&tmp);
    	if(tmp!='\n') {
    		printf("Error: malformed file\n");
    		return NULL;
    	}
    
    	return line;
    }
    
    char **loadlist(char *filename, int *length, int *size) {
    	int i;
    	char **list;
    	FILE *in=fopen(filename,"r");
    
    	readsize(filename,length,size);
    
    	list=(char **)malloc((*length)*sizeof(char *));
    
    	for(i=0; i<(*length); i++)
    		list[i]=readline(in,(*size));
    	
    	fclose(in);
    
    	return list;
    }
    
    void printlist(char *filename, char **list, int length,int size) {
    	FILE *out=fopen(filename,"w");
    	int i;
    	
    	for(i=0; i<length; i++) {
    		list[i][size] = '\0';
    		fprintf(out,"%s\n",list[i]);	
    	}
    	
    	fclose(out);
    }
    manca solamente
    codice:
     sortlist()
    che è lunghissimo e complicato e che comunque
    anche cambiando il tipo di ordinamento l'errore rimane lo stesso..

    Stò anche pensando che l'errore potrebbe essere nella creazione del file random..

    GRAZIE
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Dov'e' la creazione del file?

    Hai un file dati che possa scaricare per provare il codice?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <time.h>
    
    int main(int argc, const char *argv[]) {
    	int i,j, length, size;
    
    	if(argc!=3) {
    		printf("Usage: randata <length> <size>\n");
    		return 1;
    	}
    
    	srand(time(NULL));
    	length=atoi(argv[1]);
    	size=atoi(argv[2]);
    
    	for(i=0; i<length; i++) {
    		for(j=0; j<size; j++)
    			printf("%c",toascii((rand()%(90-65+1))+65));
    		printf("\n");
    	}
    
    	return 0;
    }
    sortlist a piacere
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  8. #8
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    codice:
    void exchange(char **list, int i, int j,int size) {
    	char tmp[size];
    	
    	strcpy(tmp,*(list+i));
    	strcpy(*(list+i),*(list+j));
    	strcpy(*(list+j),tmp);
    }
    
    int partition(char **list, int p, int r,int size) {
    	int i=p, j=r, x;
    	char pivot[size];
    
    	x=rand()%(r-p+1)+p;
    	exchange(list,x,p,size);
    	strcpy(pivot,*(list+p));
    
    	while(i<j) {
    		while(j>p && (strcmp(*(list+j),pivot)>0)) j--;
    		while(i<r && (strcmp(*(list+i),pivot)) <= 0) i++;
    		if(i<j) exchange(list,i,j,size);
    	} 
    	exchange(list,p,j,size);
    	return j;
    }
    
    void quicksort(char **list, int p, int r, int size) {
    	int q;
    	if(p<r) {
    		q=partition(list,p,r,size);
    		quicksort(list,p,q-1,size);
    		quicksort(list,q+1,r,size);
    	}
    }
    Questa è l'implementazione del quicksort..

    Questa la chiamata da modificare nel main
    codice:
    quicksort(list,0,length-1,size);

    Grazie oregon
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  9. #9
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56

    Re: [C] Segmentation Fault in fclose()

    Rileggendo:

    Originariamente inviato da LexLex
    Ho notato che c'è una distanza di 8 nelle lunghezze che danno l'errore
    ma ho idea del perchè.. stò finendo i neuroni a pensarci
    Anche la frase è bacata

    In realtà è:
    codice:
    Non ne ho proprio idea del perchè ! I neuroni sono finiti
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  10. #10

    Re: Re: [C] Segmentation Fault in fclose()

    Originariamente inviato da LexLex
    Rileggendo:



    Anche la frase è bacata

    In realtà è:
    codice:
    Non ne ho proprio idea del perchè ! I neuroni sono finiti
    Compila con il massimo livello di warning ;-)

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.