PDA

View Full Version : [C++] struct


d3v1lx
07-08-2012, 19:35
Ciao a tutti, sono nuovo della programmazione in c++ e mi sono imbattuto in un problema che non riesco a risolvere.


#include <iostream>
using namespace std;

struct persona
{
char name[10];
int age;
};

struct impiegato
{
persona anagrafica;
float wage;
float hour;
};

void read_info(impiegato impiegati);
void write_info(impiegato impiegati);

int main ()
{
int n;
cout << "Inserire il numero di impiegati" << endl;
cin >> n;
impiegato impiegati[n];
for (int i=0; i<n; ++i)
{
read_info(impiegati[i]);
}
for (int j=0; j<n; ++j)
{
write_info(impiegati);
}
return 0;
}

void read_info(impiegato impiegati)
{
cout << "Inserire il nome" << endl;
cin >> impiegati.anagrafica.name;
cout << "Inserire l'eta'" << endl;
cin >> impiegati.anagrafica.age;
}

void write_info(impiegato impiegati)
{
cout << endl;
cout << "Nome: " << impiegati.anagrafica.name << endl;
cout << "Eta': " << impiegati.anagrafica.age << endl;
}


Creato un'array di impiegati, devo inserirne il nome e l'eta', ho creato due funzioni per fare questo, il problema e' che l'output non corrisponde con l'input.


Inserire il numero di impiegati
1
Inserire il nome //input inizio
pincopallino
Inserire l'eta'
23 //input fine

Nome: PLԑ� //output
Eta': 0


Non capisco il perche' di questo output, potete aiutarmi per favore.
Il programma viene compilato senza errorri e senza warning.
Grazie

Pixel452
09-08-2012, 09:34
Devi usare i puntatori, altrimenti quando passi la tua variabile ad una funzione questa viene COPIATA, quindi in realtà stai modificando una variabile che non è quella che hai nel main ma un altra che risiede in un altra zona della memoria.


void read_info(impiegato *impiegati);
void write_info(impiegato *impiegati);

int main ()
{
int n;
cout << "Inserire il numero di impiegati" << endl;
cin >> n;

impiegato *impiegati = new impiegato[n];

for (int i=0; i<n; ++i)
read_info(&impiegati[i]);

for (int j=0; j<n; ++j)
write_info(&impiegati[j]);

return 0;
}

void read_info(impiegato *impiegati)
{
cout << "Inserire il nome" << endl;
cin >> impiegati->anagrafica.name;
cout << "Inserire l'eta'" << endl;
cin >> impiegati->anagrafica.age;
}

void write_info(impiegato *impiegati)
{
cout << endl;
cout << "Nome: " << impiegati->anagrafica.name << endl;
cout << "Eta': " << impiegati->anagrafica.age << endl;
}

WarDuck
09-08-2012, 22:36
Oppure visto che stai usando C++ (anche se in realtà di C++ non hai usato nulla :D ) puoi usare il passaggio per riferimento:

void read_info(impiegato& impiegati)

marco.r
11-08-2012, 10:46
Il problema e' che usi stringhe di dimensione fissa (10 caratteri).
Se cerchi di inserire un nome piu' lungo, i caratteri in piu' "sforano" l'array e, per come e' stato dichiarata la struct, vanno a sovrascrivere le locazioni di memoria relative ai campi successivi.
O usi le string del c++, oppure limiti la lettura ai primi 10 caratteri .