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++ -  Problema con funzione che dovrebbe restituirmi una struct
Forum - C/C++ - Problema con funzione che dovrebbe restituirmi una struct

Avatar
miky7 (Normal User)
Newbie


Messaggi: 1
Iscritto: 12/02/2011

Segnala al moderatore
Postato alle 12:08
Sabato, 12/02/2011

Ciao!! Il mio scopo era quello di fare un programmino che dal main richiama la funzione inserisciData...in breve dovrebbe prendere una struttura data o crearne una nuova richiedendo poi all'utente di inserire i dati e poi dovrebb restiturila al main che dovrebbe stampare a video i dati inseriti..però ovviamente non funziona...........
Avete qualche consiglio???

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. struct data inserisciData();
  5.  
  6. struct data{
  7. int giorno;
  8. int anno;
  9. char *mese;
  10. };
  11.  
  12. main(){
  13. struct data domani;
  14. printf("Avvio del programma\n");
  15. struct data inserisciData(struct data domani);
  16. printf("Il giorno e':\n",domani.giorno);
  17. printf("Il mese e':\n",domani.mese);
  18. printf("L'anno e':\n",domani.anno);
  19. return 0;
  20. }
  21.  
  22. struct data inserisciData(data){
  23. struct data oggi;
  24. int g, a;
  25. char m[15];
  26. printf("Inserisci un giorno: \n");
  27. scanf("%d",&g);
  28. printf("Inserisci un mese: \n");
  29. scanf("%s",&m);
  30. printf("Inserisci un anno: \n");
  31. scanf("%d",&a);
  32. oggi.giorno=g;
  33. oggi.mese=m;
  34. oggi.anno=a;
  35. return oggi;
  36. }


PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 12:22
Sabato, 12/02/2011

c'è una palese violazione di scope delle variabili.
Per fare quello che chiedi, devi passare alla funzione inserisciData un puntatore alla struct, in questo modo:

Codice sorgente - presumibilmente C/C++

  1. void inserisciData(data *pData) {
  2.  
  3.     [...]
  4.  
  5.     pData->giorno = ...
  6.     pData->anno = ...
  7.     strcpy(pData->mese, "agosto");
  8.  
  9.     [...]
  10. }



quando la chiami:

Codice sorgente - presumibilmente Plain Text

  1. data dData;
  2.  
  3. inserisciData(&dData);



inoltre la struttura "data" ha qualcosa che non va, oltre al fatto della dichiarazione senza typedef (che ti obbliga ad anteporre sempre "struct" al tipo), ma il campo mese non è una scelta furba per innumerevoli motivi.

molto meglio utilizzare una serie di define:

#define GENNAIO 1
#define FEBBRAIO 2
...

e poi fare

typedef struct data_s {
    int iGiorno;
    int iAnno;
    int iMese;
} data_t;

data_t data;

data.iMese = GENNAIO;

in questo modo eviti di avere un puntatore vagante che è sempre una brutta cosa, ma se proprio proprio ti sei innamorato del mese scritto in forma di stringa, sarebbe più furbo fare così:

typedef struct data_s {
    int iGiorno;
    int iAnno;
    char pMese[16];
} data_t;

però te lo ripeto: non è una cosa furba.

inoltre con il primo approccio che ti ho consigliato, puoi anche fare qualcosa di questo genere:

char *pMeseMapper[] = {"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" };

per stampare il nome del mese:

printf("Il mese è %s\n", pMeseMapper[domani.iMese]);

spero tu faccia tesoro di questi consigli :)

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 16:20
Sabato, 12/02/2011
Un alternativa potrebbe essere questa:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct data inserisciData(void);
  5.  
  6. struct data{
  7.         int giorno;
  8.         int anno;
  9.         char mese[15];
  10. };
  11.  
  12. int main(){
  13.         struct data domani;
  14.         printf("Avvio del programma\n");
  15.         domani = inserisciData();
  16.         printf("Il giorno e': %d \n",domani.giorno);
  17.         printf("Il mese e':   %s \n",domani.mese);
  18.         printf("L'anno e':    %d \n",domani.anno);
  19.         return 0;
  20. }
  21.  
  22. struct data inserisciData(void){
  23.         struct data oggi;
  24.         int g, a;
  25.         char m[15];
  26.         printf("Inserisci un giorno: \n");
  27.         scanf("%d",&g);
  28.         printf("Inserisci un mese: \n");
  29.         scanf("%s",m);
  30.         printf("Inserisci un anno: \n");
  31.         scanf("%d",&a);
  32.         oggi.giorno=g;
  33.         strncpy(oggi.mese, m, 15);
  34.         oggi.anno=a;
  35.         return oggi;
  36. }


Ultima modifica effettuata da Pitagora il 12/02/2011 alle 16:29
PM Quote