Array dinamico

Buongiorno,
avrei bisogno di un aiuto per risolvere un problema di cui non vengo a capo...
Ho un array String di gg:

String giorni = { "OFF","L", "M", "M", "G", "V", "S", "D", "ON"};

Tramite la pressione di un tasto scorro i giorni, e premendo un altro tasto dovrei copiarli in nuovo array ... ma non funziona...

.....
void loop() {

   readButtons();
   

      if (btn02Pressed) {
        giorno++;                            //contatore array giorni[giorno]
        if (giorno  > 8) giorno  = 0;
        Serial.println(giorni[giorno]);
        btn02Pressed = false;
        
 }
     
      
      if (btn03Pressed) {                 
       selez_giorni[selez_giorno] = giorni[giorno];    
       Serial.println(selez_giorni[selez_giorno]);
 selez_giorno = selez_giorno + 1;
 if (selez_giorno > 8) selez_giorno = 0;  
        btn03Pressed = false;


  }

dove sbaglio?

E' possibile dichiarare un array senza dimensione e se si... come va dichiarato?
L'selez_giorni[selez_giorno] dipende dai giorni selezionati... come posso fare per dargli la dimensione giusta?

Grazie a tutti!

Sarebbe anche possibile, ma il contesto dice che è meglio evitare. Dagli la stessa dimensione dell'array originale e usa un modo per segnare gli elementi vuoti.

In realtà, dato il contesto, l'utilizzo delle stringhe non è la scelta migliore. Potresti usare un enum, anche perché le stringhe non si copiano così facilmente come pensi ;).

.. potresti farmi un esempio su come marcare gli elementi vuoti?

Ma di possono anche eliminare?

Grazie.

Basta aggiungere un apposito valore nell’enum, e “eliminarli” vuol semplicemente dire “segnarli come vuoti”.

Tipo:

enum Giorno {VUOTO, OFF, ON, LUN, MAR, MER, GIO, VEN, SAB, DOM};

All’inizio il tuo vettore sarà:

const byte N_GIORNI = 10;

Giorno giorni[N_GIORNI];

for (byte i = 0; i < N_GIORNI; i++)
  giorni[i] = VUOTO;

Rendo l’idea?

... ehh...
Traffico da poco con arduino... devi studiare il tuo esempio per capire meglio... anche perché enum è la prima volta che lo sento

machopicho:
... ehh...
Traffico da poco con arduino... devi studiare il tuo esempio per capire meglio... anche perché enum è la prima volta che lo sento

Quelle tra parentesi graffe in pratica saranno "trasformate" dal compilatore in costanti numeriche (il primo vale 0, il secondo 1, etc.)

Inoltre evita se possibile la classe String

machopicho:
Traffico da poco con arduino... devi studiare il tuo esempio per capire meglio...

Bravo, quella è la parola chiave ;). Non potrai che trarne giovamento!

Già!
Vi ringrazio x l’aiuto…
Proverò e poi, eventualmente, ci si risente!
:slight_smile:
Thanks

...rieccomi...
Avrei bisogno di capire una cosa perchè non ho trovato nulla in merito...
E' possibile copiare, alla pressione di un tasto, un elemento di un vettore in un altro?
Ho provato in varie maniere ma non ci sono riuscito.
Questa operazione può essere compiuta SOLO con cicli for???

Grazie

È possibile fare tutto quello che vuoi. Basta saperlo fare, il che a volte non è immediato, ma nel tuo caso è piuttosto semplice: un CICLO for può servire a copiare PIÙ elementi, se devi copiarne solo uno non serve alcun ciclo. Posta il codice e spiega bene cosa fa e cosa vorresti facesse.

... Il pezzo di codice che dovrebbe fare quell'operazione è postato nel primo post.

Con btn2 scorro i gg nell'array e con btn3 seleziono il giorno desiderato inserendolo in nuovo array che conterrà i gg interessati.

Questa è l'intenzione... il risultato è però che non va... nemmeno utilizzando variabili diverse da string.

Se hai bisogno invece di tutto il codice riesco a postarlo nel pomediggio...

Ti ringrazio per l'aiuto! :slight_smile:

Posta il codice completo e che NON usa string, perché con questa non funziona di sicuro: una stringa è una serie di elementi (uno per lettera), ergo un array, ergo non si può copiare con una singola uguaglianza, per cui serve un for o la comoda funzione strcpy(), ma in questo caso continuo a consigliarti di NON usare stringhe.

…ecco qui tutto il codice…

/ Codice di gestione del RTC (Real Time Clock)
#include <DS1307RTC.h>
#include <Time.h>
// include the library code:
#include <LiquidCrystal.h>

// inizializza la libreria che gestisce gli LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Diamo un nome ai piedini connessi ai pulsanti
const int btn01Pin = 10;
const int btn02Pin = 9;
const int btn03Pin = 8;
const int btn04Pin = 7;


// variabili che contengono lo stato dei pulsanti
int btn01State = HIGH;
int btn02State = HIGH;
int btn03State = HIGH;
int btn04State = HIGH;

// variabli che contengono lo stato precedente del pulsante
int btn01Prev = HIGH;
int btn02Prev = HIGH;
int btn03Prev = HIGH;
int btn04Prev = HIGH;

// flag che segnale se un certo pulsante è stato effettivamente premuto
int btn01Pressed = false;
int btn02Pressed = false;
int btn03Pressed = false;
int btn04Pressed = false;

// cache ore e minuti
int a_hh = 0;
int a_mm = 0;
int giorno = 0;
int n_giorni = 0;
int selez_giorno = 0;
unsigned long a_ss = 0;

int giorni[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; 
int selez_giorni[7];

// stampa un numero aggiungendo uno zero prima
// dei valori inferiori a 10

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}


// legge i 4 pulsati
void readButtons() {
  btn01State = digitalRead(btn01Pin);
  btn02State = digitalRead(btn02Pin);
  btn03State = digitalRead(btn03Pin);
  btn04State = digitalRead(btn04Pin);

  if ((btn01State == LOW) && (btn01Prev == HIGH)) {
    btn01Pressed = true;
  }
  btn01Prev = btn01State;

  if ((btn02State == LOW) && (btn02Prev == HIGH)) {
    btn02Pressed = true;
  }
  btn02Prev = btn02State;

  if ((btn03State == LOW) && (btn03Prev == HIGH)) {
    btn03Pressed = true;
  }
  btn03Prev = btn03State;

  if ((btn04State == LOW) && (btn04Prev == HIGH)) {
    btn04Pressed = true;
  }
  btn04Prev = btn04State;

}

// Dato il numero di un pulsante imposta il flag
// corrispondente se è stato premuto
int buttonPressed(int btn) {
  int result = false;

  switch(btn) {

  case 1:
    if (btn01Pressed) result = true;
    break;
  case 2:
    if (btn02Pressed) result = true;
    break;
  case 3:
    if (btn03Pressed) result = true;
    break;
  case 4:
    if (btn04Pressed) result = true;
    break;
  }

  btn01Pressed = false;
  btn02Pressed = false;
  btn03Pressed = false;
  btn04Pressed = false;

  return result;
}

void setup()
{

  // mettiamo a INPUT gli ingressi dei pulsanti
  pinMode(btn01Pin,INPUT);
  pinMode(btn02Pin,INPUT);
  pinMode(btn03Pin,INPUT);
  pinMode(btn04Pin,INPUT);

  // LED 13 usato per il debug e per il cicalino
  pinMode(13,OUTPUT);

 
// Apre comunicazione con l'RTC e lo inizializza
  Wire.begin();   
  Serial.begin(9600);  // per debugging

  }

void loop() {

   readButtons();

   
      if (btn02Pressed) {
        giorno++;     
        if (giorno  > 8) giorno  = 0;
        Serial.println(giorni[giorno]);
        btn02Pressed = false;
        
 }
     
      
      if (btn03Pressed) {
                
        selez_giorni[selez_giorno] = giorni[giorno];
         
        Serial.println(selez_giorni[selez_giorno]);
 selez_giorno = selez_giorno + 1;
 if (selez_giorno > 8) selez_giorno = 0
         
        btn03Pressed = false;


  } 
           
  if (btn01State == LOW) {
  Serial.print(selez_giorni[selez_giorno]); 

   }
    }

Grazie!