Variabili passate ad una funzione

Salve a tutti,
Sono da poco entrato nel mondo arduino, ed una cosa non sono riuscito a capirla
Ho una funzione che riceve in ingresso una variabile intera; la funzione deve incrementare questa variabile al suo interno, ed in base ad un range di valori prestabiliti impostare il valore booleano di ritorno. Per chiarire il codice è:

boolean Lampeggio(int ACount)
  { 
    ACount ++; // incremento di 1
    if (ACount>30) {ACount = 1;} // se ha superato 30 la riporto a 1
    if (ACount>7 &&  ACount<15) { return true; }
                                          else { return false; }
   }

Il problema è che monitorando il comportamento della funzione nella sezione loop con il monitor seriale, non vedo l’incremento della variabile globale passata alla funzione. Dato che ho più contatori, vorrei usare una funzione unica per tutti.
Il mio dubbio è che ricevendo in ingresso ad esempio la variabile globale Count1, la funzione la incrementa di uno al suo interno, ma raggiunta la fine della funzione il valore che in quel momento è in ACount non viene trasferito indietro a Count1.
Spero di essere stato chiaro nell’esporre il problema.
Grazie a tutti,
Andrea

Buonasera, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, [u]NON[/u] necessariamente inerenti alla tua domanda: - serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - pinout delle varie schede by xxxPighi: Pinout - link [u]generali[/u] utili: Link Utili

Dopo aver fatto quanto su richiesto ...

... le variabili passate "by value" sono solo in INGRESSO alla funzione e NON hanno alcun collegamento con la variabile passata.

Del resto, se hai una variabile "globale" è inutile che la passi, la funzione la vede già è può operarci sopra senza che glie la passi.

Guglielmo

Ma il mio intento era avere una funzione unica che agisca su più variabili globali Count1, Count2, Count3 etc.. e quindi risparmiare codice e avere maggiore leggibilità! Come dici te Guglielmo, avrei bisogno di una funzione per ogni variabile globale, e quindi perdo l'utilità di averla una funzione! Forse si potrebbe risolvere se esistesse una funzione che potesse restituire oltre al valore booleano anche un intero da riassegnare alla variabile globale. Ma ovviamente non esiste questa possibilità.... vero? Andrea

Ciao Certo che si può fare! devi passare il puntatore alla variabile e non il valore contenuto nella variabile, sono molto di fretta ma se cerchi "C puntatori a variabile e funzioni" su G certamente trovi

Dino

Vedo che usi / hai usato il pascal… per fare quello che chiedi in pascal dichiareresti il parametro della funzione col var, così la variabile viene passata per riferimento invece che per valore.
in c, come dice dino, dovresti usare i puntatori.

In C++ la cosa "più giusta" è usare i reference: aggiungi una & al tipo del parametro: int&.

AndreaM: Come dici te Guglielmo, avrei bisogno di una funzione per ogni variabile globale, e quindi perdo l'utilità di averla una funzione!

Ma assolutamente no, se hai tot variabili globali queste sono visibili da tutto il codice, questo significa che una funzione ha accesso a tutte le variabili globali e puoi operarci sopra senza nessun problema, unica differenza è che invece di ritornare un singolo stato devi settare dei flag, variabili globali bool precedentemente definite, a seconda del risultato dell'elaborazione dei singoli valori.

Secondo un parere personale, in questo caso è utile passare una variabile globale come parametro per mezzo di puntatori, cosi quelle 4 righe di codice della funzione possono essere usate per tutte le variabili.
Mi sembra inutile complicare il codice per poter usare direttamente le variabili globali :slight_smile:

 /* Occhio alla precedenza degli operatori in C *
     l'operatore ++ ha precedenza sull'operatore *
     usare le parentesi per modificare la precedenza

*/

  *ACount++;  // qui incrementa l'indirizzo
  (*ACount)++; // cosi incrementa il valore della variabile

 /****************************************************/

boolean Lampeggio(int* ACount)
  { 
    (*ACount )++; // incremento di 1
    if (*ACount>30) {*ACount = 1;} // se ha superato 30 la riporto a 1
    if (*ACount>7 &&  *ACount<15) { return true; }
                                          else { return false; }
   }
   // Chiamata della funzione
      Lampeggio( &ACount); // Passo l'indirizzo della variabile

