Ciao,
in realtà non è proprio legato a PROGMEM, comunque stavo studiando come utilizzare PROGMEM, visto che per prossimo progetto ho parecchi array di int costanti.
Mi è chiaro che le chiamate del tipo pgm_read_xxx_near vanno fatte passando l'indirizzo dell'elemento dell'array, quindi in base alle mie conoscenze ho scritto:
#define COUNT_ITEM(x) sizeof(x) / sizeof(x[0])
const PROGMEM int h_una[] = { 280, 281, 282};
void setup() {
Serial.begin(9600);
unsigned int l;
for (byte c = 0; c < COUNT_ITEM(h_una); c++) {
l= pgm_read_word_near(&h_una[c]);
Serial.print(c);Serial.print(":");Serial.println(l);
}
}
void loop() {}
Perfetto, sembra funzionare tutto, ma quando vado a vedere il reference, trovo invece scritto:
for (byte k = 0; k < 5; k++) {
displayInt = pgm_read_word_near(charSet + k);
Serial.println(displayInt);
}
Domanda:
immagino che analogamente a "&h_una
", anche "charSet + k" torni un indirizzo, ma non mi è chiaro!
k fa slittare l'indirizzo di charSet di 0,1,2,... byte, ma int è di due byte, ne deduco che k fa slittare 0,1,2, ... elementi.
Sono un po' confuso :confused: Sbaglio?
TIA
Federico
E' legato all'aritmetica dei puntatori, nell'esempio del reference charSet è un array, quindi usandolo tal quale viene sfruttato il puntatore all'elemento zero dell'array, sommando un valore 1,2,3 a questo il compilatore che conosce la dimensione di ogni singolo elemento somma la quantità corretta per posizionarsi sull'elemento successivo. Se l'elemento zero parte dalla posizione 1234 se hai:
array[0]
viene restituito il contenuto di quella posizione, se hai:
array
ti viene restituito il puntatore alla sua posizione in memoria (1234)
facendo
array + 1
se in questo contesto int vale due byte il compilatore restituisce 1234+2 = 1236 che è la posizione di array[1]
Nessuno ti vieta di usare la forma
&array[1]
che resituisce 1236, anzi in alcune tipologie di vincoli di progetto (Es. MISRA o le regole del BARR Group) viene indicato di non accedere agli array in modo differente dagli indici per evitare errori usando i puntatori, se ritrovo velocemente la sezione la posto
fabpolli:
E' legato all'aritmetica dei puntatori, nell'esempio del reference charSet è un array, quindi usandolo tal quale viene sfruttato il puntatore all'elemento zero dell'array, sommando un valore 1,2,3 a questo il compilatore che conosce la dimensione di ogni singolo elemento somma la quantità corretta per posizionarsi sull'elemento successivo...
Ti ringrazio, quindi avevo dedotto correttamente
Si, per abitudine continuerò ad usare gli indici, anche perchè rende più leggibile il codice, almeno a me...
Federico66:
Si, per abitudine continuerò ad usare gli indici, anche perchè rende più leggibile il codice, almeno a me...
Non riesco a trovare la sezione che indica di usare gli indici, comuqneu lo scopo è quello di prevenire possibili bug e rendere il codice più comprensibile