Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C]strutture...programma elezioni

    Ciao, ho questo programma che però non riesco a far funzionare.

    codice:
    #include <stdio.h>
    
    typedef struct {
            int nVoti;
    } Candidato;
    
    typedef struct {
            char nome[5];
            Candidato * pCand;
            int nCand;
            int voti;    /* numero voti ottenuti dalla lista */
    } Lista;
    
    typedef struct {
            char data[11];
            int consiglieri;
            Lista * pListe;
            int nListe;      /* numero di liste presentate */
    } Elezioni;
    
    
    
    
    
    /*
    IOP data, data delle elezioni.
    IOP consiglieri, numero consiglieri da eleggere(coincidente con il numero massimo di candidati per lista).
    IOP nListe, numero di liste presentate.
    IOP nome, nome di ogni lista.
    IOP nCand, numero candidati di ogni lista.
    IOP voti, numero voti di ogni lista.
    IOP nVoti, numero voti di ogni candidato di ogni lista.
    */
    
    void Input (Elezioni *p) {
        int i,j;
        printf ("**** ELEZIONI *****\n\n");
        printf ("Inserire la data delle elezioni: ");
        scanf ("%s", (*p).data);
        printf ("\nNumero di consiglieri da eleggere: ");
        scanf ("%d", (*p).consiglieri);
        printf ("\nInserire il numero di liste: ");
        scanf ("%d", (*p).nListe);
        for (i=0;i<(*p).nListe;i++) {
        	  printf ("\n\nLISTA[%d]: ", i+1);
        	  scanf ("%s   ", (*p).pListe[i].nome);
        	  printf ("Voti: ");
        	  scanf ("%d   ", (*p).pListe[i].voti);
            printf ("Numero di candidati: ");
            scanf ("%d", (*p).pListe[i].nCand);
            for(j=0;j<(*p).pListe[i].nCand;j++){
                printf("\nVoti candidato n%d: ", j+1);
                scanf("%d", (*p).pListe[i].pCand[j].nVoti);
            }/*for annidato*/
        }/*for esterno*/
    }/*Input*/
    
    
    
    int main () {
        Elezioni *pt;
        Input (pt);
        return 1;
    } /* main */
    Potete aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mi sembra una richiesta un po' troppo generica ...

    Se non dici cosa non va, costringi chi ti vuole rispondere a fare un lavoro magari troppo impegnativo e cosi' non ottieni aiuto ...

    In un forum si possono dare consigli, ma non e' una scuola privata ...

    In ogni caso, la prima cosa che si nota e' che il puntatore usato nel main non corrisponde ad una corrispondente area allocata in memoria ...

  3. #3
    Praticamente in compilazione mi segnala mi da tutto giusto.

    Quando eseguo ed inserisco la data, che è la prima cosa che richiede, si blocca e da l'errore dell'applicazione.

    Devo aver fatto un uso sbagliato del puntatore o della struttura.

  4. #4
    Originariamente inviato da oregon
    In ogni caso, la prima cosa che si nota e' che il puntatore usato nel main non corrisponde ad una corrispondente area allocata in memoria ...
    Come potrei correggerlo?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... come avevo aggiunto alla fine della mia risposta, non vedo dove allochi la memoria per il puntatore che hai usato ... non lo hai proprio fatto ...

  6. #6
    Ma di quanto lo devo allocare il puntatore?

    codice:
    #include <stdio.h>
    
    typedef struct {
            int nVoti;
    } Candidato;
    
    typedef struct {
            char nome[5];
            Candidato * pCand;
            int nCand;
            int voti;    /* numero voti ottenuti dalla lista */
    } Lista;
    
    typedef struct {
            char data[11];
            int consiglieri;
            Lista * pListe;
            int nListe;      /* numero di liste presentate */
    } Elezioni;
    
    
    void Input (Elezioni *p) {
        int i,j;
        printf ("**** ELEZIONI *****\n\n");
        printf ("Inserire la data delle elezioni: ");
        scanf ("%s", (*p).data);
        printf ("\nNumero di consiglieri da eleggere: ");
        scanf ("%d", (*p).consiglieri);
        printf ("\nInserire il numero di liste: ");
        scanf ("%d", (*p).nListe);
        for (i=0;i<(*p).nListe;i++) {
        	  printf ("\n\nLISTA[%d]: ", i+1);
        	  scanf ("%s   ", (*p).pListe[i].nome);
        	  printf ("Voti: ");
        	  scanf ("%d   ", (*p).pListe[i].voti);
            printf ("Numero di candidati: ");
            scanf ("%d", (*p).pListe[i].nCand);
            for(j=0;j<(*p).pListe[i].nCand;j++){
                printf("\nVoti candidato n%d: ", j+1);
                scanf("%d", (*p).pListe[i].pCand[j].nVoti);
            }/*for annidato*/
        }/*for esterno*/
    }/*Input*/
    
    
    
    int main () {
        Elezioni *pt;
        pt = (elezioni*)calloc(?,sizeof(elezioni));  // ? è da sostituire con una lunghezza che non so
        assert (pt!=NULL);
        Input (pt);
        return 1;
    } /* main */

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh ... questo dipende dall'analisi del problema che hai fatto tu.

    Non ho le idee chiarissime su come sono organizzati i tuoi dati, quali sono e quanti sono, quindi non posso risponderti ...

    P.S. Ricordati che la memoria deve essere liberata quando non ti serve piu' ...
    E controlla anche il fatto che esistono dei puntatori che sono a loro volta all'interno della struttura e che devono puntare ad area allocata ...

  8. #8
    Ho sistemato. Non avevo passato per indirizzo il puntatore parametro delle funzione Input.

    Cioè nel main dovevo scrivere:
    codice:
    int main() {
       Elezioni pt;
       Input(&pt);
       .
       ....
    } /* main */

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quello che hai scritto e' (quasi) equivalente a

    codice:
    int main () {
        Elezioni *pt;
        pt = (elezioni*)calloc(1,sizeof(Elezioni));  
        assert (pt!=NULL);
        Input (pt);
        return 1;
    } /* main */
    tranne per il fatto che in questo caso allochi dinamicamente la memoria nell'heap per la struttura e in quello che hai mostrato allochi staticamente la memoria nello stack.

    Nessuna differenza per la "logica" del programma e per quello che ti ho detto circa i puntatori contenuti nella struttura. Se non allochi la memoria per tali puntatori, avrai altri errori.

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.