Oppure

Loading
12/02/11 11:08
miky7

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

#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;
} 
aaa
12/02/11 11:22
HeDo

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:


void inserisciData(data *pData) {

    [...]

    pData->giorno = ...
    pData->anno = ...
    strcpy(pData->mese, "agosto");

    [...]
}



quando la chiami:


data dData;

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 :)
aaa
12/02/11 15:20
Pitagora
Un alternativa potrebbe essere questa:
#include <stdio.h>
#include <string.h>

struct data inserisciData(void);

struct data{
	int giorno;
	int anno;
	char mese[15];
};

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

struct data inserisciData(void){
	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;
	strncpy(oggi.mese, m, 15);
	oggi.anno=a;
	return oggi;
} 
Ultima modifica effettuata da Pitagora 12/02/11 15:29
aaa