Array ed operatore %

scusate l'ignoranza, mi spiegate come funziona questa roba

int pippo[3] = {2200, 1900, 2300};

for (int i = 11; i >= 0; i--) {
int x = pippo[i % 3];
 }

Ho messo un bel print ed il risultato e' questo

2300
1900
2200
2300
1900
2200
2300
1900
2200
2300
1900
2200

Quindi noto che x diventa di volta in volta uno dei tre valori dell'array, e piu' precisamente partendo dall'ultimo verso il primo (indice 2 dell'array, poi 1 e poi 0 ). Serve a questo la percentuale ? non c'entra nulla con l'operatore per avere il resto di un intero con la virgola ?
Grazie in anticipo :slight_smile:

11 : 3 fa 3 con il resto di 2 quindi x = pippo[2];
10 : 3 fa 3 con il resto di 1 quindi x = pippo[1];
9: 3 fa 3 con il resto di 0 quindi x = pippo[0];
8 : 3 fa 2 con il resto di 2 quindi x = pippo[2];
7 : 3 fa 2 con il resto di 1 quindi x = pippo[1];
6 : 3 fa 2 con il resto di 0 quindi x = pippo[0];
ecc ecc

sei un grande :slight_smile:
karma+1

L' operatore % o modulo Ti da come risultato il resto della divisione.
In questo esempio ricavi dalla variabile i un numero da 0 a 2 per l' indice dell'array.

Ciao Uwe

yes,
come puoi leggere nella domanda iniziale sapevo a cosa serviva il simbolo della percentuale, ma nessun neurone si era connesso al punto da farmi vedere l'uso in questo caso. Avevo anche notato che l'uso che ne faceva era quello di selezionare i tre indici nell'array, partendo dal 2 per arrivare allo 0, ma ancora non vedevo la luce.
Pelletta mi ha rischiarato la mente :slight_smile:

Comunque una cosa e' leggere il codice una cosa e' scriverlo, io non avrei mai pensato ad una cosa del genere per selezionare i dati nell'array. E' una tecnica comune o uno spunto di inventiva personale ?

E' sicuramente un trucco inventato dall'autore del codice per semplificare le operazioni.
Sicuramente avrebbe dovuto usare un altro indice per far sì di scorrere gli elementi dell'array durante il ciclo principale. Al posto di qualcosa tipo il codice seguente:

byte j = 0;
for (int i = 11; i >= 0; i--) {
    int x = pippo[j];
    j++;
   if (j > 2) then j = 0;
}

Si è inventato quel trucchetto lì. E' una cosa che fo spesso anch'io quando mi serve un trucco per una semplificazione.
Ovviamente però se devi dare il codice ad altri poi possono nascere delle curiosità ma anche delle incomprensioni perché bisogna andare a capire cos'è che voleva fare l'autore :stuck_out_tongue_closed_eyes:

grazie dell'approfondimento leo,

restando in tema array cosa rappresentano i numeri che mi vengono stampati di un array vuoto ?

int test[5];
  for (int i = 0; i < 5; i = i + 1) {
    Serial.print(test[i]); 
 }

mi stampa ad esempio
10450430751

poi se resetto il micro mi stampa numeri diversi
1045045164
104504510

roba legata ai puntatori dell'indice credo, va a pescare fuffa nelle celle di memoria, mi aspettavo errori in compilazione

Semplicemente i valori che trova all'avvio il programma nella SRAM ... dato che tu non l'hai inizializzata ci sono dentro valori casuali.

E perché il compilatore dovrebbe dare errore ? :astonished:

Non c'è alcun errore di sintassi ... gli errori di logica ... sono cavoli tuoi mica del compilatore :grin: :grin: :grin:

Guglielmo

Una variabile ha 2 stati vitali:

  • dichiarata
  • dichiarata ed inizializzata

Se la dichiari e basta, il compilatore semplicemente va a riservare lo spazio in RAM ma non ci mette dentro nessun valore.
Se la dichiari ed inizializzi, come nell'esempio che avevi postato prima (int pippo[3] = {2200, 1900, 2300}:wink: il compilatore inserisce già quei numeri nelle rispettive celle.
Quindi una variabile dichiarata ma non ancora usata può contenere quello che c'era nella RAM usata al momento dell'operazione, quindi valori senza senso.

grazie della conferma

x Guglielmo: ma come, gia' Microsoft Word 20 anni fa aveva il correttore non solo ortografico, ma grammaticale e logico, l'arduino Ide dovrebbe indicare in rosso: "Che xxxxx stai tentando di fare ? Hai mai pensato alla zappa come alternativa alla programmazione !" :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Che c'entra il correttore ortografico col compilatore (non c'entra l'IDE in questo caso)? :stuck_out_tongue_closed_eyes:
Anche con Word tu puoi scrivere
"pistola canotto luna sul sole viaggiando sul fuoco" e non ti segna errori, sono tutte parole valide... peccato che siano messe insieme senza senso :stuck_out_tongue:
Un conto è la sintassi, un conto è la logica del programma. I comandi possono essere scritti in modo corretto... qui però non c'è un sistema operativo dietro che controlla che il tuo programma non esca dall'area di memoria assegnata e, nel caso lo faccia, lo secchi all'istante. Qui in teoria puoi anche provare ad accedere alla cella 23000 della RAM, non c'è ma istruzione se sintatticamente corretta è valida :stuck_out_tongue_closed_eyes:

certo, voleva essere una battuta,
comunque quando lavoravo per una societa' e tra le varie cose gestivo una rivista word davvero aveva opzioni di correzione grammaticale, non solo ortografico. Sulla frase da te scritta ti uscivano una marea di errori e suggerimenti. Per capirci se sbagliavi il condizionale lui ti avvisava.
Credo fosse un'opzione a pagamento, parliamo di MIcrosoft Word per Mac, avevo un Quadra qualcosa

Uh, allora si torna agli inizi degli anni '90, i Quadra sono di quel periodo.
Ah già, lo avevi detto "20 anni" :wink:

x iscrizione

Il compilatore ti dice se quello che stai scrivendo è sintatticamente scorretto ma non semanticamente.

Un esempio: io voglio fare

int c;
c = a + b;

un errore di sintassi può essere questo:

int c;
c = a + ;b;

In quanto è, secondo le regole del C++, sbagliato mettere quel ; prima di b. Invece non ti da nessun errore se invece scrivi

int c;
c = a + 'b';

In quanto lui prende il carattere b, lo converte nella sua corrispondente codifica ascii, lo somma ad a e mette il risultato in c. E' un'operazione del tutto lecita, ma non è quello che volevi fare, ma il compilatore non può sapere quello che volevi fare... :wink:

Un esempio di utilizzare i caratteri come numeri è quello di voler verificare se un carattere è maiuscolo o minuscolo, e si può fare così:

char c;
if (c >= 'A' && c <= 'Z') {  //Se c è un carattere maiuscolo
  ...
};

bello, e' piu' facile da ricordare rispetto ad usare i corrispondeti ascii,
karma+1 :slight_smile:

Quel ; mi ricorda molto l'errore visto in uno sketch ieri sera:
if (test); {
...codice...
}

Il codice compila senza errori... MA c'è il punto e virgola dopo il test e prima della graffa. Il compilatore termina l'istruzione dell'if al segno ";" e poi il blocco di codice dopo viene eseguito sempre perché diventa indipendente dall'if.

Testato:
bello, e' piu' facile da ricordare rispetto ad usare i corrispondeti ascii,
karma+1 :slight_smile:

Bello, non lo sapevi? :wink:

non lo sapevo, non sono un programmatore :wink: