Problema con gli array

Buonasera a tutti, ho una curiosità; avendo un array tipo:

char scritta[6] = {111, 97, 105, 67, 18};

normalmente con la seguente istruzione

scritta[1]

ottengo il valore di “97”.
E’ possibile, avendo un valore di “97” ottenerne la posizione (“1”) nell’array?
Saluti
Enrico

Gli array iniziano sempre dall'elemento zero. :slight_smile:
Puoi mettere un valore zero prima di 97, oppure mettere 97 come primo elemento e poi usare scritta[n-1], dove con n=0 accede a scritta[0].

Già, il "97" è il secondo elemento.

Io vorrei infatti ottenere il numero che corrisponde alla sua posizione negli array.

Ciao
Enrico

Ciao :slight_smile:
Gianluca

enrico24:
E’ possibile, avendo un valore di “97” ottenerne la posizione (“1”) nell’array?

Cioè, se ho ben capito, dato un valore tu vuoi sapere in che posizione dell’array esso si trova?

Se è così ci sono vari metodi, alcuni molto veloci (se, come nel tuo esempio gli elementi occupano un solo byte), altri un po’ più lenti … ti interessa un caso generale o il tuo caso specifico ?

Guglielmo

Esattamente!

Si, ma non hai risposto alla domanda ... :smiley:

Guglielmo

Cerco di spiegarmi meglio.
Voglio poter inviare ad arduino una scritta di lunghezza indeterminata fatta sulla seriale che va trasferita su una matrice 8x8 di n elementi. Si tratta quindi di implementare (a razionalizzarlo cercherò di farlo in seguito!) questo semplice sketch;

/*
 * Prova per scritte scorrevoli su dispay 8x8
 */


 
#include "LedControl.h"
#include "caratteri.h"


#define pinCLK 10
#define pinCS 9
#define pinDIN 8


#define _el 4  // numero di matrici 8x8 


char scritta[6] = {111, 97, 105, 67, 18};
int _display = 0;
int s = 0;


LedControl lc = LedControl(pinDIN, pinCLK, pinCS, _el);


void setup() {
  Serial.begin(9600);
  Serial.println("Scritte scorrevoli su dispay 8x8 - Prova_05_scorre");
  for (int i = 0; i < _el ; i++) {
    lc.shutdown(i, false); // Wake up displays
    lc.setIntensity(i, 5); // Set intensity levels
    lc.clearDisplay(i);  // Clear Displays
  }
}


void loop() {
  if (_display > (_el - 1)) {
    _display = (_display % _el) ;
  }


  for (_display ; _display < _el; _display++) {
    for (int r = 0; r <= 8; r++) {
      lc.setRow (_display, r, flipByte(font[scritta[s]][r]));
    }


    for (int r = 0; r <= 8; r++) {
      lc.setRow ((_display + 1), r, flipByte(font[scritta[(s + 1 )]][r]));
    }


    for (int r = 0; r <= 8; r++) {
      lc.setRow ((_display + 2), r, flipByte(font[scritta[(s + 2 )]][r]));
    }


    for (int r = 0; r <= 8; r++) {
      lc.setRow ((_display + 3), r, flipByte(font[scritta[(s + 3 )]][r]));
    }
   
    s++;
    if (s > _el) {
      s = 0;
    }
  }
 delay(400);
}

Dove scorre la parola “Ciao”.

Saluti
Enrico

Allego anche il file:

Prova_05_scorre.ino (1.3 KB)

Quel che tento di fare:

  • ho un array bidimensionale che mi accende le lettere (tipo il "caratteri.h") e viene "chiamato" da un numero,

  • un secondo array con le lettere dell'alfabeto

  • leggo in sequenza le singole lettere che ho scritto nella seriale,

  • estraggo la loro posizione nel secondo array

  • utilizzo il numero ottenuto per individuare il carattere nel primo array

Spero di essere riuscito a spiegare il mio ragionamento logico (che poi riesca a metterlo in pratica è un'altra cosa!), se ancora qualcosa non fosse chiara .......

Saluti
Enrico

SE e ripeto SE devi cercare un char in un array di char, c’è una funzione apposta in <string.h> che, come al solito, fa parte di AVR libc, la funzione strchr()

Guglielmo

P.S.:raccomando solo che l’array di char dove cercare sia terminato con il valore 0x00 altrimenti NON sa dove fermarsi a cercare.

Però non capisco il perché del doppio array. Non basta un unico array dove l'indice corrisponde già all'elemento cercato?
Se hai solo valori ascii dovresti riuscire.