Volendo posso anche fare
typedef struct {}DescrizioniFatture;
DescrizioniFatture Fattura1, Fattura2;
Però pensavo che nel caso in cui non facessi questo, allora nella dichiarazione del parametro attuale il tipo fosse struct DescrizioniFatture, come quando dichiaro una variabile senza usare typedef, dato che in quel caso dovrei fare
struct DescrizioniFatture Fattura 1;
struct DescrizioniFatture Fattura 2;
o sbaglio?
Riguardo alla stringa so che andrebbe usata, solo che volevo spontaneamente allenarmi a operare con l'array, altrimenti l'avrei usata.
Grazie invece per avermi detto del prototipo, i miei testi lo mettono dentro appena prima la chiamata.
Comunque, corretto qualcosa (usato typedef per non immettere lo struct nella chiamata, messi i prototipi fuori e qualche piccolo accorgimento, il codice è questo, che comunque alla chiamata per la stampa dei valori da degli indirizzi piuttosto che i valori stessi, e poi dei caratteri à.
/* Esercizatione passaggio parametri tramite indirizzo, piuttosto che copia-valore */
#include <stdio.h>
typedef struct {
int NumLettereNome;
char cliente[20];
int giorno;
int mese;
int anno;
float costo;
}DescrizioniFatture;
DescrizioniFatture Fattura1, Fattura2;
void DatiFattura(DescrizioniFatture *numlet, DescrizioniFatture *cl, DescrizioniFatture *gi,
DescrizioniFatture *me, DescrizioniFatture *ann,
DescrizioniFatture *cos); //Prototipo per l'immissione dati
void LeggiFattura(DescrizioniFatture *numlet,DescrizioniFatture *cl,DescrizioniFatture *gi,
DescrizioniFatture *me, DescrizioniFatture *ann,
DescrizioniFatture *cos); //Prototipo stampa dati
int main() {
printf("Inserisci dati Fattura 1\n");
DatiFattura(&Fattura1.NumLettereNome, &Fattura1.cliente, &Fattura1.giorno, &Fattura1.mese, &Fattura1.anno,
&Fattura1.costo); //Immissione dati nella variabile Fattura1 di tipo DescrizioniFatture
//Inserisco come dati l'indirizzo di memoria delle variabili interne
printf("\nInserisci dati Fattura 2\n");
DatiFattura(&Fattura2.NumLettereNome, &Fattura2.cliente, &Fattura2.giorno, &Fattura2.mese, &Fattura2.anno,
&Fattura2.costo); //Immissione dati nella variabile Fattura2 di tipo DescrizioniFatture
// Inserisco come dati l'indirizzo di memoria delle variabili interne
printf("\nDati fattura 1\n");
LeggiFattura(&Fattura1.NumLettereNome, &Fattura1.cliente, &Fattura1.giorno, &Fattura1.mese, &Fattura1.anno,
&Fattura1.costo); //Stampa i dati nella variabile Fattura1 di tipo DescrizioniFatture
printf("\nDati fattura 2\n");
LeggiFattura(&Fattura2.NumLettereNome, &Fattura2.cliente, &Fattura2.giorno, &Fattura2.mese, &Fattura2.anno,
&Fattura2.costo); //Stampa i dati nella variabile Fattura2 di tipo DescrizioniFatture
return 0;
}
/* Immetto come parametri formali dei puntatori, che puntano agli indirizzi di memoria dei parametri attuali,
* sovrascrivendoli in tempo reale*/
void DatiFattura(DescrizioniFatture *numlet, DescrizioniFatture *cl, DescrizioniFatture *gi,
DescrizioniFatture *me, DescrizioniFatture *ann, DescrizioniFatture *cos)
{
printf("Inserisci numero lettere nome cliente (<20)\n");
scanf("%d", &numlet);
printf("Inserisci le lettere del nome singolarmente\n");
for(int i=0; i<numlet;i++){
scanf(" %c", &cl[i]);
}
printf("Inserisci giorno\n");
scanf("%d", &gi);
printf("Inserisci mese\n");
scanf("%d", &me);
printf("Inserisci anno\n");
scanf("%d", &ann);
printf("Inserisci costo\n");
scanf("%f", &cos);
}
void LeggiFattura(DescrizioniFatture *numlet, DescrizioniFatture *cl, DescrizioniFatture *gi,
DescrizioniFatture *me, DescrizioniFatture *ann, DescrizioniFatture *cos)
{
printf("Lettere nome: %d\n", numlet);
printf("Nome:\n");
for(int i=0; i<numlet; i++)
{
printf(" %c",cl[i]);
}
printf("Giorno: %d\n", gi);
printf("Mese: %d\n", me);
printf("Anno: %d\n", ann);
printf("Costo: %f\n", cos);
}