|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 479
|
[C++] Restituzione di più valori da una funzione
Buon giorno a tutti,
mi sono da poco "buttato" nella programmazione del linguaggio c++, proveniendo comunque da Visual Basic, quindi con un minimo di base. Perdonatemi quindi l'estrema newbaggine! Il mio problema è: Come faccio a far restituire ad una funzione più valori? Mi spiego meglio, se io ho 3 variabili (diciamo 2 intere e 1 stringa), chiamo una funzione passandogli queste variabili, le elaboro e modifico.... e poi?? Con il return, mi ritorna ovviamente uno solo dei tre valori... Immagino debba usare una struttura, ma cosa passare alla funzione?? Non è che c'è qualche anima pia che mi possa scrivere 2 righe di esempio?? Grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2005
Messaggi: 1400
|
una funzione non può restituiere più valori, al massimo puoi ovviare con una struttura o un array, se devi lavorare con + valori è consigliabile usare i parametri di uscita
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Creati una semplice struct:
Codice:
struct {
string s1, s2;
int i;
} Dato;
E poi usi la funzione in questo modo:
Dato fun(Dato d) {
d.s1 = "Ciao";
d.s2 = "Hello";
d.i = 123;
return d;
}
Ciao |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 223
|
Non ti basta dichiarare la funzione di tipo void e passare i valori per riferimento? Come avviene in C fral'altro ...
__________________
Leaves Web: www.leavesweb.tk Skype: leavesweb Create your dreams! - My Blog: JollyChar! |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Aug 2008
Città: Bergamo
Messaggi: 116
|
Quote:
Poi calcola che le variabili char vengono sempre passate per riferimento quindi non c'è alcun bisogno di "ritornarle".
__________________
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 479
|
Prima di tutto grazie a tutti per le risposte....
Proverò appena possible la soluzione di Noixe, nel frattempo dad, cosa vuol dire "passare i valori per riferimento?" In VB basta dichiarare i parametri della call tipo: call funzione(var1,var2,var3) Poi automaticamente i 3 varlori (dopo essere stati calcolati dalla funzione chiamata dalla call venivano restituiti. Forse è questo che intendevi?? |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Passarli per riferimento vuol dire passare alla funzione i valori effettivi al fine di apportare modifiche che rimarranno permamenti. Nel tuo caso puoi fare cosi:
void fun(string& s1, string& s2, int& i) { // Nota la e commerciale dopo il tipo s1 = "ciao"; s2 = "hello"; i = 123; } in questo modo una chiamata del tipo fun (x, y, z); farà si che in x, y e z vengano memorizzati i valori assegnati all'interno della funzione. Tuttavia, l'approccio che fa uso di una struct secondo me è migliore, soprattutto se devi restituire tanti valori, tutti correlati tra di loro. Ciao |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 479
|
Grazie noxie,
ho provato il tuo codice di qualche post sopra ma mi da errore, soprattutto alla linea: "Dato fun(Dato d)" Forse perchè sto utilizzando Visual c++! O forse perchè sono proprio newbie!!! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2005
Città: Resana - TV
Messaggi: 960
|
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Allora, la struct andrebbe definita cosi:
struct Dato { string s1, s2; int i; }; In effetti quella che avevo scritto prima definiva solo un identificatore di nome Dato utilizzabile come una comune variabile. Invece mettendo il nome dopo struct definisci un vero e proprio tipo di dato. Comunque per iniziare sconsiglio di fare uso di un ambiente visuale, meglio un ambiente semplice con un compilatore C++ standard. Scarica Dev-C++. Ciao Ultima modifica di Noixe : 25-08-2008 alle 19:37. |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Allora, la prima soluzione è tramite una struct
Codice:
typedef struct _Dato{
char *stringa1;
char *stringa2;
int intero;
} Dato
Dato *getDato(){
Dato *dato=(Dato *)malloc(sizeof(Dato));
strcopy("Ciao",dato->stringa1); //non ricordo l'ordine dei parametri, in pratica copia la stringa "Ciao" nella posizione dato->stringa1 (non ricordo se devi prima allocarla con malloc)
//stessa cosa con stringa2
dato->intero=8;
return dato;
}
void chiamante(){
Dato *dat=getDato();
//usa il dato
free(dat);
}
Codice:
void faiQualcosa(char *s1,char *s2,int *i){
(*s1)="nuovo valore";
(*s2)="altro valore";
(*i)=9;
}
void chiamante(){
char *prima="Prima";
char *seconda="Seconda";
int in=3;
faiQualcosa(prima,seconda,&in);
}
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
La tua sintassi e' C non C++.
Per il secondo linguaggio esiste il tipo di dato string, che evita tutti i problemi dei noiosi char*. Per il passaggio di valori per riferimento, meglio usare i reference (con la e commerciale) invece dei puntatori. Ciao |
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Apr 2007
Messaggi: 223
|
Quote:
Spero di esserti stato utile
__________________
Leaves Web: www.leavesweb.tk Skype: leavesweb Create your dreams! - My Blog: JollyChar! |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Seriamente, vi prego, non consigliate più Dev-C++ a nessuno... ![]() Le alternative migliori e gratuite al momento sono Code::Blocks, wxDev-C++ (ok è quasi identico a Dev-C++, ma almeno non è morto), Visual C++ Express Edition. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Ma per iniziare un ambiente vale l'altro, dato che bisogna focalizzare l'attenzione sul linguaggio e non sul programma.
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Ecco un esempio banale che probabilmente chiarirà meglio della spiegazione teorica
Passaggio per copia o per valore (non c'e' la & dopo il tipo): Codice:
void fun (int i) {
i = 2;
};
int i = 1;
fun(i);
Nel passaggio per indirizzo o per riferimento, il valore della i sarebbe diventato 2. |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Oddio è vero... ![]() Anzi, la seconda già è tanto se compila, come minimo dovrebbe dare due warning.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Non mi si e' mai bloccato.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:22.





















