PDA

View Full Version : [c++] come estrarre da un l"main2 una serie di istruzioni e farne una funzione??


vermaccio
17-03-2006, 17:04
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;

wingman87
17-03-2006, 22:28
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.

vermaccio
18-03-2006, 10:00
grazie!!!!
:) :) :)
(calorosa stretta di mano)


non è che, gentile come sei, ti andrebbe di darmi una mano anche in
http://www.hwupgrade.it/forum/showthread.php?p=11678923#post11678923

:)

vermaccio
18-03-2006, 15:59
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ì?

wingman87
18-03-2006, 18:49
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.

vermaccio
20-03-2006, 09:59
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

vermaccio
20-03-2006, 13:27
#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!

wingman87
20-03-2006, 19:35
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]);

vermaccio
21-03-2006, 11:03
ok.
ma questo sistema pare non funzionare se ho delle sub-funzioni.
vedi
http://www.hwupgrade.it/forum/showthread.php?t=1162332

vermaccio
21-03-2006, 11:04
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[]


???

BountyKiller
21-03-2006, 13:04
si, gli array sono sempre passati per riferimento alle funzioni (a meno di non fare accrocchi strani ovviamente) in c/c++

BountyKiller
21-03-2006, 13:21
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;
}

wingman87
21-03-2006, 19:58
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]);

vermaccio
21-03-2006, 20:22
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/showthread.php?p=11724475#post11724475

wingman87
21-03-2006, 22:04
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!