Variabili Globali e Funzioni

Ho navigato un po' trovando argomenti che pero' non mi hanno chiarito il dubbio

Dovrei fare una funzione che metta HIGH un flag ogni decimo di secondo
Premetto che volevo fare una funzione perche cosi' la metto su un file a parte e la dimentico

Di conseguenza questa funzione avra' un tempo iniziale da confrontare con millis
Il valore del tempo iniziale deve conservarsi e non cancellarsi all'uscita della funzione

Pari pari la funzione creera' l'impulso visibile da tutto il programma

Nella mia scarsa conoscenza del C sono andato a vedere dove Luca o Leo72 mi hanno consigliato per altri quesiti

Leggo :

Le variabili globali si definiscono al di sopra della funzione main(),
nel seguente modo:

short number,sum;
int bignumber,bigsum;
char letter;
main()
{
...
}

Altrove scrivo global int a = 0

Ma nello sketch piu' che dove , come definisco una variabile globale ??
Mi vien da capire che tutte le variabili definite all'inizio dello sketch sono globali

NON globali saranno quelle definite nel corpo programma , quindi .

Datemi un aiutino :smiley:
Grasssie

brunol949:
Ma nello sketch piu' che dove , come definisco una variabile globale ??

Il Come è proprio il Dove.
Varabili definite dentro una qualunque funzione sono Locali alla funzione e visibili solo dalla funzione.
Variabili definite fuori da qualunque funzione, ed in genere nello sketch principale, diventano variabili globali che possono essere "viste" da qualunque funzione.
http://programmazione.html.it/guide/lezione/1156/visibilita-delle-variabili-e-delle-costanti/

Ciao
QP

QuercusPetraea:
Variabili definite fuori da qualunque funzione, ed in genere nello sketch principale, diventano variabili globali che possono essere "viste" da qualunque funzione.

Quindi il mio
int a = 0 ;
definito in testa allo sketch sara' utilizzabile dentro una void o comunque la a scritta all'interno della void sara' visibile a tutto lo sketch
Ho capito giusto ??

brunol949:
Quindi il mio
int a = 0 ;
definito in testa allo sketch sara’ utilizzabile dentro una void o comunque la a scritta all’interno della void sara’ visibile a tutto lo sketch
Ho capito giusto ??

Sì.
Si parla di “spazio dei nomi” ed indica la visibilità di una variabile.
Esempio:

