PDA

Visualizza la versione completa : [C++] Funzione che restituisce un valore di tipo struct


Heroes7
12-02-2011, 11:58
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........... :dh˛: :dh˛:
Qualcuno ha qualche consiglio???

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

struct data inserisciData();

struct data{
int giorno;
int anno;
char *mese;
};

main(){
struct data domani;
printf("Avvio del programma\n");
struct data inserisciData(struct data domani);
printf("Il giorno e':\n",domani.giorno);
printf("Il mese e':\n",domani.mese);
printf("L'anno e':\n",domani.anno);
return 0;
}

struct data inserisciData(data){
struct data oggi;
int g, a;
char m[15];
printf("Inserisci un giorno: \n");
scanf("%d",&g);
printf("Inserisci un mese: \n");
scanf("%s",&m);
printf("Inserisci un anno: \n");
scanf("%d",&a);
oggi.giorno=g;
oggi.mese=m;
oggi.anno=a;
return oggi;
} :dh˛: :dh˛: :dh˛: :dh˛: :dh˛: :dh˛:

Laikius91
12-02-2011, 13:13
Mi sa che stai facendo un po' di confusione con le funzioni:



struct data inserisciData();


Quest'interfaccia dice che questa funzione restituisce una struttura di tipo struct data senza prendere nessun paramentro in ingresso...



main(){
struct data domani;
printf("Avvio del programma\n");
struct data inserisciData(struct data domani);
printf("Il giorno e':\n",domani.giorno);
printf("Il mese e':\n",domani.mese);
printf("L'anno e':\n",domani.anno);
return 0;
}


Nella riga evidenziata ci sono un paio di errori:
1) non devi mettere il tipo delle funzioni che chiami;
2) passi alla funzione "struct data domani", mentre come ti ho detto sopra, nel prototipo della funzione hai fatto si che a questa non venga passato niente.




struct data inserisciData(data){ /* Cos'Ŕ data???? Non esiste ne come variabile ne come tipo, toglilo! */
struct data oggi;
int g, a;
char m[15];
printf("Inserisci un giorno: \n");
scanf("%d",&g);
printf("Inserisci un mese: \n");
scanf("%s",&m);
printf("Inserisci un anno: \n");
scanf("%d",&a);
oggi.giorno=g;
oggi.mese=m;
oggi.anno=a;
return oggi;
}

Non so bene quali siano le tue intenzioni, ma secondo me quello che vuoi fare tu Ŕ, nel main:




...
struct data domani;
domani = inserisciData ();

...

Heroes7
12-02-2011, 17:19
hai ragione.. il consiglio che mi hai dato era proprio quello che volevo fare. Per˛ rimane un piccolo problema, ovvero non riesco a stampare il mese. PerchŔ non viene passato correttamente la stringa mese.
Ho provato a mettere le printf all'interno della funzione per vedere se sbagliavo qualcosa ma no perchŔ me li stampa corretamente..
Hai qualche consiglio??
Dici che dovrei usare dei puntatori?

Grazie mille :)

lolide
12-02-2011, 17:24
Originariamente inviato da Heroes7
hai ragione.. il consiglio che mi hai dato era proprio quello che volevo fare. Per˛ rimane un piccolo problema, ovvero non riesco a stampare il mese. PerchŔ non viene passato correttamente la stringa mese.
Ho provato a mettere le printf all'interno della funzione per vedere se sbagliavo qualcosa ma no perchŔ me li stampa corretamente..
Hai qualche consiglio??
Dici che dovrei usare dei puntatori?

Grazie mille :)

Succede perchŔ nella funzione come variabile temporanea usi char m[10] che Ŕ statica e viene distrutta appena ritorna dalla funzione.
Quindi dopo sarÓ inutilizzabile

m falla come char* e allocala con malloc

Laikius91
12-02-2011, 18:28
Originariamente inviato da Heroes7
hai ragione.. il consiglio che mi hai dato era proprio quello che volevo fare. Per˛ rimane un piccolo problema, ovvero non riesco a stampare il mese. PerchŔ non viene passato correttamente la stringa mese.
Ho provato a mettere le printf all'interno della funzione per vedere se sbagliavo qualcosa ma no perchŔ me li stampa corretamente..
Hai qualche consiglio??
Dici che dovrei usare dei puntatori?

Grazie mille :)

Come ha detto lolide, quando fai:


char m[15];

Crei una variabile locale che, terminata la funzione, viene distrutta; devi fare, per poterla utilizzare dopo che la funzione che l'ha creata termina:



char* mese;
mese = (char*) malloc (sizeof(char)*15); /* se ti interessano 15 caratteri */


Attenzione per˛ a una piccola cosa:



printf("Inserisci un mese: \n");
scanf("%s",&m);


In entrambi i modi per creare una stringa (con la malloc o senza), essa risulta un puntatore e pertanto nella scanf non ci vuole l'andpersand (&) chiaro? Quindi considerato quanto detto sopra, la scanf sarÓ:


scanf ("%s", mese);

Ultimissima cosa, nel main, prima di terminare, devi manualmente liberare l'area di memoria che hai allocato, facendo:


free (domani.mese);

Detto ci˛ dovrebbe andare tutto bene :)

Heroes7
13-02-2011, 17:31
Grazie mille per le risposte!! ora funziona!!

Loading