Notizia:
  • Rilasciata Precise Pangolin 12.04. Per ottenerla, visitate questa pagina, oppure provate il tour dal vivo con un browser web moderno.
  • Nuovo forum di Ubuntu-it, l'annuncio. È consigliato aggiornare il proprio profilo e controllare la sezione Gruppo Forum per problemi noti.
  • Rilasciata la versione italiana di Precise Pangolin 12.04. Per maggiori informazioni, consultare questa discussione.
  • Il vincitore del Concorso desktop del mese di aprile è Jerico. L'elenco dei precedenti vincitori è qui.
  • È uscito il numero 17 della Newsletter italiana di Ubuntu. Lo trovate a questo indirizzo.
  • È uscito il numero 59 di Full Circle Magazine in italiano. Lo trovate a questo indirizzo.

[Risolto] [C++]Passaggio puntatore a funzione

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Risolto] [C++]Passaggio puntatore a funzione

Messaggioda cent » giovedì 1 gennaio 2009, 22:41

Salve a tutti ragazzi. Sto preparando un programmino per l'esame di informatica e non riesco a risolvere un problema.
Praticamente ho creato una funzione che crea una lista dinamica; questa viene invocata passandogli dei parametri per reference. Tali parametri sono tutti nulli, dato che verranno riempiti dalla funzione stessa al suo termine.
Se passo delle semplici variabili, tutto funziona; se passo invece un puntatore (dove verrà memorizzato l'indirizzo della testa della lista), questo torna sempre NULL:

Codice: Seleziona tutto
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///Funzione che legge il file "database/registroAbbonamenti.txt" e lo memorizza in una lista dinamica///
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void leggiAbbonamenti(int &numAbb, int &codiceAbb, abbonamento *testaListaAbb){
   [...]
    return;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///Fine funzione///
///////////////////

int main(){
    int numAbb, codiceAbb;
    abbonamento *testaListaAbb=NULL;
    leggiAbbonamenti(numAbb, codiceAbb, testaListaAbb);
   system("PAUSE");
}

E' sbagliato il passaggio oppure c'è proprio qualcosa nella funzione??
Grazie mille
Roberto
Ultima modifica di cent il giovedì 1 gennaio 2009, 23:30, modificato 1 volta in totale.
cent
Prode Principiante
 
Messaggi: 197
Iscrizione: gennaio 2007

Re: [C++]Passaggio puntatore a funzione

Messaggioda kelev » giovedì 1 gennaio 2009, 22:59

Prova così:

Codice: Seleziona tutto
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///Funzione che legge il file "database/registroAbbonamenti.txt" e lo memorizza in una lista dinamica///
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void leggiAbbonamenti(int numAbb, int codiceAbb, abbonamento *testaListaAbb){
   [...]
    return;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///Fine funzione///
///////////////////

int main(){
    int numAbb, codiceAbb;
    abbonamento *testaListaAbb=NULL;
    leggiAbbonamenti(numAbb, codiceAbb, &testaListaAbb);
   system("PAUSE");
}
"E alla fine sei da solo, dove vai, con chi brindi?"
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1758
Iscrizione: settembre 2008

Re: [C++]Passaggio puntatore a funzione

Messaggioda cent » giovedì 1 gennaio 2009, 23:06

No, ci avevo provato anche io ma l'errore è il seguente:
163 K:\Parcheggio.cpp cannot convert `abbonamento**' to `abbonamento*' for argument `3' to `void leggiAbbonamenti(int&, int&, abbonamento*)'
cent
Prode Principiante
 
Messaggi: 197
Iscrizione: gennaio 2007

Re: [C++]Passaggio puntatore a funzione

Messaggioda kelev » giovedì 1 gennaio 2009, 23:08

Puoi postare il programma che compili?
"E alla fine sei da solo, dove vai, con chi brindi?"
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1758
Iscrizione: settembre 2008

Re: [C++]Passaggio puntatore a funzione

Messaggioda cent » giovedì 1 gennaio 2009, 23:13

Questa è la fuzione principale, il main è quello sopra:
Codice: Seleziona tutto
void leggiAbbonamenti(int &numAbb, int &codiceAbb, abbonamento *testaListaAbb){
   ifstream fin;
   char nome[100], residenza[100], telefono[20], buffer1[31], file[100], codice[100], buffer2[31], credito[100];
   int codice2;
   abbonamento *current=NULL;
   abbonamento *head=NULL;
   abbonamento *temp=NULL;

   strcpy(file,"database/registroAbbonamenti.txt");
   fin.open(file);
   if(fin.fail()){
      cout<<"Errore (1) apertura file!\n";
   }
    int t=0;
   while(!fin.eof()){
      //estrazione campi
      //se il primo carattere è diverso da "/", allora errore lettura del file
      fin.getline(buffer1,30);t++;
      fin.getline(nome,99);t++;
      fin.getline(residenza,99);t++;
      fin.getline(telefono,99);t++;
      fin.getline(codice,99);t++;
      fin.getline(credito,99);t++;
      fin.getline(buffer2,30);t++;
      codiceAbb=atoi(codice);
      codice2=atoi(codice);
      if (buffer1[0]!='/' || buffer2[0]!='/'){
            cout<<"Errore (2) di lettura del file. File danneggiato! Righe::  "<<t<<"\n";
         //cout<<"Buffer1::  -"<<buffer1<<"-   nome::   -"<<nome<<"-   residenza::   -"<<residenza<<"-   telefono::   -"<<telefono<<"-   codice::   -"<<codice<<"-\n";
         break;
      }else{
            //aggiungo alla struttura dati
            //cout<<"Aggiungo i dati alla lista\n";
            temp=new abbonamento;
            strcpy(temp->nome,nome);
            strcpy(temp->residenza,residenza);
            strcpy(temp->telefono,telefono);
            strcpy(temp->codice,codice);
            strcpy(temp->credito,credito);
            temp->next=NULL;
            if(head==NULL){
                   head=temp;
                   //current=head;
              }else{
                    current=head;
                    while(current->next!=NULL)
                          current=current->next;
                    current->next=temp;
              }
              
          }
   }//fine ciclo while
   cout<<"Righe totali file:  "<<t<<"\n";
   cout<<"Elenco abbonamenti: \n";
    current=head;
    testaListaAbb=head;
   int i=0;  
    while(current!=NULL){
           cout<<"\n--------------------\n";
           cout<<current->nome<<"\n";
           cout<<current->residenza<<"\n";
           cout<<current->telefono<<"\n";
           cout<<current->codice<<"\n";
           cout<<current->credito<<"\n";
           current=current->next;
          i++;
    }
    cout<<"\n--------------------\n";
    numAbb=i;
    return;
}
cent
Prode Principiante
 
Messaggi: 197
Iscrizione: gennaio 2007

Re: [C++]Passaggio puntatore a funzione

Messaggioda kelev » giovedì 1 gennaio 2009, 23:15

Nel passaggio di parametri un puntatore:
- Parametri formali => void ciao(int *x, int *y) ;
- Parametri attuali => ciao(&x,&y).

Quindi da così:

Codice: Seleziona tutto
void leggiAbbonamenti(int &numAbb, int &codiceAbb, abbonamento *testaListaAbb){


a così:

Codice: Seleziona tutto
void leggiAbbonamenti(int numAbb, int codiceAbb, abbonamento *testaListaAbb){
Ultima modifica di kelev il giovedì 1 gennaio 2009, 23:21, modificato 1 volta in totale.
"E alla fine sei da solo, dove vai, con chi brindi?"
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1758
Iscrizione: settembre 2008

Re: [C++]Passaggio puntatore a funzione

Messaggioda menelicte » giovedì 1 gennaio 2009, 23:21

Se devi modificare l'indirizzo della lista, devi passarlo per riferimento, usando quindi un puntatore di puntatore.

Prova a modificare così, usando
Codice: Seleziona tutto
(*testaListaAbb)
al posto di
Codice: Seleziona tutto
testaListaAbb
all'interno della funzione:

Codice: Seleziona tutto
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///Funzione che legge il file "database/registroAbbonamenti.txt" e lo memorizza in una lista dinamica///
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void leggiAbbonamenti(int numAbb, int codiceAbb, abbonamento **testaListaAbb){
   [...]
    return;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///Fine funzione///
///////////////////

int main(){
    int numAbb, codiceAbb;
    abbonamento *testaListaAbb=NULL;
    leggiAbbonamenti(numAbb, codiceAbb, &testaListaAbb);
   system("PAUSE");
}
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 596
Iscrizione: giugno 2007

Re: [C++]Passaggio puntatore a funzione

Messaggioda cent » giovedì 1 gennaio 2009, 23:24

No, non devo modificarlo, devo solo ottenerlo per utilizzarlo in un'altra funzione.

@xajx: non funziona anche apportando le modifiche sugeritemi.
cent
Prode Principiante
 
Messaggi: 197
Iscrizione: gennaio 2007

Re: [C++]Passaggio puntatore a funzione

Messaggioda cent » giovedì 1 gennaio 2009, 23:30

Ok, ora funziona.
Grazie a tutti
cent
Prode Principiante
 
Messaggi: 197
Iscrizione: gennaio 2007

Re: [C++]Passaggio puntatore a funzione

Messaggioda kelev » giovedì 1 gennaio 2009, 23:30

Cosa hai corretto?
"E alla fine sei da solo, dove vai, con chi brindi?"
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1758
Iscrizione: settembre 2008

Re: [Risolto] [C++]Passaggio puntatore a funzione

Messaggioda cent » martedì 6 gennaio 2009, 12:40

Ciao, allora ho messo un doppio asterisco al nome della variabile (puntatore) quando definisco la funzione; all'interno della funzione, quando vado a modificare il puntatore in questione metto solo un asterisco.
Quando richiamo la funzione, passo il puntatore senza * e &.

Ciao ciao
cent
Prode Principiante
 
Messaggi: 197
Iscrizione: gennaio 2007

Re: [Risolto] [C++]Passaggio puntatore a funzione

Messaggioda kelev » martedì 6 gennaio 2009, 12:51

Ah ok grazie :)
"E alla fine sei da solo, dove vai, con chi brindi?"
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1758
Iscrizione: settembre 2008


Torna a Programmazione

Chi c’è in linea

Visualizzano questa pagina: Andreahma, djluka89, ele_girasole e 2 ospiti