Cambia tema in:  • Kubuntu  • Xubuntu  • Edubuntu  
04 Luglio, 2009, 12:54:46 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: È uscita la nuove release di Ubuntu: Ubuntu 9.04 Jaunty Jackalope. Scopri tutte le novità della nuova release nelle Note di Rilascio. Consulta la Documentazione Ufficiale, la Guida per l'Aggiornamento o la Guida per l'Installazione.
 
   Indice   Aiuto Regolamento Ricerca Agenda Accedi Registrati  

Guide
Programmazione
Wiki
Programmazione   •   Editor di Testo   •   Linguaggio Bash
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [Risolto] [C++]Passaggio puntatore a funzione  (Letto 344 volte)
0 Utenti e 1 Utente non registrato stanno visualizzando questa discussione.
cent
Jr. Member
**
Non Connesso Non Connesso

Messaggi: 191

Media messaggi


Mostra profilo
« inserita: 01 Gennaio, 2009, 22:41:24 »

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:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///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: 01 Gennaio, 2009, 23:30:33 da cent » Registrato
xajx
Hero Member
*****
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1.371

Media messaggi


~ dreamer ~


Mostra profilo
« Risposta #1 inserita: 01 Gennaio, 2009, 22:59:03 »

Prova così:

Codice:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///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");
}
Registrato

.: Linux user: #478610 :.
cent
Jr. Member
**
Non Connesso Non Connesso

Messaggi: 191

Media messaggi


Mostra profilo
« Risposta #2 inserita: 01 Gennaio, 2009, 23:06:13 »

No, ci avevo provato anche io ma l'errore è il seguente:
Citazione
163 K:\Parcheggio.cpp cannot convert `abbonamento**' to `abbonamento*' for argument `3' to `void leggiAbbonamenti(int&, int&, abbonamento*)'
Registrato
xajx
Hero Member
*****
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1371

Media messaggi


~ dreamer ~


Mostra profilo
« Risposta #3 inserita: 01 Gennaio, 2009, 23:08:32 »

Puoi postare il programma che compili?
Registrato

.: Linux user: #478610 :.
cent
Jr. Member
**
Non Connesso Non Connesso

Messaggi: 191

Media messaggi


Mostra profilo
« Risposta #4 inserita: 01 Gennaio, 2009, 23:13:49 »

Questa è la fuzione principale, il main è quello sopra:
Codice:
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;
}
Registrato
xajx
Hero Member
*****
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1371

Media messaggi


~ dreamer ~


Mostra profilo
« Risposta #5 inserita: 01 Gennaio, 2009, 23:15:18 »

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

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

a così:

Codice:
void leggiAbbonamenti(int numAbb, int codiceAbb, abbonamento *testaListaAbb){
« Ultima modifica: 01 Gennaio, 2009, 23:21:36 da xajx » Registrato

.: Linux user: #478610 :.
menelicte
Sr. Member
****
Non Connesso Non Connesso

Messaggi: 595

Media messaggi



Mostra profilo
« Risposta #6 inserita: 01 Gennaio, 2009, 23:21:33 »

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

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

Codice:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///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");
}
Registrato

"Tentare è il primo passo verso il fallimento" Homer J.
cent
Jr. Member
**
Non Connesso Non Connesso

Messaggi: 191

Media messaggi


Mostra profilo
« Risposta #7 inserita: 01 Gennaio, 2009, 23:24:52 »

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

@xajx: non funziona anche apportando le modifiche sugeritemi.
Registrato
cent
Jr. Member
**
Non Connesso Non Connesso

Messaggi: 191

Media messaggi


Mostra profilo
« Risposta #8 inserita: 01 Gennaio, 2009, 23:30:13 »

Ok, ora funziona.
Grazie a tutti
Registrato
xajx
Hero Member
*****
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1371

Media messaggi


~ dreamer ~


Mostra profilo
« Risposta #9 inserita: 01 Gennaio, 2009, 23:30:39 »

Cosa hai corretto?
Registrato

.: Linux user: #478610 :.
cent
Jr. Member
**
Non Connesso Non Connesso

Messaggi: 191

Media messaggi


Mostra profilo
« Risposta #10 inserita: 06 Gennaio, 2009, 12:40:20 »

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
Registrato
xajx
Hero Member
*****
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1371

Media messaggi


~ dreamer ~


Mostra profilo
« Risposta #11 inserita: 06 Gennaio, 2009, 12:51:37 »

Ah ok grazie Smiley
Registrato

.: Linux user: #478610 :.
Pagine: [1]   Vai su
  Stampa  
 
Vai a: