Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla
Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla
Una ammiraglia elettrica, da sei o sette posti, con il comfort di viaggio come missione assoluta. Un'auto non per tutti, ma di cui ti innamori dopo pochi giorni, ecco com'è andata la nostra prova di lunga durata
LG UltraGear evo GM9: 27 pollici, 5K, Mini LED e Dual Mode
LG UltraGear evo GM9: 27 pollici, 5K, Mini LED e Dual Mode
Hyper Mini LED con 2.304 zone, DisplayPort 2.1 e Dual Mode: 5K a 165 Hz oppure QHD a 330 Hz: LG propone un monitor da gioco ma dalla buona versatilità creativa, con prestazioni interessanti e un listino di 1.220 euro. Peccato l'alimentatore ingombrante
Motorola edge 70 Fusion FIFA World Cup 26 Edition: un ottimo smartphone per i fan del calcio
Motorola edge 70 Fusion FIFA World Cup 26 Edition: un ottimo smartphone per i fan del calcio
Motorola edge 70 Fusion FIFA World Cup 26 Edition porta la maglia iridata su uno smartphone accessibile: display Extreme AMOLED da 6,78 pollici a 144Hz, fotocamera Sony LYTIA 710 con moto ai, Snapdragon 7s Gen 3 abbinato a 8GB di RAM, batteria da 5200 mAh con ricarica TurboPower a 68W e certificazione IP68/IP69, il tutto in una veste PANTONE Silhouette con logo dorato a 24 carati, moto buds bass incluse in confezione e contenuti software dedicati ai Mondiali 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-03-2006, 16:04   #1
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
[c++] come estrarre da un l"main2 una serie di istruzioni e farne una funzione??

nel mio main ho una serie di istruzioni.
voglio estrarle dal main e metterle fuori dal main sotto forma di funzione.

voglio cioè creare una funzione esterna che mi dia come risultato una variabile di tipo "double" (chiamata dentro la funzione "theta1" ma che è lo stesso nome della variabile globale theta1 del main).

in ingresso devo dargli un valore double chiamato "eulero12" che è variabile globale anch'esso.

in fondo ci sono le instruzioni di cui mi serve l'intestazione della funzione in cui infilarle. è l'intestazione che non so fare!!!!!

quindi dal main io chiamerò questa funzione (la chiamiamo XXX) con un istruzione del tipo
(credo)
variabile double = XXX(eulero12);


----------------------

if (eulero12>3*pi/2-0.001) superioreatrepimezzi=1; //eseguito solo per poco ma poi la bolean rimane settata lo stesso!!!!
if (superioreatrepimezzi=1) theta1=(eulero12+2*pi); //superioreapimezzi = >3*pi/2
if (eulero12>0&&eulero12<3*pi/2) theta1=eulero12;
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2006, 21:28   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2793
double XXX(){
if (eulero12>3*pi/2-0.001) superioreatrepimezzi=1; //eseguito solo per poco ma poi la bolean rimane settata lo stesso!!!!
if (superioreatrepimezzi=1) theta1=(eulero12+2*pi); //superioreapimezzi = >3*pi/2
if (eulero12>0&&eulero12<3*pi/2) theta1=eulero12;
return (theta1);
}


Per richiamarla:
variabile double = XXX();

Questo funziona se tutte le variabili usate sono globali, cioè dichiarate all'inizio del programma, prima del main. Se le hai dichiarate tutte dentro al main allora dovrai passarle tutte come parametri, quindi la prima riga diventa:

double XXX(double eulero12, double pi, double superioreatrepimezzi, double theta1){

Per richiamarla:
variabile double = XXX(eulero12, pi, superioreatrepimezzi, theta1);

Controlla solo che i tipi siano giusti, io ho messo tutti double perchè non so come li hai dichiarati. Ancora una cosa, non ho capito se vuoi che la boolean, una volta uscito dalla funzione, ti resti, se è così devi fare in questo modo:

double XXX(double eulero12, double pi, double *superioreatrepimezzi, double theta1){
if (eulero12>3*pi/2-0.001) *superioreatrepimezzi=1; //eseguito solo per poco ma poi la bolean rimane settata lo stesso!!!!
if (*superioreatrepimezzi=1) theta1=(eulero12+2*pi); //superioreapimezzi = >3*pi/2
if (eulero12>0&&eulero12<3*pi/2) theta1=eulero12;
return (theta1);
}


Per richiamarla:
variabile double = XXX(eulero12, pi, &superioreatrepimezzi, theta1);

Quasi dimenticavo, la parte più lunga che ti ho scritto è la "definizione" della funzione, bisogna ancora fare la "dichiarazione" che va posta prima del main. La dichiarazione è uguale alla prima riga della definizione, togli solo la graffa in fondo.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 09:00   #3
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
grazie!!!!

(calorosa stretta di mano)


non è che, gentile come sei, ti andrebbe di darmi una mano anche in
http://www.hwupgrade.it/forum/showth...3#post11678923

__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 14:59   #4
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
1)
---
Ipotizzando di avere una funzione:

double sommiamo(double m, double m){

c=m+n; //c è locale
return(c)

}

se nel main ho una variabile "z" di tipo double e due variabili globali v (double e =2), w (double e =3), se attivo la funzione con:

z = sommiamo(v, w);

dovrei ottenere z=2+3=5.
E' esatto?



2)
---
tuttavia essendo z globale posso anche definire la funzione come:

void sommiamo(double m, double m){

c=m+n; //c è locale
z=c; //passo qui alla globale il risultato
return(c)

}

ed attivando la funzione con:
sommiamo(v, w);
dovrei lo stesso ritrovarmi z=5?


3)
---

e che accade se in uscita i risultati devono essere due?
Esempio:
se abbiamo sempre due numeri v=2 e w=3 double e vogliamo attivare una funziona che dia SIA la loro somma SIA la loro differenza come faccio? così?



(double,double) mistero(double m, double m){

c=m+n; //c è locale
d=m-n; //d è locale
return(c)
return(d)

}

si scrive così?


e la chiamo con

(somma,differenza)=mistero(v,w);

(dove somma e differenza sono due variabili del main o globali)


4)
---

e nel caso in uscita voglio sempre i due valori ma messi in un array?

array_creato è già esistente ed ha 2 campi

attivo la funzione sopra con
(array_creato[0],array_creato[1]=mistero(v,w);

E' così?
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 17:49   #5
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2793
Per il link che hai postato purtroppo non so dirti nulla, non sono espertissimo come ho detto.. Poi:
1) E' tutto giusto ma devi aggiungere all'interno della funzione la dichiarazione della variabile c.
2) Sì puoi farlo, puoi anche non usare c.
3) Questo non si può fare (almeno che io sappia no, poi non so), per avere 2 risultati devi o fare 2 funzioni differenti, oppure usare un puntatore. Il puntatore si usa come ho scritto nell'ultima parte dell'altro mio post. In pratica viene così:

mistero(double m, double n, double *d){
c=m+n; //c è locale
*d=m-n; //d è il puntatore
return(c)
}

E si richiama con:
somma=mistero(v,w,&differenza);
4) Qui puoi o richiamarla così, sempre usando la funzione con il puntatore:
array_creato[0]=mistero(v,w,&array_creato+1);
ma non sono sicuro sia giusto. Oppure puoi proprio modificare la funzione ma in questo caso viene un casino per nulla.. se proprio vuoi sapere come si fa però te la scrivo. Ciao!

Ps: ti consiglio di usare meno variabili globali possibili, perchè quando farai programmi più grossi diventerà un casino.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 20-03-2006, 08:59   #6
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
e una cosa del genere? cioè passare in "input" le variabili (globali) in cui schiaffare i risultati da calcolare?

(nel main)
double somma, differenza, a, b;
a=2;
b=3;

(la funzione)
void mistero(double m, double n, double s, double t){
s=m+n;
t=m-n;
}

E richiamo con:
mistero(a,b,somma,differenza);


dovrei ottenere
somma=2+3=5
differenza=2-3=-1
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 20-03-2006, 12:27   #7
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
test che ho fatto e che funziona

#include<stdio.h>
#include <math.h>

double somma, differenza, a, b, risultato1, risultato2;
double arraydirisultati[2]; //array di 2 elementi


// definizione funzioni
//---------------------


double somma_differenza1(double m, double n){
double s, t;
s=m+n;
t=m-n;
printf("somma tra 2 e 3 -variabili locali-: %g\n",s );
printf("differenza tra 2 e 3 -variabili locali-: %g\n",t);
return(s); //esce solo s ma non t!!!
}


void somma_differenza2(double m, double n, double uscita1, double uscita2){
double s, t;
s=m+n;
t=m-n;
printf("somma tra 2 e 3 -variabili locali-: %g\n",s );
printf("differenza tra 2 e 3 -variabili locali-: %g\n",t);
risultato1=s;
risultato2=t;
return;
//stavolta non ho nessun return(qualcosa);
}


