Puntatori problem

di il
3 risposte

Puntatori problem

Salve.
premetto che i puntatori mi stanno molto sulle scatole.Accurato questo, ragazzi ho un problema con dei puntatori che puntano a strutture adesso vi faccio vedere la parte del programma interessata
//Semplice struttura che modella una persona
struct per{
    char nome[DIM];
    char cognome[DIM];
    char indirizzo[DIM];
    int eta;
};

void canPer();
struct per *cerPer(struct per *);
void datiPer(struct per *);

//Cancella persona dall'anagrafe, se presente
void canPer()
{

    char pausa;
    struct per *ps;
    struct per *peo;

    printf("\n\n\t\tCANCELLA PERSONA");
    datiPer(peo);

    //invoca ricerca persona
    ps=cerPer(peo);
    if(ps==NULL)    {
        printf("\nPersona non presente in anagrafe");
        scanf("%c",&pausa);
        return;
    }

    //invoca visualizza persona
    visPer(ps);
    printf("\nConfermi cancellazione? (S/N)");
    scanf("%c",&pausa);
    if(pausa=='S'||pausa=='s')  {
        eliPer(ps);
        return;
    }
}

//inserisce dat ipersona
void datiPer(struct per *p)
{

    char pausa;

    printf("\n\t\t---------------\n\n");
    printf("\nCognome: ");
    gets(p->cognome);
    printf("\nNome: ");
    gets(p->nome);
    printf("\nEta': ");
    scanf("%d",&p->eta);
    scanf("%c",&pausa);
}

struct per *cerPer(struct per *p)
{

  int i;

  for(i=0;i<=index;i++) {
        if(strcmp(p->cognome,anag[i].cognome)==0)
            if(strcmp(p->nome,anag[i].nome)==0)
                if(p->eta==anag[i].eta)
                    return(&anag[i]);
  }
  return(NULL);
}
nella chiamata di funzione datiPer della funzione canPer il puntatore struct per peo dovrebbe essere un doppio puntatore.
grazie

