Oppure

Loading
26/04/11 8:09
el cuba libre
salve a tutti
ho esigenza di creare una struttura dentro a una struttura. vorrei chiedervi cosa è sbagliato se dichiaro la struttura cosi
struct giornate
{
     struct partite
     {
          int a,b;
          char c;
          partite *x;
     };
    giornate *x;
};
int main ( )
{
    struct partite *ptr,root;//mi dice che é stata già dichiarata
    struct giornate *ptr1,root;
    cout<<"inserisci nome"<<endl;
    cin>>ptr->c;
    ptr=ptr->x=new partite;
}

mi dice che sto facendo un uso non valido della struttura partite, e che è stata precedentemente dichiarata.
qualcuno sa aiutarmi??
grazie in anticipo!
aaa
26/04/11 8:21
Pitagora
struct giornate
  * {
  *      struct partite
  *      {
  *           int a,b;
  *           char c[20];
  *      };
  * };
  * int main ( )
  * {
  *     struct partite *ptr;
  *     struct giornate *ptr1
  *     cout<<"inserisci nome"<<endl;
  *     cin>>ptr1->ptr->c;
  * }
_________________________________________ 
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 26/04/11 8:23
aaa
26/04/11 9:26
Xaratroom
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.

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 ....

ptr=ptr->x=new partite;

Questa cosa non ha alcun senso.

Prova a scrivere il codice senza usare strutture annidate
aaa
26/04/11 10:25
Pitagora
Eh si è logico, ho sbagliato! Sposta
struct partite *ptr;

Dentro la fine della struttura giornate, riga 7.


P.S. sono d'accordo con Xaratromm
aaa
26/04/11 11:45
Xaratroom
Fai così:
struct Partita 
{
          int a, b;
          char c[20];
};

struct Giornata
{
          int tot_partite;
          Partita* partite[MAX_PARTITE_PER_GIORNATA];
};

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:
//Dichiaro una giornata
Giornata giornata;
giornata.tot_partite = 0;

//Aggiungo una partita
giornata.partite[giornata.tot_partite] = new Partita;
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)
aaa
26/04/11 15:59
Xaratroom
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:
#include <iostream>
#include <cstring>

#define MAX_PARTITE_PER_GIORNATA 10

using namespace std;

//Definisco il "tipo di dato" Partita
struct Partita
{
        int a, b;
        char c[20];
};

//Definisco il "tipo di dato" Giornata
struct Giornata
{
        int tot_partite;
        Partita* partite[MAX_PARTITE_PER_GIORNATA]; //Una giornata contiene più partite
};

int main (int argc, char* argv[])
{
        char tmp[20]; //var temporanea

        //Creo e inizializzo la giornata
        Giornata giornata;
        giornata.tot_partite = 0;

        //Leggo da tastiera il nome della partita
        cout << "Inserisci il nome della partita: ";
        cin >> tmp;

        //Creo e inizializzo una partita
        giornata.partite[giornata.tot_partite] = new Partita; //Aggiungo una partita
        giornata.tot_partite++; //Incremento il numero di partite presenti
        strcpy(giornata.partite[0]->c, tmp);

        //Stampo la struttura
        for (int i = 0; i < giornata.tot_partite; i++) {
                cout << "Stampo partita numero " << i << endl;
                cout << "\tNome partita: " << giornata.partite[i]->c << endl;
        }

        return 0;
}

(compilato anche su qt creator)
aaa