Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Pointer - Help
Forum - C/C++ - Pointer - Help

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Lionel88 (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/06/2012

Segnala al moderatore
Postato alle 22:03
Lunedì, 11/06/2012
Ciao a tutti, sono nuovo del forum, ho un grossissimo problema sui puntatori in C++ e per l'esattezza sulla gestione di liste. Ci sto sbattendo dietro la testa da 1gg e non riesco proprio a capirle.
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. using namespace std;
  5. const char AGGIUNGI = 'i';
  6. const char ELIMINA = 'e';
  7. const char FINE = 'f';
  8.  
  9. struct Auto // definisce i dati necessari per l'identificazione di un auto
  10. {
  11.         string marca;
  12.         string modello;
  13.         string colore;
  14.         string targa;
  15.         int anno;
  16.         Auto *nextAuto;
  17. };
  18.  
  19. struct Marca
  20. {
  21.         string marca;
  22.         Marca *nextMarca;
  23.         Auto *ElencoAuto;
  24. };
  25.  
  26. struct Rivenditore
  27. {
  28.         Marca *ElencoMarche;
  29. };
  30.  
  31. void creaLista (Rivenditore &rivenditore);
  32. // void aggiungiAuto();
  33. // void togliAuto();
  34. // Marca *cercaMarca();
  35. void elencoMarche(Rivenditore &nuovoRivenditore);
  36.  
  37. void elencoMarche(Rivenditore &nuovoRivenditore)
  38. {
  39.     Marca *ptr;
  40.     Marca *lastptr;
  41.     ptr = nuovoRivenditore.ElencoMarche;
  42.     while (ptr != NULL)
  43.     {
  44.         cout >> nuovoRivenditore.ElencoMarche;
  45.         ptr = ptr->nextMarca;
  46.     }
  47.    
  48. }
  49.  
  50. void creaLista (Rivenditore &rivenditore)
  51. {
  52.         string NuovaMarca;
  53.         char operazione;
  54.         cout << "Inserisci 'a' se vuoi aggiungere una nuova marca oppure 'f' se vuoi terminare l'inizializzazione" << endl;
  55.         cin >> operazione;
  56.         while (operazione == 'a')
  57.         {
  58.                 Marca *ptr;
  59.                 if (rivenditore.ElencoMarche == NULL)
  60.                 {
  61.                         ptr = new Marca;
  62.                         cout << "Inserisci il nome della nuova marca di Auto da inserire" << endl;
  63.                         cin >> NuovaMarca;
  64.                         ptr->marca = NuovaMarca;
  65.                         ptr->nextMarca = NULL;
  66.                         rivenditore.ElencoMarche = ptr;
  67.                         cout << "Inserisci 'a' se vuoi aggiungere una nuova marca oppure 'f' se vuoi terminare l'inizializzazione" << endl;
  68.             cin >> operazione;
  69.                 }
  70.                 else
  71.                 {
  72.                         Marca *ptrAux;
  73.                         ptrAux = rivenditore.ElencoMarche;
  74.                         while (ptrAux->nextMarca != NULL)
  75.                                 ptrAux = ptrAux->nextMarca;
  76.                         ptr = new Marca;
  77.                         cout << "Inserisci il nome della nuova marca di Auto da inserire" << endl;
  78.                         cin >> NuovaMarca;
  79.                         ptr->marca = NuovaMarca;
  80.             ptr->ElencoAuto = NULL;
  81.                         ptr->nextMarca = NULL;
  82.             ptrAux->nextMarca = ptr;
  83.                         cout << "Inserisci 'a' se vuoi aggiungere una nuova marca oppure 'f' se vuoi terminare l'inizializzazione" << endl;
  84.             cin >> operazione;
  85.                 }
  86.     }
  87. }
  88.     //Marca *cercaMarca( *lista, string nome_marca)
  89.     // {
  90.     //          Marca *elementoCorrente = lista
  91.     //          while (elementoCorrente != NULL)
  92.     //          {
  93.     //                  if ((strmcp(elementoCorrente->nexMarca, nome_marca == 0)
  94.     //                  {
  95.     //                          return elementoCorrente;
  96.     //                  }
  97.     //                  elementoCorrente = elementoCorrente->nextMarca;
  98.     //                  elementoCorrente = lista;
  99.     //          }
  100.     //                  return NULL;
  101.     // }
  102.    
  103. int main (int argc, const char * argv[])
  104. {
  105.     Auto nuovaAuto;
  106.     Rivenditore NuovoRivenditore; // Crea una variabile di tipo rivenditore
  107.         NuovoRivenditore.ElencoMarche = NULL; // inizializzo la variabile NuovoRivenditore a 0 (non punta cioË a nessun elemento)
  108.         creaLista (NuovoRivenditore); // inizializzo la lista contenente tutte le marche
  109.         char operazione;
  110.         int FindMarca; // variabile che restituisce 0 nel caso in cui la marca non Ë presente nel DataBase oppure 1 se Ë presente.
  111.         cout << "Inserisci di seguito l'operazione che vuoi effettuare sul DataBase" << endl;
  112.         cout << "Per aggiungere un auto digita 'i', per eliminarla digita 'e' per terminare il sfw digita 'f' " << endl;
  113.         cin >> operazione;
  114.         while (operazione != FINE)
  115.                 if (operazione == AGGIUNGI)
  116.                 {
  117.                         cout << "Inserire i seguenti dati per registrare la nuova auto" << endl;
  118.             cout << "Inserire la marca dell'auto" << endl;
  119.             cin >> nuovaAuto.marca;
  120.             cout << "Inserire il modello dell'auto" << endl;
  121.             cin >> nuovaAuto.modello;
  122.             cout << "Inserire il colore dell'auto" << endl;
  123.             cin >> nuovaAuto.colore;
  124.             cout << "Inserire il numero di targa dell'auto" << endl;
  125.             cin >> nuovaAuto.targa;
  126.             cout << "Inserire l'anno di immatricolazione dell'auto (AAAA) " << endl;
  127.             cin >> nuovaAuto.anno;
  128.             //  FindMarca = cercaMarca( ,nuovaAuto.marca)
  129.             //          if (FindMarca == 0)
  130.             //          {
  131.             //                  aggiungiMarca();
  132.             //                  aggiungiAuto();
  133.             //          }
  134.             //          else if (FindMarca == 1)
  135.             //          {
  136.             //                  aggiungiAuto();
  137.             //          }
  138.            
  139.                 }
  140.                 else if (operazione == ELIMINA)
  141.                 {
  142.                         return 0;
  143.                 }
  144.         system("PAUSE");  
  145. }



Partiamo dal presupposto che in questo codice ci sono una marea di errori dovuti ad una serie di esperimenti che stavo facendo in quanto non riuscivo a capire bene il funzionamento di questi maledetti puntatori.
L'esercizio mi chiede in poche parole di creare una lista per la rivendita di auto, che presentano i dati già scritti nelle strutture. Da quel punto di vista mi sembra di aver compreso bene il testo. Mi sono creato una funzione creaLista al fine di inizializzare la lista delle marche auto e pure fino a qua penso che il sfw gira. I miei enormi dubbi nascono da queste due cose:
1) Come faccio a stampare solo la lista delle marcheAuto?
2) Che valore deve ritornare? secondo me void oppure int (meglio boolean 0 se non è riuscito oppure 1 se va)

