Due domande sulle struct in C

kobeilprofeta
1)
è un problema se chiamo il membro di una struct con lo stesso nome di una variabile?
esempio
typedef struct
{
 char nome[256];
 double prezzo;
}Macchina;
int main()
{
 char nome[256];
 printf("%s",nome);
 return 0;
}


2)
in riferimento all'esempio di prima, supponiamo di avere una funzione
double media(double*);
che mi restituisca la media di un array di double... come faccio a fare la media dei prezzi di 100 Macchina?
ad esempio ho dichiarato un array
Macchina m[100];
e voglio la media dei prezzi usando la funzione media che ho scritto sopra... ho provato a chiamare
media(m.prezzo);
ma mi dà errore, grazie...

Risposte
Raptorista1
1. No, le variabili sono in scope diversi e quindi i nomi non vanno in conflitto.

2. media(m.prezzo) non riceve in ingresso un double*, quindi non può funzionare.
Devi creare una nuova funzione che accetta in ingresso un array di Macchina e accede al dato prezzo di ciascuna macchina in maniera esplicita.
Non credo che in C tu possa chiamare la seconda funzione allo stesso modo, comunque...

kobeilprofeta
ok. grazie

vict85
Nota che in questo caso ha più senso lavorare con una struct of array piuttosto che con un array of struct. Infatti il dato nome risulta generalmente inutile nei calcoli e quindi occupa inutilmente memoria cache.

kobeilprofeta
??
non ho capito cosa intendi per array of struct, o meglio: cosa intendi in questo caso

vict85
Nell'esempio che hai posto vorrebbe dire avere una struttura
typedef struct {
  char (* nomi)[256]; // puntatore ad array di 256 char
  double * prezzi;
} AoMacchine; 
oppure
typedef struct {
  char nomi[100][256];
  double prezzi[100];
} AoMacchine; 
se non vuoi usare la memoria dinamica. In questo modo potresti calcolare la media come
 AoMacchine AoM;
// codice per inizializzare AoM
value = media(AoM.prezzi);


Questo approccio dovrebbe essere più efficiente dato che dovrebbe ridurre notevolmente i cache misses. Ovviamente richiede codici as hoc per la gestione della memoria.

kobeilprofeta
thanks

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.