byte a=0;
void setup() {
  byte b=0;
  a++; //corretto
  b++; //corretto
  for (byte c=0; c<5; c++) {
    b++; //corretto
    a++; //corretto
  c++; //ERRATO - era del for precedente
}

void loop() {
  byte e=0;
  a++; //corretto
  b++; //ERRATO - era del setup()
  for (byte d=0; d<5; d++) {
    a++; //corretto
    e++; //corretto
    prova();
  }
}

void prova() {
  d++; //ERRATO - era del for di loop()
  a++; //corretto
  e++; //ERRATO - era del loop()
}

Si, è giusto: se int a = 0; l'hai scritto in testa allo sketch sarà utilizzabile in tutte le funzioni che metterai e non solo le void.

leo72:
Sì.
Si parla di "spazio dei nomi" ed indica la visibilità di una variabile.
Esempio:
.....

Da archiviare per futura memoria :smiley:
Direi chiarissimo

Grazie

leo72:

brunol949:
Quindi il mio
int a = 0 ;
definito in testa allo sketch sara’ utilizzabile dentro una void o comunque la a scritta all’interno della void sara’ visibile a tutto lo sketch
Ho capito giusto ??

Sì.
Si parla di “spazio dei nomi” ed indica la visibilità di una variabile.
Esempio:

byte a=0;

void setup() {
  byte b=0;
  a++; //corretto
  b++; //corretto
  for (byte c=0; c<5; c++) {
    b++; //corretto
    a++; //corretto
  }
  c++; //ERRATO - era del for precedente
}

void loop() {
  byte e=0;
  a++; //corretto
  b++; //ERRATO - era del setup()
  for (byte d=0; d<5; d++) {
    a++; //corretto
    e++; //corretto
    prova();
  }
}

void prova() {
  d++; //ERRATO - era del for di loop()
  a++; //corretto
  e++; //ERRATO - era del loop()
}

Sono ancora qua e la questione mista Globale Char

All'interno di una if c'e'
char FileToOpen[] = "IPL.txt";

per aprire un secondo file ho divuto scrivere 'sta sega mentale
FileToOpen[0] = 'I';
FileToOpen[1] = 'P';
FileToOpen[2] = '.';
FileToOpen[3] = 't';
FileToOpen[4] = 'x';
FileToOpen[5] = 't';
FileToOpen[6] = '\0';

E' dentro lo stesso if e quindi non posso dichiararlo una seconda volta

Io vorrei che quel FileToOpen fosse globale e quindi dichiarato in testa allo sketch

E successivamente poterci scrivere i nomi dei file da richiamare ( che sono 4 5 )

help me

Grasssie

Scusa,
potresti postare il codice completo? :expressionless:

Una cosa del genere:

char * nomeFile;

void setup(){}

void loop() {
  nomeFile="mario";
  nomeFile="beppe";
}

Dichiari la variabile come un tipo puntatore a char, e poi puoi modificarla a runtime.
Se dichiari un array di char normale, poi potresti avere dei problemi se la lunghezza dei nome è diversa perché gli array non possono variare la loro dimensione.

Mi sa che fanno al caso tuo le variabili statiche in quanto sono visibili solo all'interno della funzione ma hanno la vita di una variabile globale, ovveronascono all'avvio per programma e muoiono al termine dello stesso. Nel variabili dichiarate all'interno di una funzione vendono distrutte all'uscita della stessa e non fanno al caso tuo.

http://arduino.cc/en/Reference/Static

leo72:
Una cosa del genere:

char * nomeFile;

Questo ovviamente funziona
Grazie per la precisa e tempestiva risposta

Sempre in tema dovrei ricevere una stringa e tirarne fuori gli ultimi 4 caratteri
Sono andato a leggermi il post di Danielas
Ne deduco che devo accumulare e contare i caratteri fino al \0
Poi recuperare quelli in posizione lunghezza -4 -3 -2 -1
Dovrei metterli in un char * FineStringa per poterli agevolmente confrontare con if o switch

Mi suggerisci come arrivarci ?
Ti ringrazio

A proposito di variabili globali e locali, ecco un bel pezzetto di codice.

int x; //globale

void setup() {
 Serial.begin(9600);
 x=100;
}

void loop() {
  for(int x=0;x<10;x++){ //locale
    Serial.println(x); //locale
  }
  Serial.println(x); //globale
  delay(10000);
}

:stuck_out_tongue:

Sono arrivato a questo punto dell'opera
http://arduino.webveneto.net/energy_control/

Funziona e si vede da qui http://ardupub.webveneto.net/ ( il link e' disattivato / appena definitivo lo ripristino )

Volevo spostare alcune parti ma poi cado nel baratro delle definizioni
EthernetClient client = server.available(); e' nel loop e quindi
x = (htmlFile.read());
client.print(char(x));
devo tenerlo nel loop altrimenti client mi viene segnalato
Per questioni di ordine volevo metterlo in una void su altro file
Lo sketch intero e' recuperabile al link piu sopra

Sarebbe stato opportuno fare in modo che l'html una volta caricato richiedesse dei valori ... ma non ne sono capace
Memoria permettendo andro' ad intercalare pezzi di html con le variabili , suppergiu come adesso

Metto insieme un file html un po' "tabellato" , lo spezzo in x file e poi lo trasmetto pezzo .. variabile .. altropezzo ... variabile e avati cosi'

Purtroppo le mie capacita' non mi consentono piu' di tanto