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++ - struttura dentro struttura
Forum - C/C++ - struttura dentro struttura

Avatar
el cuba libre (Normal User)
Newbie


Messaggi: 20
Iscritto: 07/03/2011

Segnala al moderatore
Postato alle 10:09
Martedì, 26/04/2011
salve a tutti
ho esigenza di creare una struttura dentro a una struttura. vorrei chiedervi cosa è sbagliato se dichiaro la struttura cosi
Codice sorgente - presumibilmente C++

  1. struct giornate
  2. {
  3.      struct partite
  4.      {
  5.           int a,b;
  6.           char c;
  7.           partite *x;
  8.      };
  9.     giornate *x;
  10. };
  11. int main ( )
  12. {
  13.     struct partite *ptr,root;//mi dice che é stata già dichiarata
  14.     struct giornate *ptr1,root;
  15.     cout<<"inserisci nome"<<endl;
  16.     cin>>ptr->c;
  17.     ptr=ptr->x=new partite;
  18. }


mi dice che sto facendo un uso non valido della struttura partite, e che è stata precedentemente dichiarata.
qualcuno sa aiutarmi??
grazie in anticipo!

PM
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 17:59
Martedì, 26/04/2011
Testo quotato


il programma fà, solo che fare partite* partite[10] è usare una classe se non sbaglio, quindi non posso,il compilatore [QT creator] non me lo fa fare cosi come hai scritto te - el cuba libre - 26/04/11 16:03


QT Creator è un IDE e non un compilatore. Ho dato un occhio e non supporta il C, quindi, nel tuo codice, potresti usare tutte le classi che vuoi.
Scrivere "partite* partite" non funge perché c'è un conflitto di nomi. Non ci sono classi nel tuo progetto, quindi non stai "usando" nessuna classe (ma solo tipi di dato strutturati).
In pratica scrivere "int i" o scrivere "Giornata i" è la stessa cosa. Il compilatore si occupa di "allocare" la memoria necessaria, nello heap o nello stack (a seconda di dove scrivi quel coso).

Il codice funzionante è questo:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. #define MAX_PARTITE_PER_GIORNATA 10
  5.  
  6. using namespace std;
  7.  
  8. //Definisco il "tipo di dato" Partita
  9. struct Partita
  10. {
  11.         int a, b;
  12.         char c[20];
  13. };
  14.  
  15. //Definisco il "tipo di dato" Giornata
  16. struct Giornata
  17. {
  18.         int tot_partite;
  19.         Partita* partite[MAX_PARTITE_PER_GIORNATA]; //Una giornata contiene più partite
  20. };
  21.  
  22. int main (int argc, char* argv[])
  23. {
  24.         char tmp[20]; //var temporanea
  25.  
  26.         //Creo e inizializzo la giornata
  27.         Giornata giornata;
  28.         giornata.tot_partite = 0;
  29.  
  30.         //Leggo da tastiera il nome della partita
  31.         cout << "Inserisci il nome della partita: ";
  32.         cin >> tmp;
  33.  
  34.         //Creo e inizializzo una partita
  35.         giornata.partite[giornata.tot_partite] = new Partita; //Aggiungo una partita
  36.         giornata.tot_partite++; //Incremento il numero di partite presenti
  37.         strcpy(giornata.partite[0]->c, tmp);
  38.  
  39.         //Stampo la struttura
  40.         for (int i = 0; i < giornata.tot_partite; i++) {
  41.                 cout << "Stampo partita numero " << i << endl;
  42.                 cout << "\tNome partita: " << giornata.partite[i]->c << endl;
  43.         }
  44.  
  45.         return 0;
  46. }


(compilato anche su qt creator)

grazie mille, so che posso usare le classi volendo solo che ancora non le ho studiare e il mio professore penserebbe che l'ho copiato da chi sa dove. sei stato molto utile, grazie mille. - el cuba libre - 27/04/11 13:39
PM
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 11:26
Martedì, 26/04/2011
Premettendo che il codice è c++...
Nulla, in questo caso, giustifica l'esigenza di definire una struttura dentro un'altra.
Partita è una struttura a se stante, come lo è giornata.
E poi non si può usare una struttura come se fosse una variabile.