3 Risposte

  • Re: Puntatori problem

    thorny84 ha scritto:


    salve.
    premetto che i puntatori mi stanno molto sulle scatole.
    Cerca di capirli bene dato che il C è 90% puntatori.
    ragazzi ho un problema con dei puntatori che puntano a strutture adesso vi faccio vedere la parte del programma interessata
    ...
    
    //inserisce dat ipersona
    void datiPer(struct per **p)
    {
    
        /* Riottengo il puntatore originale per non scrivere sempre:
            (*p)->campo che è brutto da vedere :p
        */
        struct per *p_per = *p; /* Riottengo il puntatore originale */
        char pausa;
    
        printf("\n\t\t---------------\n\n");
        printf("\nCognome: ");
        gets(p_per->cognome);
        printf("\nNome: ");
        gets(p_per->nome);
        printf("\nEta': ");
        scanf("%d",&p_per->eta);
        scanf("%c",&pausa);
    }
    ...
    
        struct per *peo;
        printf("\n\n\t\tCANCELLA PERSONA");
        datiPer(&peo); /* passo il puntatore a puntatore */
    
    
    P.S. Meglio se acquisisci con fgets(), perché gets() è un buco nero supermassiccio per la sicurezza.
  • Re: Puntatori problem

    Grazie shodan ho gli incubi la notte
  • Re: Puntatori problem

    Alla fine ci ho ragionato un po sopra e ho trovato una soluzione senza usare i doppi puntatori (anche se devo ostinarmi ad impararmeli) cmq scrivo il codice che funziona, e un bel po di codice ma spero possa servire a quacuno:
    /*Modificare il programma di gestione del Caso di studio creando un'apposita funzione che richieda i dati di una persona
        la funzione e richiamata tanto in fase di cancellazione tanto in quella di ricerca*/
    
    #include<stdio.h>
    #include<string.h>
    
    #define MAXELE 30
    #define DIM 31
    #define MENU 0
    #define OUT 100
    #define INS 1
    #define CAN 2
    #define RIC 3
    #define VIS 4
    
    //Semplice struttura che modella una persona
    struct per{
        char nome[DIM];
        char cognome[DIM];
        char indirizzo[DIM];
        int eta;
    };
    
    //Vettore persone
    struct per anag[MAXELE];
    
    //Numero elementi allocati nel vettore anag
    int index=0;
    
    int menPer();
    int insPer(int);
    void canPer();
    struct per *cerPer(struct per);
    void visPer(struct per *);
    void eliPer(struct per *);
    void ricPer();
    void visAnagrafe();
    void datiPer(struct per *);
    
    int main (void)
    {
    
        int scelta=MENU;
        while (scelta!=OUT) {
            switch  (scelta){
                case MENU:
                    scelta=menPer();
                    if(scelta==MENU)
                        scelta=OUT;
                    break;
                case INS:
                    index=insPer(index);
                    scelta=MENU;
                    break;
                case CAN:
                    canPer();
                    scelta=MENU;
                    break;
                case RIC:
                    ricPer();
                    scelta=MENU;
                    break;
                case VIS:
                    visAnagrafe();
                    scelta=MENU;
                    break;
            }
        }
    }
    
    /*MENU*/
    int menPer()
    {
    
        int scelta;
        char invio;
        int vero=1;
    
        while(vero) {
            printf("\n\n");
            printf("\t\t\t  ANAGRAFE");
            printf("\n\n\n\t\t\t1. Immissione persona");
            printf("\n\n\n\t\t\t2. Cancellazione persona");
            printf("\n\n\n\t\t\t3. Ricerca persona");
            printf("\n\n\n\t\t\t4. Visualizzazione anagrafe");
            printf("\n\n\n\t\t\t0. Fine");
            printf("\n\n\n\n\t\t\t  Scegliere una opzione: ");
            scanf("%d",&scelta);
            scanf("%c",&invio);
            switch(scelta)  {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                    return(scelta);
                default:
                    printf("Opzione non accettata");
                    break;
            }
        }
        return(0);
    }
    
    //inserisce persone all'angrafe
    int insPer(int pos)
    {
    
        char invio;
        if(pos>=MAXELE) {
            printf("  Non si possono inserire altri nomi");
            scanf("%c",&invio);
            return(pos);
        }
    
        printf("\n\n\t\tINSERIMENTO PERSONA");
        printf("\n\t\t---------------\n\n");
        printf("\nCognome: ");
        gets(anag[pos].cognome);
        printf("\nNome: ");
        gets(anag[pos].nome);
        printf("\nIndirizzo: ");
        gets(anag[pos].indirizzo);
        printf("\nEta': ");
        scanf("%d",&anag[pos].eta);
        scanf("%c",&invio);
        pos++;
        return(pos);
    }
    
    //Cancella persona dall'anagrafe, se presente
    void canPer()
    {
    
        char pausa;
        struct per *ps;
        struct per peo;
    
        printf("\n\n\t\tCANCELLA PERSONA");
        datiPer(&peo);
    printf("\nc:%s\nn:%se:%d",peo.cognome,peo.nome,peo.eta);
        //invoca ricerca persona
        ps=cerPer(peo);
        if(ps==NULL)    {
            printf("\nPersona non presente in anagrafe");
            scanf("%c",&pausa);
            return;
        }
    
        //invoca visualizza persona
        visPer(ps);
        printf("\nConfermi cancellazione? (S/N)");
        scanf("%c",&pausa);
        if(pausa=='S'||pausa=='s')  {
            eliPer(ps);
            return;
        }
    }
    
    //inserisce dati persona
    void datiPer(struct per *p)
    {
    
        char pausa;
    
        printf("\n\t\t---------------\n\n");
        printf("\nCognome: ");
        gets(p->cognome);
        printf("\nNome: ");
        gets(p->nome);
        printf("\nEta': ");
        scanf("%d",&p->eta);
        scanf("%c",&pausa);
    }
    
    //elimina una persona dallanagrafe
    void eliPer(struct per *p)
    {
    
        strcpy(p->cognome,"");
        strcpy(p->nome,"");
        strcpy(p->indirizzo,"");
        p->eta=0;
    }
    
    //Ricerca persona se presente nell'anagrafe
    void ricPer()
    {
    
        char pausa;
        struct per *ps;
        struct per peo;
    
        //inserimento dati persona da ricercare
        printf("\n\n\t\tRICERCA PERSONA");
        datiPer(&peo);
    
        //invoca ricerca persona
        ps=cerPer(peo);
        if(ps==NULL)    {
            printf("\nPersona non presente in anagrafe");
            scanf("%c",&pausa);
            return;
        }
        visPer(ps);
        scanf("%c",&pausa);
        return;
    }
    
    //visualizza persona
    void visPer(struct per* p)
    {
    
        printf("\n\n--------------------\n");
        printf("\n\t\tCognome: %s",p->cognome);
        printf("\n\t\tNome: %s",p->nome);
        printf("\n\t\tIndirizzo: %s",p->indirizzo);
        printf("\n\t\tEta': %d",p->eta);
        printf("\n\n--------------------\n");
    }
    
    //scanzione sequenziale del vettore anag alla ricerca di una persona cha abbia
    //determinati cognome, nome ed eta
    struct per *cerPer(struct per p)
    {
    
      int i;
    printf("\nc:%s\nn:%se:%d",p.cognome,p.nome,p.eta);
      for(i=0;i<=index;i++) {
            if(strcmp(p.cognome,anag[i].cognome)==0)
                if(strcmp(p.nome,anag[i].nome)==0)
                    if(p.eta==anag[i].eta)
                        return(&anag[i]);
      }
      return(NULL);
    }
    
    //visualizza l'anagrafe completa
    void visAnagrafe()
    {
    
        int i;
        char pause;
        struct per *ps=&anag[0];
    
        for(i=0;i<index;i++) {
                visPer(ps++);
                scanf("%c",&pause);
        }
    }
    
    Grazie per la dritta del fgetsma me la puoi spiegare meglio
Devi accedere o registrarti per scrivere nel forum
3 risposte