Aiuto programma esercitazione strutture e funzioni

di il
59 risposte

59 Risposte - Pagina 3

  • Re: Aiuto programma esercitazione strutture e funzioni

    minomic ha scritto:


    In realtà il compilatore dovrebbe riportarti parecchie cose:
    main.c: In function ‘main’:
    main.c:59:12: warning: unused variable ‘nome_autore’ [-Wunused-variable]
    autore nome_autore;
    ^
    main.c:58:22: warning: unused variable ‘arc_libri’ [-Wunused-variable]
    archivio_clienti arc_libri;
    ^
    main.c:53:9: warning: unused variable ‘i’ [-Wunused-variable]
    int i;
    ^
    main.c: In function ‘compila_libro’:
    main.c:149:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘autore’ [-Wformat=]
    scanf("%s", nuovo_libro->lista_autori);
    ^
    main.c:151:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘autore’ [-Wformat=]
    scanf("%s", nuovo_libro->lista_autori);
    ^
    main.c:153:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘autore’ [-Wformat=]
    scanf("%s", nuovo_libro->lista_autori);
    ^
    main.c:142:9: warning: unused variable ‘i’ [-Wunused-variable]
    int i;
    ^
    main.c: In function ‘compila_cliente’:
    main.c:138:1: warning: control reaches end of non-void function [-Wreturn-type]
    }
    ^
    main.c: In function ‘compila_libro’:
    main.c:155:1: warning: control reaches end of non-void function [-Wreturn-type]
    }
    ^
    /tmp/cc0FA5El.o: nella funzione "main":
    main.c:(.text+0x298): riferimento non definito a "compila_libri"
    collect2: error: ld returned 1 exit status
    In particolare guarda in fondo: riferimento non definito a "compila_libri". Ecco il tuo errore.
    È un problema della funzione allora ?
    Non assume nessun valore di ritorno...come posso fare per fare in modo che il programma compili dal terminale ? A me eseguendo il debugging trova solamente quell' errore del puntatore
  • Re: Aiuto programma esercitazione strutture e funzioni

    L'errore è che semplicemente hai scritto compila_libro al posto di compila_libri nella definizione della funzione... Se correggi quello allora la compilazione va a buon fine, anche se con alcuni warning che ti consiglio di eliminare, dato che spesso i warning sono anticipatori di futuri problemi.

    Il tuo obiettivo dovrebbe sempre essere quello di compilare senza errori (e questo è ovvio) nè warning.
  • Re: Aiuto programma esercitazione strutture e funzioni

    minomic ha scritto:


    L'errore è che semplicemente hai scritto compila_libro al posto di compila_libri nella definizione della funzione... Se correggi quello allora la compilazione va a buon fine, anche se con alcuni warning che ti consiglio di eliminare, dato che spesso i warning sono anticipatori di futuri problemi.

    Il tuo obiettivo dovrebbe sempre essere quello di compilare senza errori (e questo è ovvio) nè warning.
    va benissimo, vedrò di sistemare anche quei warning cHe il compilatore segnala ? Grazie mille ancora per la disponibilità

    PS: che programma usi per compilare ?
    Io netbeans, ci sono alternative migliori ?
  • Re: Aiuto programma esercitazione strutture e funzioni

    Aravs ha scritto:


    PS: che programma usi per compilare ?
    Io netbeans, ci sono alternative migliori ?
    Io ho compilato direttamente dal terminale Linux con gcc. Se ti interessa, il comando è
    gcc -Wall -o nomeCheVuoiDareAllEseguibile nomeDelFile.c
    Per altri dubbi siamo qui.
  • Re: Aiuto programma esercitazione strutture e funzioni

    minomic ha scritto:


    Aravs ha scritto:


    PS: che programma usi per compilare ?
    Io netbeans, ci sono alternative migliori ?
    Io ho compilato direttamente dal terminale Linux con gcc. Se ti interessa, il comando è
    gcc -Wall -o nomeCheVuoiDareAllEseguibile nomeDelFile.c
    Per altri dubbi siamo qui.
    minomic non so perchè ma nel mio codice (lista_libri.nome e quantità me li segna in rosso, eppure io faccio la chiamata alla struttura, non capisco):
    int compila_libri(libro *nuovo_libro) {
        int i;
        printf("Libri:\n\n");
        printf("Titolo: ");
        scanf("%s", nuovo_libro->titolo);
        printf("Quantita': ");
        scanf("%d", &nuovo_libro->quantita[i]);
        for (i = 0; i < nuovo_libro->num_articoli; i++) {
            printf("libro n %d\n", i + 1);
            printf("Nome: ");
            scanf("%s", nuovo_libro->lista_autori[i].lista_libri.nome);
            printf("Quantita': ");
            scanf("%d", &nuovo_libro->lista_autori[i].quantita);
        }
  • Re: Aiuto programma esercitazione strutture e funzioni

    Prova a ri-postare tutto il codice completo, così lo possiamo provare.
  • Re: Aiuto programma esercitazione strutture e funzioni

    minomic ha scritto:


    Prova a ri-postare tutto il codice completo, così lo possiamo provare.
    ora lo posto, mi da segmentation fault, non capisco perchè ?
    come faccio a debuggare questo problema
  • Re: Aiuto programma esercitazione strutture e funzioni

    Segmentation fault di solito indica che tenti di accedere ad una zona di memoria che non ti appartiene.

    Lasciando stare un vero e proprio debugger (che comunque potresti imparare ad usare), il metodo più semplice è mettere dei printf qua e là e vedere dove si pianta. Se ad esempio metti
    
    // codice 1
    printf("1\n");
    
    // codice 2
    printf("2\n");
    
    // codice 3
    printf("3\n");
    
    e poi vedi che ti stampa 1 e 2 ma non 3 allora sai che il problema è nel terzo blocco di codice.
  • Re: Aiuto programma esercitazione strutture e funzioni

    Ecco il codice. non capisco perchè va in segmentation fault.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define ID 50
    #define DIM 500
    #define LUNG_NOME 20
    #define LUNG_COGNOME 30
    #define LUNG_MAX_ARCHIVIO 300
    #define LISTA_MAX_LIBRI 10
    
    
    typedef struct {
    char nome[LUNG_NOME];
    char cognome[LUNG_COGNOME];
    char nazionalita[DIM];
    } autore;
    
    typedef struct {
    autore articolo;
    int quantita;
    } libri_quantita;
    
    typedef struct {
    char ISBN[13];
    char titolo[DIM];
    autore lista_autori;
    libri_quantita lista[LISTA_MAX_LIBRI];
    int num_libri;
    } libro;
    
    
    typedef struct {
        char nome[LUNG_NOME];
        char cognome[LUNG_COGNOME];
        char codice_cliente[ID];
        libro lista_libri[10];
    } cliente;
    
    typedef struct {
        cliente clienti[LUNG_MAX_ARCHIVIO];
        int progressivo;
        int totale;
    } archivio_clienti;
    
    
    int compila_cliente(cliente *_cliente);
    int inserisci_cliente(cliente _nuovo_cliente, archivio_clienti *_arc_clienti);
    int inserisci_libro(libro _nuovo_libro, archivio_clienti *_arc_clienti);
    int check_cliente(char _codice_cliente[], archivio_clienti _arc_clienti);
    int compila_libri(libro *nuovo_libro);
    int inserisci_tesseramento(cliente _nuovo_tesseramento, archivio_clienti *_arc_clienti);
    int mostra_tesseramento_cliente(char _codice_cliente[], archivio_clienti _arc_clienti);
    int mostra_libri(archivio_clienti arc_clienti);
    
    /*
    *
    */
    
    int main(int argc, char** argv) {
        int scelta;
        int i;
        archivio_clienti arc_CLIENTI;
        cliente nuovo_cliente;
        libro inserisci_libro;
        libro nuovo_libro;
        archivio_clienti arc_libri;
        autore nome_autore;
       arc_CLIENTI.progressivo = 0;         
       
       
        do {
            system("clear");
            printf("****BIBLIOTECA****\n\n");
            printf("1. Inserisci nuovo libro\n");
            printf("2. Tessera cliente\n");
            printf("3. Prestito di un libro\n");
            printf("4. Visualizza prestiti di un cliente\n");
            printf("5. Visualizza libri\n");
            printf("0. Esci\n\n");
           
            printf("\tScelta: ");
            scanf("%d", &scelta);
           
            switch (scelta) {
                case 1:
                 system("clear");
                 printf("ISBN: ");
                    scanf("%s", nuovo_cliente.codice_cliente);
                    if (check_cliente(nuovo_cliente.codice_cliente, arc_CLIENTI) == 1) {
                        compila_libri(&nuovo_libro);
                        if (inserisci_cliente(nuovo_cliente, &arc_CLIENTI) == 1)
                            printf("Errore: archivio pieno!\n");
                    } else
                        printf("Cliente gia' presente\n");
                   
                    getchar();
                    getchar();
                    break;
       
                    case 2:
                    system("clear");
                    printf("Codice cliente: ");
                    scanf("%s", nuovo_cliente.codice_cliente);
                    
                    
                    switch (scelta) {
    
                            case 1:
                                system("clear");
                                compila_cliente(&nuovo_cliente);
                                strcpy(nuovo_cliente.codice_cliente, inserisci_libro.ISBN);
                                inserisci_cliente(nuovo_cliente, &arc_CLIENTI);
                                compila_libri(&nuovo_libro);
                                
                                getchar();
                                getchar();
                               
                                break;
    
                                case 5:
                    system("clear");
                    mostra_libri(arc_CLIENTI);
                    getchar();
                    getchar();
                              break;
                              
                            default:
                                printf("Scegli un'opzione valida\n");
                               
                        }
                 
                    
                   
            case 0:
                printf("Arrivederci, alla prossima ;)\n");
                break;
               
                default:
                   printf("Carattere errato: Inserire carattere valido.\n");
    
                   }
        } while (scelta != 0);
       
        return 0;
    }
    
    int compila_cliente(cliente *_cliente) {
        printf("Nome: ");
        scanf("%s", _cliente->nome);
        printf("Cognome: ");
        scanf("%s", _cliente->cognome);
    }
    
    int compila_libri(libro *nuovo_libro) {
        int i;
        printf("Libri:\n\n");
        printf("Titolo: ");
        scanf("%s", nuovo_libro->titolo);
            
        printf("Autore:\n\n");
        printf("Nome: ");
        scanf("%s", nuovo_libro->titolo);
        printf("Cognome: ");
        scanf("%s", nuovo_libro->titolo);
        printf("nazionalita': ");
        scanf("%s", nuovo_libro->titolo);
       for (i = 0; i < nuovo_libro->num_libri; i++) {
            printf("Articolo n %d\n", i + 1);
            printf("Nome: ");
            scanf("%s", nuovo_libro->lista[i].articolo.nome);
            printf("Quantita': ");
            scanf("%d", &nuovo_libro->lista[i].quantita);
        }
       
        }
    
    int mostra_libri(archivio_clienti arc_clienti) {
        int i;
        printf("Lista libri\n\n");
        for (i = 0; i < arc_clienti.progressivo; i++) {
            printf("%s\n", arc_clienti.clienti[i].codice_cliente);
            printf("%s\n", arc_clienti.clienti[i].nome);
            printf("%s\n\n", arc_clienti.clienti[i].cognome);
        }
    }
    
    int inserisci_cliente(cliente _nuovo_cliente, archivio_clienti *_arc_clienti) {
        if (_arc_clienti->progressivo < LUNG_MAX_ARCHIVIO) {
            _arc_clienti->clienti[_arc_clienti->progressivo] = _nuovo_cliente;
            _arc_clienti->progressivo++;
            return 0;
        } else
            return 1;
    }
    
    int check_cliente(char _codice_cliente[], archivio_clienti _arc_clienti) {
        int i = 0;
        while (i < _arc_clienti.progressivo && strcmp(_codice_cliente, _arc_clienti.clienti[i].codice_cliente) != 0)
            i++;
        if (i < _arc_clienti.progressivo)
            return 0;
        else
            return 1;
    }
  • Re: Aiuto programma esercitazione strutture e funzioni

    minomic ha scritto:


    Segmentation fault di solito indica che tenti di accedere ad una zona di memoria che non ti appartiene.

    Lasciando stare un vero e proprio debugger (che comunque potresti imparare ad usare), il metodo più semplice è mettere dei printf qua e là e vedere dove si pianta. Se ad esempio metti
    
    // codice 1
    printf("1\n");
    
    // codice 2
    printf("2\n");
    
    // codice 3
    printf("3\n");
    
    e poi vedi che ti stampa 1 e 2 ma non 3 allora sai che il problema è nel terzo blocco di codice.
    sto provando, devo commentare man mano le cose ?
  • Re: Aiuto programma esercitazione strutture e funzioni

    Non riesco a trovarlo, sto uscendo pazzo O.o
  • Re: Aiuto programma esercitazione strutture e funzioni

    Non ho provato il codice quindi potrebbe non essere la soluzione.. ma non è che qui
    typedef struct {
    ...
    autore lista_autori;
    ...
    } libro;
    intendevi creare un array? Perché così crei solo un oggetto autore.
  • Re: Aiuto programma esercitazione strutture e funzioni

    tuixte ha scritto:


    Non ho provato il codice quindi potrebbe non essere la soluzione.. ma non è che qui
    typedef struct {
    ...
    autore lista_autori;
    ...
    } libro;
    intendevi creare un array? Perché così crei solo un oggetto autore.
    no non volevo creare un array
  • Re: Aiuto programma esercitazione strutture e funzioni

    minomic ha scritto:


    Segmentation fault di solito indica che tenti di accedere ad una zona di memoria che non ti appartiene.

    Lasciando stare un vero e proprio debugger (che comunque potresti imparare ad usare), il metodo più semplice è mettere dei printf qua e là e vedere dove si pianta. Se ad esempio metti
    
    // codice 1
    printf("1\n");
    
    // codice 2
    printf("2\n");
    
    // codice 3
    printf("3\n");
    
    e poi vedi che ti stampa 1 e 2 ma non 3 allora sai che il problema è nel terzo blocco di codice.
    minomic comunque non riesco a risolvere, non appena avvio il programma mi esce ogni volta segmentationf fault

    ho provato anche a mettere tanti printf...sempre questo è il risultato, sto uscendo pazzo per trovare un errore.
  • Re: Aiuto programma esercitazione strutture e funzioni

    Vuoi dire che non visualizzi neanche il menu?
Devi accedere o registrarti per scrivere nel forum
59 risposte