Codice sorgente - presumibilmente C/C++

  1. struct partite *ptr,root;//mi dice che é stata già dichiarata


Non si può dichiarare partite in questo modo. È necessario utilizzare il risolutore di scope:
giornate::partite ....

Codice sorgente - presumibilmente Plain Text

  1. ptr=ptr->x=new partite;


Questa cosa non ha alcun senso.

Prova a scrivere il codice senza usare strutture annidate

scusa ancora se ti rispondo in un commento ma non capisco perchè non mi appare l'icona rispondi!XD se non uso le stesse strutture non annidate il codice funziona, però mi chiedevo facendo ptr=ptr->x=new partite rialloco un nuovo spazio per la struttura partite, ma io devo fare in modo che tot partit - el cuba libre - 26/04/11 11:35
che tot partite costituiscano una giornata! come potrei fare?? scusa ancora per la risposta nel commento ma non appare l'icona!XD - el cuba libre - 26/04/11 11:36
PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:25
Martedì, 26/04/2011
Eh si è logico, ho sbagliato! Sposta
Codice sorgente - presumibilmente C/C++

  1. struct partite *ptr;


Dentro la fine della struttura giornate, riga 7.


P.S. sono d'accordo con Xaratromm

facendo cosi però poi mi dice che ptr non è stato dichiarato! e neanche root! - el cuba libre - 26/04/11 12:48
è logico, perchè ti ho detto prima che questo è la base, sta a te implemetare altre cose! - Pitagora - 26/04/11 12:58
PM
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 13:45
Martedì, 26/04/2011
Fai così:
Codice sorgente - presumibilmente C++

  1. struct Partita
  2. {
  3.           int a, b;
  4.           char c[20];
  5. };
  6.  
  7. struct Giornata
  8. {
  9.           int tot_partite;
  10.           Partita* partite[MAX_PARTITE_PER_GIORNATA];
  11. };


MAX_PATITE_PER_GIORNATA è una costante che indica il massimo numero di partite che si possono avere in un giorno (diciamo che l'ho messa per semplificarti il lavoro).
tot_partite tiene conto del numero di elementi presenti nell'array partite.

Dopodiché procedi in questo modo:
Codice sorgente - presumibilmente C/C++

  1. //Dichiaro una giornata
  2. Giornata giornata;
  3. giornata.tot_partite = 0;
  4.  
  5. //Aggiungo una partita
  6. giornata.partite[giornata.tot_partite] = new Partita;
  7. giornata.tot_partite++;


Comunque sarebbe opportuno scrivere delle funzioni che lavorino su queste strutture dati

PS: il codice l'ho buttato giù senza provarlo, quindi fai le tue prove e posta il risultato (il tasto rispondi è in fondo alla pagina)

so che il tasto rispondi è in fondo alla pagina perchè prima di fare il login mi appare ma come faccio il login svanisce, il programma fà, solo che fare partite* partite[10] è usare una classe se non sbaglio, quindi non posso,il compilatore [QT creator] non me lo fa fare cosi come hai scritto te - el cuba libre - 26/04/11 16:03
PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 10:21
Martedì, 26/04/2011
Codice sorgente - presumibilmente Plain Text

  1. struct giornate
  2.   * {
  3.   *      struct partite
  4.   *      {
  5.   *           int a,b;
  6.   *           char c[20];
  7.   *      };
  8.   * };
  9.   * int main ( )
  10.   * {
  11.   *     struct partite *ptr;
  12.   *     struct giornate *ptr1
  13.   *     cout<<"inserisci nome"<<endl;
  14.   *     cin>>ptr1->ptr->c;
  15.   * }
  16. _________________________________________

Questo dobrebbe essere cosí, poi chiaramente te lo dovrai aggiustare secondo le tue necessitá.

P.S. scusa l'indentazione ma scrivo dal telefono 8-)

Ultima modifica effettuata da Pitagora il 26/04/2011 alle 10:23
tu scusa me se ti rispondo in un commento ma non mi fa rispondere normalmente!XD se faccio come hai fatto tu mi diche che la struct giornate non ha membri chiamati ptr!XD come potrei fare?? - el cuba libre - 26/04/11 10:38
un altra cosa, come dovrei fare per riallocare la struttura? - el cuba libre - 26/04/11 10:45
PM