Pages: [1] 2 3   Go Down
Author Topic: dubbio di programmazione  (Read 1045 times)
0 Members and 1 Guest are viewing this topic.
Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

allora di solito nei programmi per creare delle sotto-funzioni faccio così:
Code:
void loop()
{
//programma...
Funzione();
//programma...
}

void Funzione()
{
//funzione...
}

ma ho visto in giro che si può usare anche int al posto di void, ma non sono riuscito a trovare nelle reference niente che mi spiegasse le differenze e cosa posso fare in più con una funzione int... c'è qualche buona anima che mi spiega come funziona? e come posso sfruttarle al meglio?
grazie! smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10464
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

void è il tipo della variabile di ritorno. Se non è void, è obbligatorio mettere l'istruzione return che indica il valore della variabile da ritornare.

per esempio:

int funzione(){
   return 5;
}

int variabile = funzione();

ora variabile vale 5!

al posto di int puoi usare anche stringhe, array etc... ma è da evitare come la peste per via che prima devi imparare i puntatori per capire che gli array e gli oggetti in generale vengono distrutti a fine della funzione, quindi nel return trovi una variabile che però è stata distrutta...

limitati ad usarla con char, int, float, long e double (anche unsigned) e non avrai mai problemi.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 257
Posts: 21484
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il "void" nella definizione della funzione significa che la funzione non da nessun valore di ritorno. Il "int" significa che il valore di ritorno della funzine (quello che dai nel return() per capirci) é del tipo intero. Anche gli altri tipi di varabili si possono usare.
Ciao Uwe
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie
e quando è una cosa tipo questa come funziona?
Code:
void loop()
{
a=funzione(a);
}

int funzione(x)
{
 x=x+3;
}
(adesso non mi ricordo se era esattamente così, correggetemi se sbaglio)

non c'è nessuna pagina nelle reference che lo spiega così me la leggo senza disturbarvi?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10464
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

rielaboriamola così (manca un return, il tipo di x, e aggiungo una variabile c):

void loop()
{
int c=2;
int a=funzione(c);
}

int funzione(int x)
{
 x=x+3;
 return x;
}

succede che: c=2, chiama la funzione, quindi x = 2, poi x=x+3 quindi 5, poi ritorna 5 che finisce in a. notare che a=5 e c vale ancora 2.
questo discorso (del non cambiare valore) vale SOLO per i tipi di dato che ti ho scritto prima, perchè vengono passati come COPIA DEL VALORE. Invece array e classi etc... vengono passate PER RIFERIMETO (puntatori), per questo se modificate dalla funzione saranno modificate globalmente.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie mille smiley-wink
me le hanno spiegata a scuola la programmazione in c a oggetti, ma molto approsimativamente smiley-mad
comunque se non metto il return la funzione non prende alcun valore giusto?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10464
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se non metti return, errore di compilazione smiley

il c non è ad oggetti, ma il c++, e i puntatori centrano poco con gli oggetti, se non che solo i loro padri.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si si scusa... intendevo dire che lavorano in modo simile... almeno da quanto ho capito da quello che mi hanno spiegato approsimativamente a scuola
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10464
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

le classi sono un complessissimo gioco di puntatori, che farsi da soli è praticamente impensabile. Sono talmente complesse che in linguaggi tipo Java scompaiono i puntatori (o meglio il programmatore non li usa, fa tutto il linguaggio)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

c'è qualche vantaggio a dichiarare le variabili solo all'interno di una funzione e non per tutto il programma?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il vantaggio è il risparmio di memoria perché le variabili vivono nel loro spazio dei nomi. Quelle dichiarate in un ciclo for o while vengono distrutte quando termina il ciclo, liberando la RAM occupata.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok come pensavo smiley da ora in poi presterò più attenzione a questo fatto per ottimizzare i programmi, grazie smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ho un altro dubbio, il fatto che vengano distrutte implica che la volta dopo che vado a riutilizzarle non hanno il valore che avevano prima ma 0?
e quindi se devo usare una variabile in 2 funzioni devo dichiararla per tutto il programma se no perde il valore? o no?
grazie
« Last Edit: December 26, 2011, 04:30:26 am by er_like_no_other » Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Esatto. "Vivendo" all'interno di uno spazio dei nomi, è vista solo lì.
Quindi
Code:
byte globale=0;
void setup() {
  globale++; //bene
}

void loop() {
  byte locale_loop=0;
  locale_loop++; //bene
  globale++;
  for (byte i=0; i<3; i++) {
    byte locale_for;
    while (i<1) {
      locale_for++; //bene
      globale++; //bene
    }
  }
  locale_for++; //male! era locale nel for e basta
  chiamoSubroutine();
}

void subRoutine() {
  locale_loop++; //male! è locale solo nel loop
  globale++; //bene
}

Se la variabile deve essere vista da 2 subroutine, deve essere globale in modo che non venga distrutta mai.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 99
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quando viene distrutta non ha più il valore che aveva precedentemente. se provi a riusare una varabile "int a" dichiarata all'interno di una funzione, dopo che la funzione stessa è terminata, il compilatore ti darà errore perchè non conosce l'identificatore "a", visto che è stato distrutto con il termine della funzione (istanza di funzione)
quindi se volessi portare a spasso la variabile "a" per varie funzione, devi dichiararla globalmente, cioè all'esterno delle funzioni. ma ciò che rimane è l'identificatore della variabile, cioè la possibilità di poterla riferire; il concetto valore viene dopo che l'hai riferita.

ciao feferico
Logged

Pages: [1] 2 3   Go Up
Jump to: