Definizione di variabili

Sto facendo "pulizia" in molti programmi che ho in giro.
Siccome sono un tipo "precisino", quando mi ci metto guardo un po' tutto.
Datemi un consiglio (lo so, è da neofita):

  • lascio stare le decine di chiamate che ho nel loop (), tipo int i = eccetera oppure String strD = eccetera
  • oppure faccio una int i = 0; e una String strD = ""; all'inizio del programma?
    Poi naturalmente nel loop tiro via tutti quei String e quegli int....

Ne vale la pena o perdo tempo?

Se non c'è un motivo preciso di avere variabili "statiche", lasciale dichiarate "locali" e quindi dinamiche ... :wink:

Guglielmo

E' solo un discorso di "pulizia" nel programma.
Ho una trentina di variabili definite all'inizio del programma e poi mi sono accorto che ho qualche definizione di variabile, richiamata anche più volte, sparse nel programma.
Oltre un discorso di pulizia magari c'è una diversa occupazione di memoria tra quelle statiche e quelle locali?

Per il discorso pulizia ci sono da considerare tre cose

  • Statiche globali, quelle che devono essere condivise, visibili e modificabili da ogni funzione. Occupano la memoria permanentemente. Dovrebbero essere il minimo possibile.
  • Statiche locali, quelle che servono (sono visibili) solo all'interno di una funzione ma che devono mantenere il loro valore tra una chiamata e l'altra (ad esempio variabili di stato). Occupano la memoria permanentemente.
  • Locali non statiche (quelle appunto dichiarate qua e la quando servono), che servono solo all'interno della funzione e scompaiono al suo termine (la memoria nell'area di stack viene sempre liberata, e al riavvio della funzione vengono "ricreate"). Nota: anche i parametri di una funzione sono variabili locali non statiche.

In Pascal, linguaggio nato per essere pulito e ordinato (un posto per ogni cosa e ogni cosa al suo posto, dicevano) le dichiarazioni di tutte le variabili usate in seguito sono obbligatoriamente accorpate all'inizio del blocco corrente (funzione/procedura/), in un'apposita sezione 'var'. In C non esiste questo obbligo, ma può essere un'idea.

1 Like

Forse perdi tempo, ma quanto tempo? Quantifichiamo, se perdi 10 minuti senza introdurre bug io dico che conviene.
Mentre se impieghi 10 minuti per introdurre un bug e allora è tempo perso. Qualunque modifica si apporta ad un programma si deve essere consapevoli che potenzialmente si è introdotto un bug. La versione del programma non modificata ha alle spalle dei test passati con successo, la versione modificata non ha alle spalle dei test e quindi devi eseguire tutti i test.

Quindi detto ciò, la domanda è: Qual'è lo scopo delle modifiche?

  1. rework - Solitamente non si incrementano le prestazioni e non si introducono nuove caratteristiche, ma si apportano modifiche per migliorare la leggibilità, semplificare l'introduzione di nuove caratteristiche, dare nomi diversi ai simboli e per evitare inutili ripetizioni. In questa fase è facile introdurre bug.

  2. Ottimizzazione - Si sa già che c'è margine di ottimizzazione e che in seguito si introdurranno nuove caratteristiche. In questa fase è sicuro introdurre un bug, per cui attenzione massima.

  3. introduzione di nuove caratteristiche. Quasi sicuro che introdurremo un bug e ciò che funzionava prima ora non funziona più incluse le nuove caratteristiche.

Con questa consapevolezza ora puoi apportare tutte le modifiche che vuoi, ma la versione release è sempre quella senza modifiche. Tutte quelle con modifiche sono beta e dovranno diventare release con lavoro e tanto tempo.

Ciao.

Beh, il programma ha 434 righe e l'ho personalizzato per 4 clienti (scarica dati su cloud proprietari). Quindi quadruplo lavoro!
Se lo "pulisco" non ottengo nulla, nemmeno la leggibilità migliorerebbe.
Quella dei bug è vera al 100%, un po' come quando entri in una cristalleria e sposti un bicchiere perché non lo vedi bene in quel posto..... E poi cade!

Per sostituire dei Serial.print e "girarli", ridimensionati, su un OLED sono due giorni che ci "lavoro" (vabbè, dai, per noi è sempre un gioco). E di bug ne saltano fuori a volontà.

"Làssa stàa" direbbero a Cremona. Stanno bene così. :grinning_face_with_smiling_eyes:

Ecco hai centrato in pieno l'esempio, cioè era meglio nel posto sbagliato ma sano.

In qualche programma (era il contatore Geiger, credo) ho dovuto fare pulizie per forza, altrimenti non c'era più spazio per aggiungere qualcosa. Allora ho cominciato a ottimizzare e usare funzioni per delle parti che erano ripetute. Ho fatto una cosa per volta, verificando sempre che tutto funzionasse prima di andare avanti, ed è andato tutto bene. Quando vai a modificare qualcosa, dovresti pensare bene a dove può creare problemi e andare a verificare lì che tutto funzioni.

Normalmente questo lavoro si fa durante lo sviluppo, osservando il codice che viene su si possono evidenziare porzioni di codice da inserire in una funzione. Questo lavoro viene bene quando le linee di codice sono poche come poche sono le variabili.

Diverse sono le strategie, una di queste consiste nel selezionare tutte le linee di codice che lavorano sullo stesso set di dati.

Il set di dati lo si rende una struttura, si crea istanza e la si passa come puntatore (oppure si usa & per specificare che il parametro è un riferimento) a tutte le funzioni che si creano.

Però non è così semplice, ma scrivendo codice anche per esercitarsi si acquisiscono capacità che poi con il tempo ci permettono di scrivere codice già pulito o quanto meno per ripulirlo basta una spolverata, che poi se questo lavoro lo si fa di frequente c'è molto meno rischio di introdurre un bug.

Quando scrivo una funzionalità, prendiamo l'esempio del treno, dopo avere testato e verificato che funziona sento la necessità di proteggerla ad esempio impacchettarla in una classe o in un modulo .cpp, dove ricordiamolo possiamo dichiarare le variabili e si chiamano variabili di modulo. Impacchettato il tutto il codice nel loop si riduce ad una due righe e allora ritorno ad scrivere codice nel loop fino ad ottenere un'altra caratteristiche o parte di essa, e ritorno a fare il rework e così si va avanti fino alla fine dello sviluppo.

Vedo molti programmi arduino e quasi tutti non implementano classi C++ ne tanto meno classi C. Come conseguenza naturale non mi aspetto niente di buono dal codice che se funziona bene sarà costato al programmatore tanta fatica ma davvero tanta, 5. 10 o anche 100 volte più fatica del normale.

Ciao.

Eh, lo so, è l'eterno dilemma. Il mio primo Mac di Apple si chiamava Mac128. Poi lo cambiai col Mac512.
Erano giga? Noooo. Erano Mega? Nooooo. Erano Kbytes.
512 Kbytes dove girava un Word, un Paint, un Desktop con mouse e icone e tante altre cose.
Adesso vedo smartphone da 256 Giga !!!!! :scream:
Chissà cosa farebbero oggi quei programmatori di Apple che gestivano un intero PC con 512 Kbytes !!!

Modificare questo aspetto sarebbe sicuramente un buon passo avanti che potrebbe valere "la fatica".

L'ideale sarebbe che la personalizzazione per il cliente sia a livello di impostazioni e non di firmware (naturalmente se le funzionalità del progetto sono le stesse) in modo da dover sviluppare la stessa cosa un'unica volta.

La personalizzazione riguarda l'indirizzo web del cloud.
Non ci avevo pensato, ma per memorizzare una stringa, all'inizio del programma, tipo https:\www.xyz.com/abcd/lib/data è fattibile?

Poi su due clienti ho una trasmissione diversa di variabili ed una trasmissione diversa di "giornale operazioni", quindi la soluzione non è percorribile.

Col senno di poi.... Ma era nato per un solo cliente, poi altri lo hanno visto ma lo volevano con altre varianti....

Si senza dubbio, il come dipende essenzialmente dal tipo di MCU che stai usando e da eventuali interfacce operatore/utente.

Uso ESP07-S con IDE

Se non sbaglio dovresti avere 4MB di flash memory che potresti usare per salvare un file di configurazione oppure usare in emulazione EEPROM (cosa che a me non piace molto a dire il vero).

Mai fatto. Comunque è una idea che non avevo affrontato.
Cioè tu dici: avere un programma unico e, a lato, fargli leggere un file dove ho i parametri.
Però, dato che è solo una stringa faccio prima ad avere un programma dove cambio solo la stringa di richiamo al web

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.