Consiglio su struttura programma

Buongiorno a tutti,

nel sviluppare un programma mi sono chiesto se, in arduino, è meglio avere -estremizzando- un "void" solo , quindi molto lungo o uno "leggero" che utilizzi varie funzioni/void per effettuare le stesse azioni?

Questo indipendentemente della lunghezza totale del programma.

Graie per le riposte + saluti.

Un "void"? :o Forse intendi loop()... :wink:
In "void loop()", la parola prima della funzione è il tipo di dati restituito dalla funzione, ed in questo caso non restituisce nulla ("void" significa "nulla", "niente", nisba", "niet", "keine"! :slight_smile: ).

Certo, scusate l'imprecisione. Intendevo il void loop().

saluti

Ah ok.
Dal punto di vista del programma compilato non ci sono differenze rilevanti in termini di prestazioni o dimensione del compilato, per cui in genere si tende ad evitare un loop() troppo "corposo" per questioni di chiarezza del codice e di debugging più immediato se la logica è divisa in blocchi ognuno dei quali implementato da una o più funzioni apposite. Addirittura trattandosi di ambiente C/C++ hai anche la possibilità di creare le tue classi di oggetti.
Ovviamente il loop() non deve richiedere molto tempo di esecuzione per evitare di perdere eventi, quindi meglio renderlo sempre più snello possibile, delegando l'esecuzione di alcune porzioni meno "leggere" a più riprese (se possibile).

Ma sono tutte cose generali, dipende poi sia dalle necessità, sia dal tipo di implementazione e infine dallo "stile" del programmatore.
Tutto quello che vuoi, ma niente "goto" in ogni caso intesi? :slight_smile: :smiley:

Mah ... povero "GOTO", odiato e vituperato da tutti ... un giorno o l'altro, si vendichera' ... :smiley: :smiley: :smiley:

Aggiungo solo una cosa, usare diverse funzioni viene piu utile anche nel caso che una certa sequenza di azioni la si debba ripetere in diverse parti del loop ... perche' cosi si richiama semplicemente la funzione in oggetto, invece di dover scrivere piu volte nel loop lo stesso blocco di codice ... :wink:

Grazie ad ambedue, è proprio come pensavo.

Ero solo perplesso in merito al numero di funzioni necessarie, anche se questo mi risparmiava righe di programma "ripetitive".

In merito al "GoTo" pienamente d'accordo sull'evitarlo se proprio non indispensabile, ho provato ad usarlo nelle macro di exel con risultati non proprio soddisfacenti. Da allora preferisco evitarlo in qualsiasi linguaggio!! (x Eterenanki --> spiacente ma sono più vicino al parere di docdoc, anche se non così radicale.)

Grazie ancora dei chiarimenti + saluti.

Essendo le schede arduino programmate in linguaggio C/C++ bisognerebbe applicare le tecniche adottate da questi linguaggi, ossia la programmazione top-down. Il programma invece di essere composto da funzioni molto complesse è formato da molte funzioni elementari.
In questo modo il codice è di facile comprensione da parte del programmatore e anche da parte di terzi che lo devono leggere, senza correre il rischio di "perdere il filo" in innumerevoli righe di codice.
E' anche più facile arrivare alla soluzione finale, in quanto non devi risolvere un unico problema complesso, ma di volta in volta risolvere problemi relativamente semplici.

Come decidere se è meglio creare una funzione o mettere il codice nel loop(), è un po in base all'esperienza, ma ci si dovrebbe porre le domande "è indispensabile mettere le istruzioni nel loop()
che viene eseguito continuamente?" "Rendo più chiaro il codice creando una funzione ?"

Un altro consiglio che viene dato è di non scrivere funzioni o blocchi di programma più lunghi di una viedata, una ventina di righe o meno, in sostanza, sempre per aumentare la leggibilità, l'inizio e la fine di una struttura dovrebbero essere sempre visibili contemporaneamente senza bisogno di scrollare il codice, e magari i livelli di annidamento non dovrebbero essere più di due, idealmente una sola struttura per funzione, ma anche un'eccessiva decomposizione può portare di nuovo a scarsa leggibilità, quindi riconoscere la via di mezzo spetta sempre al programmatore.

Dal punto di vista strettamente tecnico, una chiamata a funzione con eventuale passaggio di argomenti caricando/scaricando lo stack, porta via comunque un po' di tempo e di memoria.