void somma_differenza3(double m, double n, double [] ){
double s, t;
s=m+n;
t=m-n;
printf("somma tra 2 e 3 -variabili locali-: %g\n",s );
printf("differenza tra 2 e 3 -variabili locali-: %g\n",t);
arraydirisultati[0]=s;
arraydirisultati[1]=t;
return;
//stavolta non ho nessun return(qualcosa);
}



// PROGRAMMA PRINCIPALE ---------
//-------------------------------
void main()
{


a=2;
b=3;

//test1
risultato1=-99;
risultato2=-99;
printf("-------------prima funzione:\n");
risultato1=somma_differenza1(a, b);
printf("somma tra 2 e 3: %g\n",risultato1 );
printf("differenza tra 2 e 3: %g\n", risultato2);


//test2
risultato2=-88;
risultato1=-88;
printf("-------------seconda funzione:\n");
somma_differenza2(a, b, risultato1, risultato2);
printf("somma tra 2 e 3: %g\n",risultato1 );
printf("differenza tra 2 e 3: %g\n", risultato2);


//test3
risultato2=-77;
risultato1=-77;
arraydirisultati[0]=-66;
arraydirisultati[1]=-66;
printf("-------------terza funzione:\n");
somma_differenza3(a, b, arraydirisultati);
printf("somma tra 2 e 3: %g\n",arraydirisultati[0] );
printf("differenza tra 2 e 3: %g\n", arraydirisultati[1]);


}

funziona tutto.


RIMANE IL DUBBIO: è possibile passare in output un array?????
una funzione così insomma non risco a crearla:

double [] = somma_differenza4(double m, double n){
double s, t;
double arraylocale[2];
s=m+n;
t=m-n;
printf("somma tra 2 e 3 -variabili locali-: %g\n",s );
printf("differenza tra 2 e 3 -variabili locali-: %g\n",t);
arraylocale[0]=s;
arraylocale[1]=t;
return (arraylocale[]);
//stavolta non ho nessun return(qualcosa);
}



con nel main

//test4
risultato2=-45;
risultato1=-45;
arraydirisultati[0]=-44;
arraydirisultati[1]=-44;
printf("-------------quarta funzione:\n");
arraydirisultati=somma_differenza4(a, b);
printf("somma tra 2 e 3: %g\n",arraydirisultati[0] );
printf("differenza tra 2 e 3: %g\n", arraydirisultati[1]);


E' SBAGLIATO. PERCHé?
pare non accettare "double[]" nella definizione della funziona!!!!!!!!!

help!
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 20-03-2006, 18:35   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2793
Non penso si possa fare l'output di un array in questo modo. L'unica è mettere un parametro aggiuntivo che farà poi da output:

void somma_differenza4(double m, double n, double arraylocale[]){
double s, t;
s=m+n;
t=m-n;
printf("somma tra 2 e 3 -variabili locali-: %g\n",s );
printf("differenza tra 2 e 3 -variabili locali-: %g\n",t);
arraylocale[0]=s;
arraylocale[1]=t;
}



con nel main

//test4
risultato2=-45;
risultato1=-45;
arraydirisultati[0]=-44;
arraydirisultati[1]=-44;
printf("-------------quarta funzione:\n");
somma_differenza4(a, b,arraidirisultati[]);
printf("somma tra 2 e 3: %g\n",arraydirisultati[0] );
printf("differenza tra 2 e 3: %g\n", arraydirisultati[1]);
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 10:03   #9
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
ok.
ma questo sistema pare non funzionare se ho delle sub-funzioni.
vedi
http://www.hwupgrade.it/forum/showthread.php?t=1162332
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 10:04   #10
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
domanda:

tu hai scritto

void somma_differenza4(double m, double n, double arraylocale[]){


era uguale scrivere

void somma_differenza4(double m, double n, double *arraylocale){

notare *arraylocale al posto di arraylocale[]


???
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 12:04   #11
BountyKiller
Utente sospeso
 
Iscritto dal: Oct 2002
Messaggi: 2156
si, gli array sono sempre passati per riferimento alle funzioni (a meno di non fare accrocchi strani ovviamente) in c/c++
__________________
sign editata dallo staff
BountyKiller è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 12:21   #12
BountyKiller
Utente sospeso
 
Iscritto dal: Oct 2002
Messaggi: 2156
Quote:
Originariamente inviato da vermaccio

E' SBAGLIATO. PERCHé?
pare non accettare "double[]" nella definizione della funziona!!!!!!!!!

help!
non puoi far ritornare un array a una funzione, però puoi farle ritornare un puntatore a un array, oppure un puntatore a un'istanza (o dirtettaemnte un'istanza) di una struct o di una classe (non di una union però); mi pare che il tuo problema sia la funzione che ritorna due valori , cioè quello che avevi scritto più sopra:

(double,double) funzione (parametri)

che non si può ovviamente fare;
il modo più semplice di gestire il problema è far ritornare alla funzione un qualcosa che dentro di sè ha i 2 valori che ti servono (o anche più di 2 ovviamente , ma la funzione ritornerà sempre e comunque un'unica "cosa";

ad esempio;

#define N_PAR 2

double* FunzioneMisteriosa(double a, double b)
{
double* puntatore = new double[N_PAR];
puntatore[0] = a-b;
puntatore[1] = a+b;
//.... altre cose se servono, modifica la macro N_PAR di conseguenza
return puntatore;
}

void main()
{
double* risultato;
double x,y;
cout<<"inserisci x/n";
cin>>x;
cout<<"inserisci y/n";
cin>>y;
risultato = FunzioneMisteriosa(x,y);
cout<<"la differenza è"<<risultato[0]<<endl;
cout<<"la somma è"<<risultato[1]<<endl;
delete [] risultato;
return;
}
__________________
sign editata dallo staff
BountyKiller è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 18:58   #13
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2793
Quote:
Originariamente inviato da vermaccio
ok.
ma questo sistema pare non funzionare se ho delle sub-funzioni.
vedi
http://www.hwupgrade.it/forum/showthread.php?t=1162332
Sì, scusa è sbagliato, ma non per quello che dici tu, ho proprio sbagliato io.. ti riscrivo il pezzo giusto:

void somma_differenza4(double m, double n, double arraylocale[]){
double s, t;
s=m+n;
t=m-n;
printf("somma tra 2 e 3 -variabili locali-: %g\n",s );
printf("differenza tra 2 e 3 -variabili locali-: %g\n",t);
arraylocale[0]=s;
arraylocale[1]=t;
}



con nel main

a=-44;
b=-44;
printf("-------------quarta funzione:\n");
somma_differenza4(a, b,arraidirisultati);
printf("somma tra 2 e 3: %g\n",arraydirisultati[0] );
printf("differenza tra 2 e 3: %g\n", arraydirisultati[1]);
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 19:22   #14
vermaccio
Senior Member
 
L'Avatar di vermaccio
 
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
non dovrei passare per indirizzo invece che per5 valore l'array quando attivo la funzione nel main?

ovvero invece di
somma_differenza4(a, b,arraidirisultati);

non dovrei usare

somma_differenza4(a, b,&arraidirisultati);

e nella definizione della funzione
invece di
void somma_differenza4(double m, double n, double arraylocale[]){

non dovrei mettere

void somma_differenza4(double m, double n, double *arraylocale[]){

???
questo dubbio mi è venuto dall'altro thread
http://www.hwupgrade.it/forum/showth...5#post11724475
__________________
..strisc...strisc...oooooOOoooO
http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII
vermaccio è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 21:04   #15
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2793
No, perchè gli array in realtà sono dei puntatori, quindi se nella funzione si aspetta un indirizzo (arraylocale[] è uguale a *arraylocale) tu gli passi un indirizzo(arraydirisultati) e non l'indirizzo del puntatore (&arraydirisultati). Prova a leggere qualche guida che spieghi bene come funzionano i puntatori, non mi è facile spiegarti così su due piedi... Ciao!
wingman87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla Hyundai Ioniq 9: dopo due settimane di test non ...
LG UltraGear evo GM9: 27 pollici, 5K, Mini LED e Dual Mode LG UltraGear evo GM9: 27 pollici, 5K, Mini LED e...
Motorola edge 70 Fusion FIFA World Cup 26 Edition: un ottimo smartphone per i fan del calcio Motorola edge 70 Fusion FIFA World Cup 26 Editio...
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
Trasforma lo smartphone in un server dom...
Perché tutti stanno mettendo una foglia ...
Zeekr 7X a fuoco: batteria più sicura de...
L'uomo su Marte: Perseverance sta per po...
SCTPhantom è il bug del 2008 che ...
Un agosto caldissimo anche per le offert...
MOVA E40 Ultra a 279€: robot aspirapolve...
Una versione di Microsoft Word del 1990 ...
Anche Kimi K3 evade dall'ambiente di tes...
L'app Meteo di Windows 11 usa 5 volte la...
L'IA sostituirà i programmatori? Il gran...
Recensione Halo: Campaign Evolved, l'ori...
Tineco FLOOR ONE S7 Pro a 236€: scende a...
Niente AI slop per Oracle: blocco totale...
Canon RF 300-600mm f/5.6L: forse a sette...
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: 12:22.


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