Problema con ADT

di il
12 risposte

Problema con ADT

Salve ragazzi,sto provando a realizzare un adt che crea una squadra di calcio.
Il mio progetto contiene (oltre al main) il file calciatore.c e il corrispondente header file calciatore.h

Ho definito una struttura che contiene i dati di un singolo calciatore.
Successivamente creo il tipo squadra,definito come un puntatore al tipo calciatore .

Inizialmente ho creato soltanto due operatori: crea_squadra che attraverso una malloc mi alloca lo
spazio per 25 giocatori,(una squadra intera) e inserisci_calciatori, che mi permette di inserire
i dati di ciascun giocatore.

Ora mi viene generato un errore quando richiamo la funzione inserisci nel main.

Quello che sbaglio quasi sicuramente è creare la squadra,cioè vorrei definire un
array di taglia 25 dove ciascuno degli i elementi sia un calciatore dove poter inserire
i campi nome,cognome,ruolo e così via.

Grazie in anticipo

p.s. Non so come allegare la cartella,ricopio il codice qui sotto


//CALCIATORE.H
typedef struct calciatore {
		char nome[25];
		char cognome[25];
		char ruolo[25];
		int  anni;
		float stipendio;
		int svincolato;

}calciatore;


typedef  calciatore *squadra;


squadra crea_squadra();				//ALLOCA LA MEMORIA PER UNA NUOVA SQUADRA MA NON LA INIZIALIZZA
squadra inserisci_calciatori(squadra s[]);


----------------------------------------------------------------------------------------------------------------------------------


//CALCIATORE.C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "calciatore.h"

#define DIM_ROSA 25 //Impostare a 25
#define SIZE 25



squadra crea_squadra()
{
	squadra s;
	
	s = malloc(sizeof(squadra) * DIM_ROSA);
	
	if(s == NULL)
		{
		printf("Errore:Impossibile creare nuova squadra\n");
		return NULL;
		}
	return s;
	
	

}


squadra inserisci_calciatori(squadra s[])
{
	char name[SIZE],surname[SIZE],role[SIZE];
	int age,released;
	float salary;

	int i;
	

	for(i=0; i< DIM_ROSA; i++)  //INSERISCO I DATI DI CIASCUNO DEI 25 CALCIATORI
	{
		printf("\nInserisci il nome del calciatore numero %d:  ",i+1);
		scanf("%s",name);
		strcpy( s[i]->nome,name);

		printf("\nInserisci il cognome del calciatore numero %d:  ",i+1);
		scanf("%s",surname);
		strcpy( s[i]->cognome,surname);

		printf("\nInserisci il ruolo del calciatore numero %d:  ",i+1);
		scanf("%s",role);
		strcpy( s[i]->ruolo,role);

		printf("\nInserisci l'eta' del calciatore numero %d:  ",i+1);
		scanf("%d",&age);
		s[i]->anni = age;

		printf("\nIl calciatore e' svincolato? (1) per indicare si, (0) per indicare no:  ");
		scanf("%d",&released);
		s[i]->svincolato = released;

		printf("\nInserisci lo stipendio del calciatore numero %d:  ",i+1);
		scanf("%f",&salary);
		s[i]->stipendio = salary;

	}



	return *s;   //Ritorno la squadra con i dati inseriti

}


--------------------------------------------------------------------------------------------------------------------------------------------------------



//Main
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "calciatore.h"

int main(){


squadra Lione;

Lione = crea_squadra();

Lione = inserisci_calciatori(Lione[]);  //QUI E' IL PROBLEMA

return 0;
}

