Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-08-2008, 13:44   #1
smsc
Senior Member
 
L'Avatar di smsc
 
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!
smsc è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 13:51   #2
SerMagnus
Senior Member
 
L'Avatar di SerMagnus
 
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
SerMagnus è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 14:26   #3
Noixe
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;
}
Oppure usi tre parametri per la funzione e poi all'interno del corpo della funzione stessa li assegni ai tre membri della struttura "Dato".

Ciao
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 14:41   #4
dad_89
Member
 
L'Avatar di dad_89
 
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!
dad_89 è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 16:07   #5
the_ivos
Member
 
L'Avatar di the_ivos
 
Iscritto dal: Aug 2008
Città: Bergamo
Messaggi: 116
Quote:
Originariamente inviato da dad_89 Guarda i messaggi
Non ti basta dichiarare la funzione di tipo void e passare i valori per riferimento? Come avviene in C fral'altro ...
Questa è la soluzione migliore anche secondo me...

Poi calcola che le variabili char vengono sempre passate per riferimento quindi non c'è alcun bisogno di "ritornarle".
__________________
Non andare piu veloce di quanto il tuo angelo custode possa volare
the_ivos è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 16:19   #6
smsc
Senior Member
 
L'Avatar di smsc
 
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??
smsc è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 16:35   #7
Noixe
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
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 17:05   #8
smsc
Senior Member
 
L'Avatar di smsc
 
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!!!
smsc è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 17:16   #9
0rph3n
Senior Member
 
L'Avatar di 0rph3n
 
Iscritto dal: Apr 2005
Città: Resana - TV
Messaggi: 960
Quote:
Originariamente inviato da smsc Guarda i messaggi
Proverò appena possible la soluzione di Noixe, nel frattempo dad, cosa vuol dire "passare i valori per riferimento?"
significa che devi prendere in mano un libro e studiare
0rph3n è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 19:33   #10
Noixe
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.
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 19:53   #11
morskott
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);
}
oppure il passaggio per riferimento
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);
}
col C(++) sono un po arrugginito, credo sia giusto
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB
morskott è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2008, 21:13   #12
Noixe
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
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 00:14   #13
dad_89
Member
 
L'Avatar di dad_89
 
Iscritto dal: Apr 2007
Messaggi: 223
Quote:
Originariamente inviato da smsc Guarda i messaggi
Proverò appena possible la soluzione di Noixe, nel frattempo dad, cosa vuol dire "passare i valori per riferimento?"
In poche parole quando passi una variabile ad una funzione questa viene passata per valore, in pratica vuol dire che essa non appare modificata all'uscita della funzione, per cui la funzione opera non sulla variabile passata ma bensì su di una copia del parametro, per quanto riguardo il passaggio per riferimento viene effettivamente passato l'indirizzo della variabile e tramite quest'ultimo la funzione può modificare il valore della variabile.
Spero di esserti stato utile
__________________
Leaves Web: www.leavesweb.tk
Skype: leavesweb
Create your dreams!
-
My Blog: JollyChar!
dad_89 è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 06:38   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Noixe Guarda i messaggi
Scarica Dev-C++.
  • Questa è blasfemia! Questa è follia!
  • No, questa è... SPARTAAAA!!

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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 09:20   #15
Noixe
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.
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 09:25   #16
Noixe
Member
 
Iscritto dal: Aug 2008
Messaggi: 51
Quote:
Originariamente inviato da smsc Guarda i messaggi
cosa vuol dire "passare i valori per riferimento?"
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);
A questo punto il valore di i rimarrà 1.

Nel passaggio per indirizzo o per riferimento, il valore della i sarebbe diventato 2.
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 09:54   #17
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da morskott Guarda i messaggi
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);
}
oppure il passaggio per riferimento
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);
}
col C(++) sono un po arrugginito, credo sia giusto
Entrambe le soluzioni andranno in crash
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 13:54   #18
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Noixe Guarda i messaggi
Ma per iniziare un ambiente vale l'altro, dato che bisogna focalizzare l'attenzione sul linguaggio e non sul programma.
Non sono d'accordo, un ambiente migliore ti toglie anche molte rogne che all'inizio dei tuoi "studi" è bene evitare. E comunque se ci sono strumenti migliori e gratuiti, meglio iniziare subito con la roba seria ed imparare nel modo giusto.
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Entrambe le soluzioni andranno in crash
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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 16:16   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Noixe Guarda i messaggi
Ma per iniziare un ambiente vale l'altro, dato che bisogna focalizzare l'attenzione sul linguaggio e non sul programma.
Non è però bello vedere Dev-C++ che ti si pianta buttando all'aria il lavoro di diversi minuti
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2008, 17:22   #20
Noixe
Member
 
Iscritto dal: Aug 2008
Messaggi: 51
Non mi si e' mai bloccato.
Noixe è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Da Intel ad AMD, il grande salto di Kulk...
Velocità 12 volte superiore a que...
Una piccola Morte Nera è gi&agrav...
Sei frodi che minacciano gli utenti nel ...
BioShock 4: Take-Two rassicura sullo svi...
Tesla, Musk promette FSD 'quasi pronto' ...
BioWare conferma: il nuovo Mass Effect &...
5 robot aspirapolvere di fascia alta in ...
Xiaomi Redmi Note 14 5G a 179€ è ...
Veri affari con gli sconti de 15% Amazon...
Tutti gli iPhone 16 128GB a 699€, 16e a ...
Take-Two ammette: vendite di Borderlands...
Tutti i Macbook Air e Pro con chip M4 ch...
GeForce RTX 50 SUPER: non cancellate, ma...
Warner Bros. riporterà al cinema ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v