Non riesco veramente a comprendere il passaggio dei parametri con i puntatori....

Help me

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:30
Lunedì, 11/06/2012
Hai fatto troppe domande e confuse.

Limita il problema ... cosa non hai capito dei puntatori esattamente?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Lionel88 (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/06/2012

Segnala al moderatore
Postato alle 8:13
Martedì, 12/06/2012
Ok scusa, ho forse scritto troppe cose in una volta, non riesco a capire come stampare una lista.

Io inizializzo la lista con creaLista e fino a qua mi trovo, ma per stamparla??!!


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:56
Martedì, 12/06/2012
La devi scorrere tramite il puntatore nextAuto


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Lionel88 (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/06/2012

Segnala al moderatore
Postato alle 10:35
Martedì, 12/06/2012
Scusa se magari non ci arrivo subito, però mi viene in mente un dubbio,

Io ho la lista principale che è Rivenditore, che è formata da una variabile di tipo Marca che punta all'elenco delle MarcheAuto.

per andare a stampare solo l'elenco delle Marche non devo far scorrere la lista con *nextMarca?

Sulla parte dei puntatori ho tante idee confusionarie, sul corso che sto seguendo danno troppe informazioni e aspetti per scontato e sul libro che ho preso non mi trovo più di tanto....

Questo era il codice che avevo predisposto io che ovviamente è sbagliato. Riesci a darmi qualche dritta in merito?!

Codice sorgente - presumibilmente C/C++

  1. 37.
  2. void elencoMarche(Rivenditore &nuovoRivenditore)
  3.  
  4. 38.
  5. {
  6.  
  7. 39.
  8.     Marca *ptr;
  9.  
  10. 40.
  11.     Marca *lastptr;
  12.  
  13. 41.
  14.     ptr = nuovoRivenditore.ElencoMarche;
  15.  
  16. 42.
  17.     while (ptr != NULL)
  18.  
  19. 43.
  20.     {
  21.  
  22. 44.
  23.         cout >> nuovoRivenditore.ElencoMarche;
  24.  
  25. 45.
  26.         ptr = ptr->nextMarca;
  27.  
  28. 46.
  29.     }
  30.  
  31. 47.
  32.    
  33.  
  34. 48.
  35. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:03
Martedì, 12/06/2012
Hai due problemi distinti che vanno risolti in maniera e tempi diversi.

Non hai ancora ben chiari i concetti che governano i puntatori e quindi dovresti affrontare programmi semplici che utilizzano i puntatori (le liste non sono adatte da questo punto di vista).

Fatto questo, puoi passare a programmi un pelino più complessi, come quello che vorresti scrivere ma, altro problema, devi descrivere bene le strutture dei tuoi dati.

Mi pare comunque che la cout sia sbagliata ... dovrebbe essere

        cout << ptr->marca;



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Lionel88 (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/06/2012

Segnala al moderatore
Postato alle 11:48
Martedì, 12/06/2012
Testo quotato

Postato originariamente da nessuno:

Hai due problemi distinti che vanno risolti in maniera e tempi diversi.

Non hai ancora ben chiari i concetti che governano i puntatori e quindi dovresti affrontare programmi semplici che utilizzano i puntatori (le liste non sono adatte da questo punto di vista).

Fatto questo, puoi passare a programmi un pelino più complessi, come quello che vorresti scrivere ma, altro problema, devi descrivere bene le strutture dei tuoi dati.

Mi pare comunque che la cout sia sbagliata ... dovrebbe essere

        cout << ptr->marca;




Partiamo dalla cosa più importante e doverosa! Grazie per l'aiuto e per la disponibilità! (Il che non è indifferente!)

Hai già detto tutto tu, io non ho assolutamente chiaro il concetto di puntatore
Ti chiedo per l'ultima volta l'ennesima mano, tu hai per caso un link a della documentazione chiara per "pivelli" a cui posso attingere?

Grazie ancora!

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:14
Martedì, 12/06/2012
Un puntatore e' semplicemente una variabile (solitamente un int) che contiene un indirizzo di memoria (un numero).

In C dichiari un puntatore in questa maniera:

Codice sorgente - presumibilmente Plain Text

  1. tipo *nome;



Dove tipo e' il tipo di dato (char, int, void, ecc.) contenuto all'indirizzo specificato dal puntatore.

Ad esempio:

Codice sorgente - presumibilmente C/C++

  1. char *str = "hello";



Definisce un puntatore che punta (fa riferimento) al primo carattere di "hello". Il puntatore in se e' (solitamente) un int, ma sta puntando ad un char (in questo caso al primo elemento di "hello", 'h'). Questo puo' essere facilmente mostrato scrivendo:

Codice sorgente - presumibilmente C/C++

  1. char *str = "hello";
  2. printf("str: %d\n", str);



Quando vuoi accedere al contenuto referenziato dal puntatore, si utilizza il carattere '*' di fronte alla variabile puntatore, chiamato anche dereference operator.

Codice sorgente - presumibilmente C/C++

  1. char *str = "hello";
  2. printf("str: %c\n", *str);



La controparte del dereference operator e' l'address operator (&). Quando viene messo di fronte ad una variabile, ne prende il suo indirizzo in memoria anziche' il suo contenuto.

Codice sorgente - presumibilmente C/C++

  1. int numero = 5;
  2. int *puntatore = &numero;
  3. printf("numero: %d (indirizzo: %d)\n", *puntatore, puntatore);



Per accedere a agli elementi di una struttura, si utilizza il "scope resolution operator" (il punto, .)

Codice sorgente - presumibilmente C/C++

  1. struct Struttura{
  2.    int valore;
  3. };
  4.  
  5. // ...
  6.  
  7. Struttura s;
  8. s.valore = 5;



Ma se stai usando i puntatori, devi ricordati di dereferenziare il puntatore (per accedere ai valori della struttura):

Codice sorgente - presumibilmente Plain Text

  1. Struttura s;
  2. Struttura *puntatore = &s;
  3. (*puntatore).valore = 5;



Siccome questa sintassi e' brutta, il C ti permette di utilizzare l'operatore ->.

Codice sorgente - presumibilmente Plain Text

  1. Struttura s;
  2. Struttura *puntatore = &s;
  3. //(*puntatore).valore = 5;
  4. puntatore->valore = 5;



La linee 3 e 4 sono identiche. Per essere precisi l'operatore -> e' solamente parte del "zucchero semantico" del C e viene convertito nell'equivalente (*puntatore).valore durante il parsing.

Ultima modifica effettuata da pierotofy il 12/06/2012 alle 18:17


Il mio blog: https://piero.dev
PM Quote
Avatar
Lionel88 (Normal User)
Newbie


Messaggi: 5
Iscritto: 11/06/2012

Segnala al moderatore
Postato alle 21:35
Martedì, 12/06/2012
Prima di tutto ringrazio pure tu PieroTofy per l'esaustiva spiegazione. La nebbia adesso inizia a sparire e forse riesco a comporre tutti i tasselli del puzzle al fine di arrivare a capire almeno cosa sono i puntatori e come si utilizzano :)

Grazie 1000 ancora!

Vi volevo chiedere un'ultima cosa, non è la sezione adatta però coglievo l'occasione, io a casa programmo in Mac ed utilizzo xCode. Voi per caso avete magari altri Sfw da propormi oppure è il migliore per Mac? Su certi aspetti è molto meglio di visual studio su altri meno.
A casa ho solo il MacBook Pro e il Rasberry Pi a cui ovviamente non posso richiedere di far girare Visual Studio :)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo