[RISOLTO] PROGMEM

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 :slight_smile:
Si, per abitudine continuerò ad usare gli indici, anche perchè rende più leggibile il codice, almeno a me...

Grazie
Federico

>Federico66: ... dai retta, non diventare matto, studiati bene il documento allegato, vedrai che, in molti casi, ti semplifichi la vita :wink:

Guglielmo

Progmem.pdf (182 KB)

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 :slight_smile:

gpb01:
>Federico66: ... dai retta, non diventare matto, studiati bene il documento allegato, vedrai che, in molti casi, ti semplifichi la vita :wink:

Purtroppo ho il vizio di voler capire quello che leggo... ::slight_smile: :smiley:

... ma non fai prima a metter su una biblioteca on-line :slight_smile:

Grazie
Federico

Federico66:
... ma non fai prima a metter su una biblioteca on-line :slight_smile:

:smiley: :smiley: :smiley: :smiley: ... in effetti ::slight_smile:

Guglielmo

Federico66:
... ma non fai prima a metter su una biblioteca on-line :slight_smile:

E nacque la Wikielmopaedia :smiley:

[OT]

fabpolli:
E nacque la Wikielmopaedia :smiley:

:smiley:

Ho già una visione del logo :smiley:

Federico

Ecco un altro argomento "passabile" di tutorial!...