12 Risposte

  • Re: Problema con ADT

    Si penso che stai sbagliando in modo in cui chiami malloc.
    Hai scritto "malloc(sizeof(squadra)* DIM_ROSA)" che il compilatore traduce in "malloc(sizeof(calciatore*)*DIM_ROSA)". Penso che tu vuoi fare
    "malloc(sizeof(calciatore)*DIM_ROSA)" in modo di avere uno spazio in memoria pari alla memoria del singolo calciatore moltiplicato per 25.
    Detto ciò sarebbe meglio se riesci a darci altri informazioni, per esempio che tipo di errore e quando esattamente generare l'errore ? Quando chiami crea squadra o quando chiami inserisci_calciatori ?
  • Re: Problema con ADT

    
    Main.c: In function ‘main’:
    main.c:14:36: error: expected expression before ‘]’ token
     Lione = inserisci_calciatori(Lione[]);  //QUI E' IL PROBLEMA
     
    Si scusami,questo e' l'errore che viene generato.

    In pratica nella crea_squadra vorrei creare un array di 25 elementi,dove ciascun elemento è
    di tipo calciatore ed è definito dai campi nome,cognome ecc.

    Non so se l'implementazione è corretta,cioè se ho utilizzato correttamente le typedef,strutture e puntatori
  • Re: Problema con ADT

    Stai usando un puntatore di puntatori ( s[] che è un array di squadra che è un puntatore a calciatore, devi invece usare solo squadra (non squadra[]).

    Dove hai nel codice squadra[] o s[] devi sostituirlo con squadra e s.
    La funzione inserisci_calciatori di diventa quindi
    
    squadra inserisci_calciatori(squadra s)
    {
       char name[SIZE],surname[SIZE],role[SIZE];
       int age,released;
       float salary;
    
       int i;
       
    
       for(i=0; i< DIM_ROSA; i++)  //INSERISCO I DATI DI CIASCUNO DEI 25 CALCIATORI
       {
    
    		calciatore c = s[i];	// il calciatore i-esimo della squadra s
    
          printf("\nInserisci il nome del calciatore numero %d:  ",i+1);
          scanf("%s",name);
          strcpy( c.nome,name);
    
          printf("\nInserisci il cognome del calciatore numero %d:  ",i+1);
          scanf("%s",surname);
          strcpy( c.cognome,surname);
          ....
    
  • Re: Problema con ADT

    sebaldar ha scritto:




    for(i=0; i< DIM_ROSA; i++) //INSERISCO I DATI DI CIASCUNO DEI 25 CALCIATORI
    {

    calciatore c = s; // il calciatore i-esimo della squadra s


    Allora,in ogni iterazione del ciclo viene dichiarata una variabile c di tipo calciatore e inizializzata con s?
    Non riesco a capire questo passaggio,scusami, cioè s non "contiene" nulla, è li' che devo andare ad inserire
    i valori

    La funzione poi cosa deve ritornare? Io le facevo ritornare *s,ma in questo caso non sarà "vuoto"?
  • Re: Problema con ADT

    Sì, non va bene, puoi provare con
    
    calciatore &c=s [i];  // reference
    Oppure
    calciatore *c = &s [i];   // devi poi cambiare . con ->
    
  • Re: Problema con ADT

    Scusami davvero, non riesco a capire perchè utilizzi quella variabile c.
    E alla fine cosa bisogna restituire?
  • Re: Problema con ADT

    Intendo così
    
    //Main
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //CALCIATORE.H
    typedef struct calciatore {
          char nome[25];
          char cognome[25];
          char ruolo[25];
          int  anni;
          float stipendio;
          int svincolato;
    
    }calciatore;
    
    
    typedef  calciatore *squadra;
    
    
    squadra crea_squadra();            //ALLOCA LA MEMORIA PER UNA NUOVA SQUADRA MA NON LA INIZIALIZZA
    squadra inserisci_calciatori(squadra s);
    
    //CALCIATORE.C
    
    #define DIM_ROSA 25 //Impostare a 25
    #define SIZE 25
    
    
    
    squadra crea_squadra()
    {
       squadra s;
       
       s = malloc(sizeof(squadra) * DIM_ROSA);
       
       if(s == NULL)
          {
          printf("Errore:Impossibile creare nuova squadra\n");
          return NULL;
          }
       return s;
       
       
    
    }
    
    
    squadra inserisci_calciatori(squadra s)
    {
       char name[SIZE],surname[SIZE],role[SIZE];
       int age,released;
       float salary;
    
       int i;
       
    
       for(i=0; i< DIM_ROSA; i++)  //INSERISCO I DATI DI CIASCUNO DEI 25 CALCIATORI
       {
    
    		calciatore *c = &s[i];
    
          printf("\nInserisci il nome del calciatore numero %d:  ",i+1);
          scanf("%s",name);
          strcpy( c->nome,name);
    
          printf("\nInserisci il cognome del calciatore numero %d:  ",i+1);
          scanf("%s",surname);
          strcpy( c->cognome,surname);
    
          printf("\nInserisci il ruolo del calciatore numero %d:  ",i+1);
          scanf("%s",role);
          strcpy( c->ruolo,role);
    
          printf("\nInserisci l'eta' del calciatore numero %d:  ",i+1);
          scanf("%d",&age);
          c->anni = age;
    
          printf("\nIl calciatore e' svincolato? (1) per indicare si, (0) per indicare no:  ");
          scanf("%d",&released);
          c->svincolato = released;
    
          printf("\nInserisci lo stipendio del calciatore numero %d:  ",i+1);
          scanf("%f",&salary);
          c->stipendio = salary;
    
       }
    
    
    
       return s;   //Ritorno la squadra con i dati inseriti
    
    }
    
    
    int main(){
    
    
    squadra Lione;
    
    Lione = crea_squadra();
    
    Lione = inserisci_calciatori(Lione);  //QUI E' IL PROBLEMA
    
    printf("*%s\n",Lione[0].nome);
    printf("*%s\n",Lione[1].nome);
    
    return 0;
    }
    
    
    prova a studiartelo.
    calciatore *c è solo di appoggio e chiarezza codice.
  • Re: Problema con ADT

    Grazie davvero,sei stato gentilissimo.

    Un'ultima cosa. le operazioni sul puntatore a calciatore (*c) vengono fatte perchè
    ad ogni iterazione viene passato l'indirizzo di s ( con l'operatore di indirizzo &s)
    e quindi si va ad interagire su s indirettamente,cioè interagendo direttamente su c, è così?

    Si potrebbe anche fare direttamente? Cioè senza utilizzare il puntatore ma direttamente s?
  • Re: Problema con ADT

    [quote="sebaldar"]Intendo così
    
    
    
    
    
    printf("*%s\n",Lione[0].nome);
    printf("*%s\n",Lione[1].nome);
    
    }
    
    
    Scusami ancora,qui perchè non utilizzi l'operatore freccia?
    
    printf("*%s\n",Lione[1]->nome);
    
    Cioè fare in questo modo
    Lione è una variabile di tipo squadra che è un puntatore
  • Re: Problema con ADT

    trafalgar ha scritto:


    Grazie davvero,sei stato gentilissimo.

    Un'ultima cosa. le operazioni sul puntatore a calciatore (*c) vengono fatte perchè
    ad ogni iterazione viene passato l'indirizzo di s ( con l'operatore di indirizzo &s)
    e quindi si va ad interagire su s indirettamente,cioè interagendo direttamente su c, è così?

    Si potrebbe anche fare direttamente? Cioè senza utilizzare il puntatore ma direttamente s?


    Sì, puoi utilizzare direttamente s , che è però un oggetto calciatore, non un puntatore
  • Re: Problema con ADT

    trafalgar ha scritto:


    sebaldar ha scritto:


    Intendo così
    
    
    
    
    
    printf("*%s\n",Lione[0].nome);
    printf("*%s\n",Lione[1].nome);
    
    }
    
    
    Scusami ancora,qui perchè non utilizzi l'operatore freccia?
    
    printf("*%s\n",Lione[1]->nome);
    
    Cioè fare in questo modo
    Lione è una variabile di tipo squadra che è un puntatore
    questa struttura di dati la hai create tu, io ho solo levato gli errori.
    Comunque squadra, che è un puntatore a calciatore, lo puoi considerare come un vettore di calciatori, l'elemento i-esimo di questo vettore è un oggetto calciatore, quindi per accedere ai suoi membri devo utilizzare l'operatore punto.
  • Re: Problema con ADT

    Grazie mille sei stao chiarissimo.
    Grazie ancora
Devi accedere o registrarti per scrivere nel forum
12 risposte