Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti
Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti
Il Lenovo LOQ 15i Gen 10 (15IRX10) offre prestazioni convincenti grazie al Core i7-13650HX e alla RTX 5060 Laptop a 100W, mantenendo un prezzo competitivo tra 1100 e 1300 euro. Costruzione solida, buon display e ampia espandibilità lo rendono una scelta equilibrata per chi cerca un notebook gaming accessibile ma moderno.
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Abbiamo giocato a lungo a Battlefield 6, abbiamo provato tutte le modalità multiplayer, Redsec, e le numerose personalizzazioni. In sintesi, ci siamo concentrati su ogni aspetto del titolo per comprendere al meglio uno degli FPS più ambiziosi della storia dei videogiochi e, dopo quasi due mesi, abbiamo tirato le somme. In questo articolo, condividiamo con voi tutto ciò che è Battlefield 6, un gioco che, a nostro avviso, rappresenta esattamente ciò che questo genere attendeva da tempo
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
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


Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il n...
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando Due mesi di Battlefield 6: dalla campagna al bat...
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
FRAME 4000D LCD RS ARGB, il nuovo case d...
Netflix: AV1 ora gestisce il 30% dello s...
Tesla Optimus inciampa in pubblico e div...
La Gigafactory Tesla di Shanghai ha prod...
Nuovo record per Aisuru: attacco DDoS da...
Chery ha l'acciaio più resistente...
Operazione Gatekeeper: sequestrati oltre...
Le riprese della Stagione 3 di Fallout i...
Pokémon GO introduce gli scambi a...
Arriva l'archivio del futuro: Atlas Eon ...
Il robot umanoide Made in Italy è...
HONOR Robot Phone è mezzo smartphone, me...
Insta360 GO 3S e X3: le videocamere a 36...
BYD inarrestabile: produzione di batteri...
Arriva lo Xiaomi Robot Vacuum 5: il nuov...
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: 16:28.


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