Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    17

    file e segmentation fault [c]

    Ciao a tutti..
    sono una assoluta principiante nell'ambiente della programmazione in c, quindi chiedo scusa in anticipo.
    Per un esame devo fare un piccolo programma, per la gestione dei lavoratori e dei lavori di un'agenzia.. Il programma deve quindi poter inserire, cancellare, modificare lavori e lavoratori. Non ho ancora finito di scrivere l'intero codice, ma ho già diversi problemi... Sono giorni che cerco di risolverli, ma non ci riesco proprio, quindi chiedo a voi.
    Per "rappresentare" lavori e lavoratori ho creato delle liste come variabili globali, e poi ho fatto le diverse funzioni per cancellare e aggiungere. Ci sono diverse cose da migliorare nel codice, ma il mio problema sono i file che non so bene come gestire.
    Scusate, non mi so neanche spiegare.
    Allora, per esempio se provo a stampare a video i lavoratori attraverso la funzione lista_lavoratori mi da un errore di segmentazione, che non riesco proprio a capire. Lo stesso se provo a cancellare un nodo.
    E inoltre credo che anche fwrite presente nella funzione inserire_lavoratori sia sbagliata

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_LUN 25
    #define FILE1 "lavoratori.dat"
    #define FILE2 "lavori.dat" 
    #define FILE3 "assegnamento.dat"
    
    
    struct lavoratore {           
    	int codice;
    	char cognome[MAX_LUN + 1];
    	char nome[MAX_LUN + 1];
    	struct lavoratore *next; 
    };
    
    struct lavoratore *lavoratori = NULL; //punta al primo componenente della lista
    struct lavoratore *lavoratori1;
    
    struct lavoro {
    	int codice;
    	char tipo[MAX_LUN + 1];
    	char stato[MAX_LUN + 1];
    	struct lavoro *next;
    };
    
    struct lavoro *lavori1;
    struct lavoro *lavori = NULL; // punta al primo componente della lista
    
    
    int menu_lavoratori();
    int menu_lavori();
    struct lavoratore *trova_lavoratore(int codice);
    struct lavoro *trova_lavoro(int codice);
    void inserire_lavoratori();
    void inserire_lavori();
    void cancella_lavori();
    void lista_lavori();
    void lista_lavoratori();
    void cancella_lavoratori();
    
    
    FILE *fp1, *fp2;
    
    int main()
    {
    	char scelta;
    	for (; ;) {
    		printf("\n\n");
    		printf("			==================\n"
                   "			AGENZIA INTERINALE\n"                           
    	  	       "			==================\n\n"
    	  	       "[a] Assegnamento\n"
    	  	       "[l] Gestione lavoratori\n"		
                   "[j] Gestione lavori\n"			
                   "                                                  [q] Esci\n");
    		scanf("\n%c", &scelta);
    		
    		switch (scelta) {
    			case 'l': menu_lavoratori();
    				break;
    			case 'j': menu_lavori();
    				break;
    			case 'q': return 0;
    				break;
    			default: printf ("Operazione non valida\n");
    				break;
    		}
    	}
    	
    }
    
    int menu_lavoratori()
    {
    	char scelta;
    	for (; ;) {
    		printf("\n\n");
    		printf("			===================\n"
                   "			GESTIONE LAVORATORI\n"                           
    	  	       "			===================\n\n"
    	  	       "[a] Aggiungi nuovo lavoratore\n"
    			   "[c] Cancella lavoratore\n"			
                   "[l] Mostra lista\n"			
                   "                                                  [m] Torna al menù principale\n"
                   "                                                  [q] Esci\n");
            
    		
    		scanf("\n%c", &scelta);
    		switch (scelta) {
    			case 'a': inserire_lavoratori();
    				break;
    			case 'm': main();
    				break;
    			case 'q': exit(0);
    				break;
    			case 'l': lista_lavoratori();
    				break;
    			case 'c': cancella_lavoratori();
    				break;
    			default: printf ("Operazione non valida\n");
    				break;
    		}
    	}
    }
    
    int menu_lavori()
    {
    	char scelta;
    	for (; ;) {
    		printf("\n\n");
    		printf("			=================\n"
                   "			 GESTIONE LAVORI\n"                           
    	  	       "			=================\n\n"
    	  	       "[a] Aggiungi nuovo lavoro\n"
    	  	       "[e] Modifica lavoro esistente\n"		
                   "[c] Cancella lavoro\n"			
                   "[l] Mostra lista\n"			
                   "                                                  [m] Torna al menù principale\n"
                   "                                                  [q] Esci\n");	
    		scanf("\n%c", &scelta);
    		switch (scelta) {
    			case 'm': main();
    				break;
    			case 'q': exit(0);
    				break;
    			case 'c' : cancella_lavori();
    				break;
    			case 'a': inserire_lavori();
    				break;
    			case 'l': lista_lavori();
    				break;
    
    			default: printf ("Operazione non valida\n");
    				break;
    		}
    	}
    }
    struct lavoratore *trova_lavoratore(int codice)
    {
    	struct lavoratore *p;
    	for (p = lavoratori; p != NULL; p = p->next); 
    		if (p != NULL && codice == p->codice) 
    			return p;
    	return NULL;
    }
    
    struct lavoro *trova_lavoro(int codice)
    {
    	struct lavoro *p;
    	for (p = lavori; p != NULL; p = p->next); 
    	if (p != NULL && codice == p->codice) 
    		return p;
    	return NULL;
    }
    
    void inserire_lavoratori()
    {
    	fp1 = fopen(FILE1, "ab");
    	struct lavoratore *cor, *prec, *nuovo;
    	
    	nuovo = malloc(sizeof(struct lavoratore));
    	
    	if (fp1==NULL)
    		printf("Impossibile aprire il file\n");
    	
    	if (nuovo == NULL) {
    		printf("Il database è pieno, non è possibile inserire nuovi dati");
    		return;
    	}
    	
    	printf ("Inserire codice del lavoratore: ");
    	scanf  ("\n%d", &nuovo->codice);
    	if (trova_lavoratore(nuovo->codice) != NULL) { 
    		printf ("Codice già inserito.\n");
    		return;
    	}
    
    	printf("Inserire cognome: ");
    	scanf("%s", nuovo->cognome);
    	printf("Inserire nome: ");
    	scanf("%s", nuovo->nome); 
    	
    	fwrite(&lavoratori,sizeof(struct lavoratore),1,fp1);
    	fclose(fp1);
    }
    
    void inserire_lavori()
    {
    	fp2 = fopen(FILE2, "ab");
    	struct lavoro *cor, *prec, *nuovo;
    	
    	nuovo = malloc(sizeof(struct lavoro));
    	if (fp2==NULL)
    		printf("Impossibile aprire il file\n");
    	if (nuovo == NULL) {
    		printf("Il database è pieno, non è possibile inserire nuovi dati");
    		return;
    	}
    	
    	printf ("Inserire codice del lavoro: ");
    	scanf  ("\n%d", &nuovo->codice);
    	if (trova_lavoro(nuovo->codice) != NULL) { 
    		printf ("Codice già inserito.\n");
    		return;
    	}
    	
    	printf("Inserire tipo: ");
    	scanf("%s", nuovo->tipo);
    	printf("Inserire stato [da fare, in esecuzione, terminato]: ");
    	scanf("%s", nuovo->stato);
    	
    	fwrite(&lavori,sizeof(struct lavoro),1,fp2);
    	fclose(fp2);
    }
    
    
    void cancella_lavori()
    {
    	printf("Inserire il codice del lavoro da cancellare: ");
    	scanf ("\n%d", &lavori->codice);
    	
    	struct lavoro *cor, *prec;
    	
    	for (cor=lavori, prec = NULL; cor != NULL && cor->codice != lavori->codice; prec = cor, cor = cor->next) 
    		;
    	if (cor == NULL)   // non è stato trovato il codice
    		printf("Il codice non è stato trovato");
    	if (prec == NULL)  // il codice è nel primo nodo 
    		lavori = lavori-> next;
    	else 
    		prec->next = cor->next; // si bypassa il nodo da cancellare
    	free(cor);  // si rilascia la memoria occupata dal nodo da cancellare
    }
    
    
    void lista_lavori()
    
    {	
    	fp2 = fopen(FILE2, "rb");
    
    	if (fp2==NULL)
    		printf("Impossibile aprire il file\n");
    	
    	while(!feof(fp2))
    	{
    		fread(&lavori1, sizeof(struct lavoro), 1, fp2);
    		printf("Codice: %d\tTipo: %s\tStato: %s\t", lavori1->codice, lavori1->tipo, lavori1->stato);
    	}
    	fclose(fp2);
    }
    
    void lista_lavoratori()
    
    {	
    	fp1 = fopen(FILE1, "rb");
    	
    	if (fp1==NULL)
    		printf("Impossibile aprire il file\n");
    	
    	while(!feof(fp1))
    	{
    		fread(&lavoratori1, sizeof(struct lavoro), 1, fp1);
    		printf("Codice: %d\tTipo: %s\tStato: %s\t", lavoratori1->codice, lavoratori1->cognome, lavoratori1->nome);
    	}
    	fclose(fp1);
    }
    
    
    void cancella_lavoratori()
    {
    	printf("Inserire il codice del lavoratore da cancellare: ");
    	scanf ("\n%d", &lavoratori->codice);
    	
    	struct lavoratore *cor, *prec;
    	
    	for (cor=lavoratori, prec = NULL; cor != NULL && cor->codice != lavoratori->codice; prec = cor, cor = cor->next) 
    		;
    	if (cor == NULL)   // non è stato trovato il codice
    		printf("Il codice non è stato trovato");
    	if (prec == NULL)  // il codice è nel primo nodo 
    		lavoratori = lavoratori-> next;
    	else 
    		prec->next = cor->next; // si bypassa il nodo da cancellare
    	free(cor);  // si rilascia la memoria occupata dal nodo da cancellare
    }




    Vi avverto, io di memoria non ci capisco granché.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Usa il tag [CODE] per formattare il codice in futuro, come richiesto dal Regolamento.

    Ho modificato io il tuo messaggio originale.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    a parte quello, hai visto dove arrivi nell'esecuzione del codice?
    io come primo controllo metto delle printf dopo ogni potenziale istruzione di errore, almeno circoscrivi il campo di azione

  4. #4
    o più semplicemente usare il debugger che è lo strumento fondamentale del programmatore
    con quello dovresti trovare il punto esatto in cui succede il casino
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Celebron
    o più semplicemente usare il debugger che è lo strumento fondamentale del programmatore
    con quello dovresti trovare il punto esatto in cui succede il casino
    il debugger lo avevo momentaneamente escluso visto che è proprio all'inizio, quella è una prima forma di debug che trovo utile quando non ho IDE e mi scoccia debuggare a riga di comando :P

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    17
    come posso usare un debugger in un mac?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    come si fa con tutti gli altri sistemi, mac non è diverso dagli altri (e mi fermo qui altrimenti rischio di essere offensiva): usi un IDE o la riga di comando?
    Nel primo caso è davvero semplice : setti dei breakpoint e poi esegui in modalità debug.
    Nel secondo caso visto che sei principiante, prova con le printf come ti ho detto, la riga di comando e il debugger ti possono creare qualche problema.
    Nulla ti vieta di fare una ricerca su google con "debug C program mac" e vedere cosa viene fuori.

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    17
    e mi fermo qui altrimenti rischio di essere offensiva
    cosa vorresti dire?
    Era solo una domanda, anche perché con xcode non si può usare su un semplice file c.
    comunque, offensiva non lo sarai stata, ma antipatica sicuramente sì.
    Se non si sa rispondere a una domanda tranquillamente, anche se la domanda è stupida, si evita di stare in forum del genere.
    Lasciamo stare va...

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Chiarula
    cosa vorresti dire?
    Era solo una domanda, anche perché con xcode non si può usare su un semplice file c.
    comunque, offensiva non lo sarai stata, ma antipatica sicuramente sì.
    Se non si sa rispondere a una domanda tranquillamente, anche se la domanda è stupida, si evita di stare in forum del genere.
    Lasciamo stare va...
    prova codeblocks, c'è anche per mac, è un IDE minimale, ma che problemi di questo tipo te li risolve.
    Mi pare di aver risposto più di una volta alla tua domanda e di aver detto più di una volta cosa ti conviene fare, ti ho anche detto come cercare un debugger a riga di comando (e qqui hai il primo result della ricerca con le 4 parole chiave che ti ho dato).
    onestamente prendere tutto il tuo codice e cercare io la soluzione per te non lo faccio, quando il problema è circoscritto è più semplice, se non lo circoscrivi chiunque si scoccia a debuggare il tuo programma.
    Infine, se proprio non vuoi usare un debugger e non vuoi mettere printf (di quanti post hai scritto avresti pure finito), prova valgrind, non sono sicura se è completamente supportato su osx (la home page dice di si), ma su linux mi ha dato non poche soddisfazioni.

  10. #10
    Originariamente inviato da Chiarula
    Era solo una domanda, anche perché con xcode non si può usare su un semplice file c.
    Con Xcode 3.2.5/6:
    File->New Project->Mac OS X->Application->Command Line Tool.

    Se non vuoi creare un progetto in Xcode puoi cmq compilare e debuggare da linea di comando:
    codice:
    $ gcc --version
    i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
    $ gdb --version
    GNU gdb 6.3.50-20050815 (Apple version gdb-1510) (Wed Sep 22 02:45:02 UTC 2010)
    $ gcc -g main.c 
    $ gdb a.out
    GNU gdb 6.3.50-20050815 (Apple version gdb-1510) (Wed Sep 22 02:45:02 UTC 2010)
    Copyright 2004 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done
    
    (gdb) br main
    Breakpoint 1 at 0x100000f08: file main.c, line 4.
    (gdb) run
    Starting program: /Users/MacApp/development/console/test/simple_debug/a.out 
    Reading symbols for shared libraries +. done
    
    Breakpoint 1, main () at main.c:4
    4		printf ("Hello World!");
    (gdb)

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.