Come tornare a loop() dall'interno di funzioni nidificate

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

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...

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 :wink:

Guglielmo

Edit : In assembler la cosa è fattibile (... ma è una porcheria farla) perché posso dirgli quanti bytes rimuovere dallo stack

tutto parte da loop() e tutto finisce nel loop()

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

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

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

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.

@ 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

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

@ Uwe :

A parte che se ti vediamo usare un "goto" ti mettiamo al rogo :grin: :grin: :grin: ... 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

... 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

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

già... :sweat_smile: l'avevo preannunciato ed in effetti è stato proprio così :blush: