Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-03-2006, 17: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, 22:28   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
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 è online   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 10: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, 15: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, 18:49   #5
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
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 è online   Rispondi citando il messaggio o parte di esso
Old 20-03-2006, 09: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, 13: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, 19:35   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
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 è online   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 11: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, 11: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, 13: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, 13: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, 19:58   #13
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
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 è online   Rispondi citando il messaggio o parte di esso
Old 21-03-2006, 20: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, 22:04   #15
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
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 è online   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
TIM Enterprise acquisisce il 70% di VoiS...
Altro che dicembre, la RTX 5080 da 24 GB...
Quale futuro per Mass Effect? Tutte le i...
Schermi rotti su iPhone Duo: un report s...
Lo stealer VOLTA chiede a Claude, Kimi e...
Intel e Oracle puntano sulle CPU Xeon pe...
Offerte Amazon da urlo: Mac mini M6 a 89...
Bici elettriche a prezzi da record su Am...
Il boom dell'IA fa salire i costi: HP, A...
Cloudflare: 18,2 milioni di attacchi DDo...
GeForce RTX 2080 Ti con 22 GB di VRAM: f...
Dalla padella... ai server AI: Nvidia va...
1.000 cicli e ancora il 90,4% della capa...
SMS of Death fa crashare Android senza i...
BYD Yangwang U9 Xtreme da 2.977 CV fatta...
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: 13:23.


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