Go Down

Topic: dubbio di programmazione (Read 1 time) previous topic - next topic

ƎR

allora di solito nei programmi per creare delle sotto-funzioni faccio così:
Code: [Select]
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! ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

uwefed

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

ƎR

ok grazie
e quando è una cosa tipo questa come funziona?
Code: [Select]
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?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

ok grazie mille ;)
me le hanno spiegata a scuola la programmazione in c a oggetti, ma molto approsimativamente :0
comunque se non metto il return la funzione non prende alcun valore giusto?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

se non metti return, errore di compilazione :)

il c non è ad oggetti, ma il c++, e i puntatori centrano poco con gli oggetti, se non che solo i loro padri.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

si si scusa... intendevo dire che lavorano in modo simile... almeno da quanto ho capito da quello che mi hanno spiegato approsimativamente a scuola
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

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)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

c'è qualche vantaggio a dichiarare le variabili solo all'interno di una funzione e non per tutto il programma?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

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.

ƎR

ok come pensavo :) da ora in poi presterò più attenzione a questo fatto per ottimizzare i programmi, grazie ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

ƎR

#12
Dec 26, 2011, 10:13 am Last Edit: Dec 26, 2011, 10:30 am by er_like_no_other Reason: 1
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
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Esatto. "Vivendo" all'interno di uno spazio dei nomi, è vista solo lì.
Quindi
Code: [Select]
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.

fonzod

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

Go Up