Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    271

    rubrica problema con i puntatori

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #ifndef _SCHEDA_DEFINED
    #define	_SCHEDA_DEFINED
    
    typedef struct scheda { char nome[15];
                            char cognome[15];
                            char email[30];
                            char telefono[15];
                          } SCHEDA;
    
    #endif
    
    int Allunga
    ( SCHEDA ***PpTesta, // puntatore al puntatore all'array dei puntatori
      int      *Pn       // puntatore al numero di elementi allocati
    );
    
    int CercaPosto
    ( SCHEDA **Ptesta,   // puntatore all'array dei puntatori
      int    Nelementi   // numero di elementi allocati
    );
    
    void EliminaScheda
    ( SCHEDA **Ptesta, // puntatore all'array dei puntatori
      int    Indice    // indice nell'array del puntatore alla scheda
    );
    
    void RiempiScheda
    ( SCHEDA **Ptesta, // puntatore all'array dei puntatori
      int    Indice,   // indice nell'array del puntatore alla scheda
      char   *Info1,
      char   *Info2,
      char   *Info3,
      char   *Info4     // informazioni da memorizzare
    );
    
    void StampaSchede
    ( SCHEDA **Ptesta,   // puntatore all'array dei puntatori
      int    Nelementi   // numero di elementi allocati
    );
    
    void Elabora
    ( SCHEDA **Ptesta,
      int Nelementi
    );
    
    int main(void) 
    {   SCHEDA **Ptesta;     // puntatore all`array dei puntatori   
         int    Nelementi;    // numero di elementi allocati          
         
         Ptesta    = NULL;   
         Nelementi = 0;   
         Elabora(Ptesta,Nelementi);   
         StampaSchede (Ptesta, Nelementi);   
         system("PAUSE");   
         return 0; 
    }  
    
    void Elabora 
    ( SCHEDA ****Ptesta,   
      int Nelementi ) 
    {   int i,Nuova;     
        char   Info[100];      
    
        for (i=1; i<=10; i++)   {     
            Nuova = CercaPosto (Ptesta, Nelementi);     
            if (Nuova < 0)       
                if ( Allunga(&Ptesta, &Nelementi) == 0 ) // allocazione avvenuta         
                    Nuova = Nelementi - 1;                 // l`ultimo elemento      
            if (Nuova < 0)       printf ("\n *** Impossibile inserire altri elementi ***\n");     
            else     
            {    sprintf (Info, "Elem n.%3d",i);                  
                  printf("\n%s",Info);       
                  RiempiScheda (Ptesta, Nuova, Info, Info, Info, Info);     
            }   
        } 
    }  
    
    int Allunga 
    ( SCHEDA ***PpTesta, // puntatore al puntatore all'array dei puntatori   
      int      *Pn       // puntatore al numero di elementi allocati ) 
    { SCHEDA **Temp;   
       int    Errore = -1;    
    
       Temp = (SCHEDA **)realloc(*PpTesta, (*Pn+1)*sizeof(SCHEDA*));   
       if (Temp != NULL)   
       {     Temp[*Pn] = (SCHEDA *)malloc(sizeof(SCHEDA));     
              if (Temp[*Pn] != NULL)     
              {    *PpTesta = Temp;       
                    Temp[*Pn]->nome[0] = '\0'; // marca la scheda come disponibile       
                    Temp[*Pn]->cognome[0] = '\0';       
                    Temp[*Pn]->email[0] = '\0';       
                    Temp[*Pn]->telefono[0] = '\0';       
                    (*Pn)++;        // senza le parentesi verrebbe incrementato Pn       
                    Errore = 0;     // allocazione avvenuta con successo     
              }   
       }   
       return Errore; 
    }  
    
    int CercaPosto 
    ( SCHEDA **Ptesta,   // puntatore all'array dei puntatori   
      int    Nelementi   // numero di elementi allocati ) 
    {  int    Indice;    // Partendo dall'ultima scheda, arretra fino a trovare una   // locazione disponibile o a oltrepassare l'array (-1)   
    
       for ( Indice = Nelementi-1;         
       Indice >=0 && Ptesta[Indice]->nome[0] != '\0';         
       Indice --                                      );    
       return Indice; 
    }  
    
    void RiempiScheda 
    ( SCHEDA **Ptesta, // puntatore all'array dei puntatori   
      int    Indice,   // indice nell'array del puntatore alla scheda   
      char   *Info1,   char   *Info2,   char   *Info3,   char   *Info4     // informazioni da memorizzare ) 
    {   strcpy (Ptesta[Indice]->nome, Info1);   
         strcpy (Ptesta[Indice]->cognome, Info2);   
         strcpy (Ptesta[Indice]->email, Info3);   
         strcpy (Ptesta[Indice]->telefono, Info4); 
    }  
    
    void EliminaScheda 
    ( SCHEDA **Ptesta, // puntatore all'array dei puntatori   
    int    Indice    // indice nell'array del puntatore alla scheda ) 
    {   Ptesta[Indice]->nome[0] = '\0';   
        Ptesta[Indice]->cognome[0] = '\0';    // superfluo   
        Ptesta[Indice]->email[0] = '\0';      // superfluo   
        Ptesta[Indice]->telefono[0] = '\0';   // superfluo 
    }  
    
    void StampaSchede 
    ( SCHEDA **Ptesta,   // puntatore all'array dei puntatori   
    int    Nelementi   // numero di elementi allocati ) 
    {    int    Indice;    
    
         printf ("\n-----------------------------------------------------\n");   
         for ( Indice = 0; Indice < Nelementi; Indice ++ )     
             if (Ptesta[Indice]->nome[0] != '\0')       
                 printf ("%-15s %-15s %-15s %-15s\n", Ptesta[Indice]->nome, Ptesta[Indice]->cognome, Ptesta[Indice]->email, Ptesta[Indice]->telefono);    
         printf ("\n\n"); 
    }
    perchè se la funzione StampaSchede la richiamo all'interno di Elabora funziona e se la chiamo nel main non funziona? Come devo modificare il codice per fare in modo di far funzionare StampaSchede quando lo richiamo nel main?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Perche' hai scritto

    codice:
    void Elabora
    ( SCHEDA **Ptesta,
      int Nelementi
    );
    per dichiararla e poi scrivi

    codice:
    void Elabora 
    ( SCHEDA ****Ptesta,   
      int Nelementi )
    Come mai?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    271
    quello è un'errore perchè facevo qualche prova, ma correggendo quello non cambia niente

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    271
    up!

    p.s. mi sono accorto di aver mancato il tag con il linguaggio nel titolo, ma erano già passati i 60 minuti e non potevo modificarlo.. qualche admin può? grazie

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Per fare velocemente delle prove, fammi vedere come scrivere il codice che funziona (e dimmi cosa dovrei vedere in output) e come invece scrivere il codice in modo che non funziona ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    271
    se metti StampaSchede(Ptesta, Nelementi); alla fine di Elabora, dopo che si è chiuso il ciclo for, funziona e vedi l'output (però devi togliere questa chiamata dal main).. lo stesso vorrei ottenere lasciando questa chiamata nel main.. solo che nel main non funziona.. è sicuramente un problema di puntatori..

    codice:
    void Elabora 
    ( SCHEDA **Ptesta,   
      int Nelementi ) 
    {   int i,Nuova;     
        char   Info[100];      
    
        for (i=1; i<=10; i++)   {     
            Nuova = CercaPosto (Ptesta, Nelementi);     
            if (Nuova < 0)       
                if ( Allunga(&Ptesta, &Nelementi) == 0 ) // allocazione avvenuta         
                    Nuova = Nelementi - 1;                 // l`ultimo elemento      
            if (Nuova < 0)       printf ("\n *** Impossibile inserire altri elementi ***\n");     
            else     
            {    sprintf (Info, "Elem n.%3d",i);                  
                  printf("\n%s",Info);       
                  RiempiScheda (Ptesta, Nuova, Info, Info, Info, Info);     
            }   
        } 
        StampaSchede(Ptesta, Nelementi);
    }

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Devi rivedere la tua funzione

    Elabora

    in modo che accetti come argomento un triplo puntatore e un puntatore singolo

    ( SCHEDA ***Ptesta,
    int *Nelementi )

    In seguito, nel main, devi scrivere

    codice:
    ...
         Elabora(&Ptesta, &Nelementi);  
         StampaSchede(Ptesta, Nelementi);   
    ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    271
    se faccio come hai detto mi da 6 warning nei punti dove vengono usati Ptesta e Nelementi, quindi nelle chiamate

    CercaPosto (Ptesta, Nelementi);
    if ( Allunga(&Ptesta, &Nelementi) == 0 )
    Nuova = Nelementi - 1;
    RiempiScheda (Ptesta, Nuova, Info, Info, Info, Info);

    sostituendo queste chiamate con:

    CercaPosto (*Ptesta,*Nelementi);
    if ( Allunga(*&Ptesta, *&Nelementi) == 0 )
    Nuova = *Nelementi - 1;
    RiempiScheda (*Ptesta, Nuova, Info, Info, Info, Info);

    funziona! ma mi puoi spiegare meglio cosa succede? ed è normale fare una cosa tipo *&Ptesta??

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da dogo21sob
    se faccio come hai detto mi da 6 warning
    Infatti ... ti avevo scritto

    Devi rivedere la tua funzione

    Elabora

    ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    271
    sostituendo queste chiamate con:

    CercaPosto (*Ptesta,*Nelementi);
    if ( Allunga(*&Ptesta, *&Nelementi) == 0 )
    Nuova = *Nelementi - 1;
    RiempiScheda (*Ptesta, Nuova, Info, Info, Info, Info);

    funziona! ma mi puoi spiegare meglio cosa succede? ed è normale fare una cosa tipo *&Ptesta??

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.