Breve guida sull’uso dei puntatori, utile per capire cosa si sta facendo in questo caso :slight_smile: :wink:

torn24: Secondo un parere personale, in questo caso è utile passare una variabile globale come parametro per mezzo di puntatori,

Puro spreco di risorse, che senso ha usare un puntatore per una variabile globale di tipo puramente numerico ? Le globali sono già disponibili localmente senza fare nulla, semplicemente usi lo stesso nome, non stiamo parlando di array dove l'uso dei puntatori è un must.

Grazie a tutti, La soluzione proposta da torn24 mi sembra la più idonea al caso, su pascal i puntatori li uso poco, ma effettivamente qui sembrano risolvere bene il problema. Implemento e provo! :) Andrea.

AndreaM: Forse si potrebbe risolvere se esistesse una funzione che potesse restituire oltre al valore booleano anche un intero da riassegnare alla variabile globale.

Ti hanno già dato mille soluzione, ma ... un po' poca teoria ... ;)

Devi andarti a vedere/studiare la differenza che c'è, in 'C', tra una variabile passata "by value" ed una passata "by reference".

Nel primo caso (by value) tu passi un valore che viene copiato nella funzione e puoi solo usarlo non essendoci legami con la variabile passata, nel secondo caso (by reference) tu, in relatà, passi il puntatore alla variabile e quindi, quando all'interno della funzione fai qualche modifica, la fai direttamente sulla variabile originale. :D

Guglielmo

astrobeed: Puro spreco di risorse, che senso ha usare un puntatore per una variabile globale di tipo puramente numerico ? Le globali sono già disponibili localmente senza fare nulla, semplicemente usi lo stesso nome, non stiamo parlando di array dove l'uso dei puntatori è un must.

Quindi tu per "sprecare meno risorse" scriveresti n funzioni per n variabili locali? :fearful: probabilmente non ho capito il senso dell'affermazione.

AndreaM: Ma il mio intento era avere una funzione unica che agisca su più variabili globali Count1, Count2, Count3 etc.. e quindi risparmiare codice e avere maggiore leggibilità!

No scrivo una sola funzione dove gestisco tutto quello che serve usando direttamente le variabili globali, dove sta scritto che tocca scrivere una funzione per ogni variabile ?

Se le variabili globali su cui lavori hanno tutte le stesse dimensioni e lo stesso scopo può essere utile radunare in un array. La funzione poi accetterà in ingresso (o prenderà una variabile globale) contenente il numero dell’elemento dell array su cui si vuole lavorare

astrobeed: No scrivo una sola funzione dove gestisco tutto quello che serve usando direttamente le variabili globali, dove sta scritto che tocca scrivere una funzione per ogni variabile ?

Continua a sfuggirmi qualcosa, ad ogni iterazione della funzione come fai a capire su quale variabile operare? operi su tutte allo stesso tempo?

... mah, ad esempio potrebbe bastare un secondo parametro che è un indice alla variabile da usare ::)

Guglielmo

AndreaM: Ma il mio intento era avere una funzione unica che agisca su più variabili globali Count1, Count2, Count3 etc.. e quindi risparmiare codice e avere maggiore leggibilità!

Allora, se la funzione deve lavorare su più variabili globali, ma a quel che intendo io dalla tua richiesta, UNA ALLA VOLTA, allora devi passare alla funzione la variabile (globale o no, non importa) come puntatore (c/c++) o come reference (c++) Se devi agire su 3 variabili globali chiamerai tre volte la funzione passando di volta in volta le tre variabili ris1=miafunz(Count1); // parametro come reference ... ris2=miafunz(Count2);

Diverso è il discorso di lavorare con variabili globali dentro alla funzione, lo puoi fare, nessuno lo vieta, ma non mi sembra il tuo caso.

gpb01: ... mah, ad esempio potrebbe bastare un secondo parametro che è un indice alla variabile da usare ::)

Guglielmo

E questo sarebbe un modo per "sprecare meno risorse"?... mah... :roll_eyes: :roll_eyes: :roll_eyes:

dinodf: E questo sarebbe un modo per "sprecare meno risorse"?... mah... :roll_eyes: :roll_eyes: :roll_eyes:

Cosa non ti è chiaro ? ? ? ... basta che le 6 variabili stiano in un array, passi l'array, l'indice e null'altro ... una sola funzione che opera sull'elemento indicato !

Guglielmo