Go Down

Topic: Come tornare a loop() dall'interno di funzioni nidificate (Read 350 times) previous topic - next topic

bonde88

Jul 22, 2014, 01:34 pm Last Edit: Jul 22, 2014, 01:36 pm by bonde88 Reason: 1
ciao a tutti,
premetto che è da poco che mi cimento nella programmazione con arduino...mi ritrovo con un piccolo dubbio vorrei sapere se esiste un comando che una volta chiamato mi rimanda direttamente alla funzione loop() principale ad esempio il "togo" ma che leggendo nel reference sconsigliano di usare....questo è un esempio schematizzato dello sketch
Code: [Select]
void loop(){
   funzione_a();
}

void funzione_a(){
   funzione_b();
}

void funzione_b(){
   funzione_c();
}

void funzione_c(){
   funzione_d();
}

void funzione_d(){
   //return al loop
}


quello che volevo sapere è se io posso con un comando passare direttamente dalla funzione_d() al loop()...so che in questo caso non serve ecc ma era giusto uno schema per cercare di far capire di quello che parlo...una sorta di "return/break" ma anziché uscire solamente dalla funzione io voglio indicargli di preciso in che punto del codice andare a posizionarsi...spero che si sia capito quello che intendo...

gpb01

#1
Jul 22, 2014, 01:37 pm Last Edit: Jul 22, 2014, 01:39 pm by gpb01 Reason: 1
NON puoi senza tornare indietro nello stesso ordine ...

... ogni volta che una funzione ne chiama un'altra, come nel tuo caso, l'indirizzo di ritorno viene messo nello stack con una PUSH e quindi, a ritroso, occorre fare altrettante POP per togliere i valori dallo stack e tornare indietro.

Naturalmente puoi creare una semplice variabile di stato che usi, quando ritorni da una funzione, per capire se devi continuare nella funzione chiamante o eseguire subito un return ;)

Guglielmo

Edit : In assembler la cosa è fattibile (... ma è una porcheria farla) perché posso dirgli quanti bytes rimuovere dallo stack
Search is Your friend ... or I am Your enemy !

pablos

#2
Jul 22, 2014, 01:39 pm Last Edit: Jul 22, 2014, 01:41 pm by pablos Reason: 1
tutto parte da loop() e tutto finisce nel loop()
Code: [Select]
void loop(){
  funzione_a(); // va alla funzione e ritorna
 funzione_b(); // va alla funzione e ritorna
funzione_c();// va alla funzione e ritorna
funzione_d();// va alla funzione e ritorna
qui prosegue
}

void funzione_a(){
  funzione_b();
}

void funzione_b(){
  funzione_c();
}

void funzione_c(){
  funzione_d();
}


perchè devi ritornare nel loop? se hai cose ripetitive le puoi mettere in un altra funzione e richiamarla da a,b,c,d
no comment

bonde88

ok grazie mille ora che so che non esiste un comando posso mettermi l anima in pace, è da un paio di giorni che cerco una risposta in rete senza trovare risposta...in realta la mia era una domanda più teorica che pratica nel senso che avevo gia risolto con return e controlli if pero volevo capire se ci fosse un comando ad hoc per questi casi...grazie mile a tutti

tapirinho

Non so se ho capito bene, ma con un select case nel loop potresti "tornare" al punto che vuoi...

Code: [Select]
void loop(){
select condizione   
case a:
funzione_a();
break();
case b:
funzione_b();
  break();
case c:
funzione_c();
break();
case d:
funzione_d();
break();
}

void funzione_a(){
   funzione_b();
}

void funzione_b(){
   funzione_c();
}

void funzione_c(){
   funzione_d();
}

void funzione_d(){
   condizione=b;
}



In questo modo torna direttamente alla funzione b senza fare tutto il ciclo del loop.

gpb01

@ tapirinho: non ha nulla a che vedere con quello che vuole fare lui ...

loop() ---> chiama fA() ---> chiama fB() ---> chiama fC() ---> chiama fD() ...a questo punto lui voleva poter uscire direttamente da fD() senza passare indietro per le funzioni chiamate.

Tu invece, a seconda del "case", chiami UNA alla volta le varie funzioni ... che è ben diverso !

Guglielmo
Search is Your friend ... or I am Your enemy !

uwefed

C'é un modo, ma se lo dico mi lapideranno metá degli utenti di questo Forum.

goto()

che ha lo svantaggio che ritorni a una posizione definita, non dopo la chiamata della prima funzione che ha chiamata la seconda ecc.

Ma, come sostengo, C non ha bisogno della chiamata goto().

Ciao Uwe

gpb01

@ Uwe :

A parte che se ti vediamo usare un "goto" ti mettiamo al rogo  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green: ... comunque NON funziona perché :

"A label has the same form as a variable name, and is followed by a colon. It can be attached to any statement in the same function as the goto."  (Kernighan - Ritchie, The C programming Language, Second Edition, Pag. 61)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

... e ribadiamo, sempre usando una frase del Kernighan - Ritchie, che :

"With a few exceptions, code that relies on goto statements is generally harder to understand and to maintain than code without gotos. Although we are not dogmatic about the matter, it does seem that goto statements should be used rarely, if at all."   XD XD XD

Guglielmo
Search is Your friend ... or I am Your enemy !

tapirinho


@ tapirinho: non ha nulla a che vedere con quello che vuole fare lui ...

loop() ---> chiama fA() ---> chiama fB() ---> chiama fC() ---> chiama fD() ...a questo punto lui voleva poter uscire direttamente da fD() senza passare indietro per le funzioni chiamate.

Tu invece, a seconda del "case", chiami UNA alla volta le varie funzioni ... che è ben diverso !

Guglielmo

già...  :smiley-sweat: l'avevo preannunciato ed in effetti è stato proprio così  :smiley-red:

Go Up