PDA

View Full Version : Aiuto c++


andrew12
28-01-2013, 14:09
Salve a tutti,avrei due dubbi ve li presento :
il primo praticamente riguarda un programma che deve ricevere una lista di nomi e cognomi(che possono contenere più parole) e stamparli.Tuttavua non trovo l'errore,mi spiego meglio: ho un problema con il getline,dopo che compilo non capisco perchè mi salta sempre il primo nome.
Di seguito vi posto il codice


#include<iostream>

using namespace std;

int main(){
int i,N;
const int MAXCHAR=20;
const int MAX=50;
typedef char tipoParola[MAXCHAR+1];
typedef struct{
tipoParola nome;
tipoParola cognome;
}coppia;
coppia coppie[MAX];

cout<<"inserisci la lunghezza della lista"<<endl;
cin>>N;
for(i=0;i<N;i++){
cout<<"nome"<<endl;
cin.getline(coppie[i].nome,MAX);
cout<<"cognome"<<endl;
cin.getline(coppie[i].cognome,MAX);
}
for(i=0;i<N;i++){
cout<<coppie[i].nome<<endl;
cout<<coppie[i].cognome<<endl;
}

return 0;
}


La seconda domanda riguarda una mia curiosità: esiste un modo per far restituire ad un sottoprogramma un array? se si come ? magari con un esempio.
Chiedo scusa del disturbo e grazie =)

!fazz
28-01-2013, 14:22
Salve a tutti,avrei due dubbi ve li presento :
il primo praticamente riguarda un programma che deve ricevere una lista di nomi e cognomi(che possono contenere più parole) e stamparli.Tuttavua non trovo l'errore,mi spiego meglio: ho un problema con il getline,dopo che compilo non capisco perchè mi salta sempre il primo nome.
Di seguito vi posto il codice


#include<iostream>

using namespace std;

int main(){
int i,N;
const int MAXCHAR=20;
const int MAX=50;
typedef char tipoParola[MAXCHAR+1];
typedef struct{
tipoParola nome;
tipoParola cognome;
}coppia;
coppia coppie[MAX];

cout<<"inserisci la lunghezza della lista"<<endl;
cin>>N;
for(i=0;i<N;i++){
cout<<"nome"<<endl;
cin.getline(coppie[i].nome,MAX);
cout<<"cognome"<<endl;
cin.getline(coppie[i].cognome,MAX);
}
for(i=0;i<N;i++){
cout<<coppie[i].nome<<endl;
cout<<coppie[i].cognome<<endl;
}

return 0;
}


La seconda domanda riguarda una mia curiosità: esiste un modo per far restituire ad un sottoprogramma un array? se si come ? magari con un esempio.
Chiedo scusa del disturbo e grazie =)

per il primo è un problema comune si risolve mettendo un cin.ignore(dimensione_stringa, '\n') dopo il cin.getline per svuotare il buffer


per la seconda se per sottoprogramma intendi una funzione, ti basta sapere che un array viene sempre passato per riferimento (e quindi gli viene passato l'indirizzo in memoria della prima cella dell'array) come ad esempio quà

http://www.cplusplus.com/reference/cstring/strncpy/

sottovento
28-01-2013, 14:35
Si, puoi far restituire un array come valore di ritorno da un sottoprogramma.
Va pero' fatto con attenzione.
Alcuni casi

caso 1 (SCONSIGLIATO): crei un array statico, lo riempi e lo ritorni.

int *getData()
{
static int vect[100];

// fill up data
return vect;
}

Questa tecnica veniva usata spesso, anni fa, poiche' e' molto semplice. Ma ora e' estremamente pericolosa in virtu' del fatto che lo stesso sottoprogramma potrebbe essere chiamato da thread diversi. Il risultato (a meno di sincronizzare la chiamata, ma a questo punto la semplicita' va a farsi benedire) potrebbe essere un valore invalido;

caso 2: allochi memoria e ritorni il valore

int *getData()
{
int *vect = new int[100];

// fill up data
return vect;
}

Non ha le controindicazioni della tecnica precedente. Tuttavia.... siamo sicuri che il chiamante si ricordera' sempre di deallocare la memoria?

Beh, si potrebbe usare uno smart pointer ottenento il caso 3. Per esempio:


std::auto_ptr<int *>getData()
{
int *vect = new int[100];

// fill up data
return std::auto_ptr<int>(vect);
}

andrew12
28-01-2013, 14:45
Grazie mille per gli aiuti =)
però aggiungengo cin.ignore il programma non funziona
riposto il codice per vedere se magari ho fatto qualche errore io
#include<iostream>

using namespace std;

int main(){
int i,N;
const int MAXCHAR=20;
const int MAX=50;
typedef char tipoParola[MAXCHAR+1];
typedef struct{
tipoParola nome;
tipoParola cognome;
}coppia;
coppia coppie[MAX];

cout<<"inserisci la lunghezza della lista"<<endl;
cin>>N;
for(i=0;i<N;i++){
cout<<"nome"<<endl;
cin.getline(coppie[i].nome,MAX);
cin.ignore(MAXCHAR+1, '\n');
cout<<"cognome"<<endl;
cin.getline(coppie[i].cognome,MAX);
cin.ignore(MAXCHAR+1, '\n');
}
for(i=0;i<N;i++){
cout<<coppie[i].nome<<endl;
cout<<coppie[i].cognome<<endl;
}

return 0;
}

tomminno
28-01-2013, 21:45
Beh, si potrebbe usare uno smart pointer ottenento il caso 3. Per esempio:


std::auto_ptr<int *>getData()
{
int *vect = new int[100];

// fill up data
return std::auto_ptr<int>(vect);
}


auto_ptr è deprecato :D al suo posto adesso c'è unique_ptr (o shared_ptr a seconda dell'uso che se ne vuole fare)

sottovento
29-01-2013, 08:34
auto_ptr è deprecato :D al suo posto adesso c'è unique_ptr (o shared_ptr a seconda dell'uso che se ne vuole fare)

mea culpa! Hai ragione.
Cmq spero sia chiaro quello che intendevo :D