Problema con ADT

Forum di discussioni su C e C++

Moderatori: Toki, skynet

Regole del forum
Leggi: IProgrammatori.it - Regolamento Forum
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Problema con ADT

Messaggioda trafalgar » 20 apr 2017, 14:46

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

Codice: Seleziona tutto


//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[]);




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


Codice: Seleziona tutto

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

}




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


Codice: Seleziona tutto


//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;
}
Blazgrom
New Entry
Messaggi: 9
Iscritto il: 02 nov 2015, 17:02

Re: Problema con ADT

Messaggioda Blazgrom » 20 apr 2017, 15:36

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 ?
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Re: Problema con ADT

Messaggioda trafalgar » 20 apr 2017, 15:58

Codice: Seleziona tutto

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
sebaldar
Utente Junior
Messaggi: 80
Iscritto il: 10 apr 2017, 15:58

Re: Problema con ADT

Messaggioda sebaldar » 20 apr 2017, 17:54

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

Codice: Seleziona tutto

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);
      ....
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Re: Problema con ADT

Messaggioda trafalgar » 20 apr 2017, 18:07

sebaldar ha scritto:

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



Allora,in ogni iterazione del ciclo viene dichiarata una variabile c di tipo calciatore e inizializzata con s[i]?
Non riesco a capire questo passaggio,scusami, cioè s[i] 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"?
sebaldar
Utente Junior
Messaggi: 80
Iscritto il: 10 apr 2017, 15:58

Re: Problema con ADT

Messaggioda sebaldar » 20 apr 2017, 19:47

Sì, non va bene, puoi provare con

Codice: Seleziona tutto

calciatore &c=s [i];  // reference
Oppure
calciatore *c = &s [i];   // devi poi cambiare . con ->
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Re: Problema con ADT

Messaggioda trafalgar » 20 apr 2017, 20:12

Scusami davvero, non riesco a capire perchè utilizzi quella variabile c.
E alla fine cosa bisogna restituire?
sebaldar
Utente Junior
Messaggi: 80
Iscritto il: 10 apr 2017, 15:58

Re: Problema con ADT

Messaggioda sebaldar » 21 apr 2017, 08:12

Intendo così

Codice: Seleziona tutto

//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.
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Re: Problema con ADT

Messaggioda trafalgar » 23 apr 2017, 19:01

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[i])
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?
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Re: Problema con ADT

Messaggioda trafalgar » 23 apr 2017, 22:26

[quote="sebaldar"]Intendo così

Codice: Seleziona tutto





printf("*%s\n",Lione[0].nome);
printf("*%s\n",Lione[1].nome);

}



Scusami ancora,qui perchè non utilizzi l'operatore freccia?

Codice: Seleziona tutto

printf("*%s\n",Lione[1]->nome);

Cioè fare in questo modo
Lione è una variabile di tipo squadra che è un puntatore
sebaldar
Utente Junior
Messaggi: 80
Iscritto il: 10 apr 2017, 15:58

Re: Problema con ADT

Messaggioda sebaldar » 24 apr 2017, 07:23

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[i])
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 [i], che è però un oggetto calciatore, non un puntatore
sebaldar
Utente Junior
Messaggi: 80
Iscritto il: 10 apr 2017, 15:58

Re: Problema con ADT

Messaggioda sebaldar » 24 apr 2017, 07:46

trafalgar ha scritto:
sebaldar ha scritto:Intendo così

Codice: Seleziona tutto





printf("*%s\n",Lione[0].nome);
printf("*%s\n",Lione[1].nome);

}



Scusami ancora,qui perchè non utilizzi l'operatore freccia?

Codice: Seleziona tutto

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.
trafalgar
New Entry
Messaggi: 8
Iscritto il: 20 apr 2017, 14:28

Re: Problema con ADT

Messaggioda trafalgar » 24 apr 2017, 09:26

Grazie mille sei stao chiarissimo.
Grazie ancora :D

Torna a “C/C++”

Chi c’è in linea

Visitano il forum: lucifugo e 44 ospiti