|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2791
|
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. |
|
|
|
|
|
#3 |
|
Senior Member
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 |
|
|
|
|
|
#4 |
|
Senior Member
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 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2791
|
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. |
|
|
|
|
|
#6 |
|
Senior Member
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 |
|
|
|
|
|
#7 |
|
Senior Member
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 |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2791
|
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]); |
|
|
|
|
|
#9 |
|
Senior Member
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 |
|
|
|
|
|
#10 |
|
Senior Member
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 |
|
|
|
|
|
#11 |
|
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 |
|
|
|
|
|
#12 | |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
Quote:
(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 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 |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2791
|
Quote:
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]); |
|
|
|
|
|
|
#14 |
|
Senior Member
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 |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2791
|
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!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:51.



















