[Risolto]:Dichiarazione array di dimensione variabile con if-else e switch-case.

Ciao ragazzi,
ho utilizzato un if-else per decidere la dimensione di un array e il codice funziona:

void setup() {
  byte x=0;

  if(x==0)
  {
    int array[5];
  }
  else if(x==1)
  {
    int array[10];
  }
  else
  {
    int array;
  }
  
}

void loop() {
 
}

Per questioni di un maggiore ordine del mio codice preferirei utilizzare uno switch-case, ma ottengo un errore di conflitto tra le dichiarazioni. Mi sapete spiegare il motivo? Ho sempre pensato che le due strutture fossero equivalenti. L'unica differenza è che lo switch case non può essere usato con i float.

void setup() {
  byte x=0;
     
  switch(x)
  {
    case 0:
      int array[5];
      break;
    case 1:
      int array[10];
      break;
    default:
      int array;
      break;
  }
}

void loop() {
 
}

Domanda ...
... quell'array, definito in quel modo in setup(), è una variabile LOCALE che esiste solo dentro al setup(); tu cosa ci devi fare? lo devi usare solo li dentro? Perché così NON puoi usarlo fuori ... ::slight_smile:

Guglielmo

Ho scritto solamente una versione ridotta del codice per enfatizzare il problema.
In realtà sto utilizzando un sensore contenente un accelerometro, un giroscopio e un magnetometro.
In base alla modalità di funzionamento posso leggere i dati di uno solo dei sensori, oppure di 2 di essi o di tutti e tre.
La dichiarazione dell'array l'ho quindi fatta dentro il loop() e non nel setup ().
L'array deve contenere i registri che leggo. Per cui vorrei cambiare la dimensione in base alla modalità di funzionamento.

ciao...sarebbe utile se posti l'errore che ti da...e magari il codice...

Direi che potresti usare un metodo ancora più pulito, che NON ti richiede ne IF ne SWITCH ... una funzione dedicata alla lettura a cui passi, come parametro, le dimensioni dell'array che viene quindi creato, ad ogni chiamata, delle giuste dimensioni e poi distrutto.

Faccio un esempio:

void leggiMioSensore( int dimensioniArray ) {
int mioArray [ dimensioniArray ];
....
....
....
}

... in questo modo, la chiami con la dimensione che ti serve, fai quello che devi fare e esci. Ad ogni chiamata l'array viene creato con le dimensioni che gli passi :wink:

Guglielmo

Il codice l'ho scritto nel primo post.
L'errore che ottengo è lo stesso sia se uso il codice del vero programma sia la versione ridotta che ho scritto per discuterne.

Il messaggio di errore è il seguente:
"conflicting declaration 'int array[10]' ".

Ho chiaro il concetto di variabile locale che esiste solamente dentro il setup(), o il loop() o una qualsiasi altra funzione che creo.
Probabilmente, mi sfugge qualcosa sul funzionamento dello switch.

Contrariamente a quanto accade con l'if then else in cui il compilatore riserva quanto presente tra le graffe del then e dell'else uno spazio delle variabili proprio per cui o prende una strada o l'altra e quindi non può esserci conflitto nella dichiarazione i case di uno switch sono etichette a cui il compilatore fa un puntamento diretto, quindi tutte le etichette dello switch appartengono al medesimo spazio generando un conflitto di definizione, per risolvere dovresti isolare ogni contenuto di ogni case tra graffe (in c++ funziona in c non ne sono sicuro) ma perderesti comunque la visibilità dell'array al di fuori del singolo case ovvero:

swithc(x)
{
  case 1:
  {
    int y[10];
  }
  break;
  case 2:
  {
    int y[20];
  }
  break;
}

y[0] = 1; //ERRORE qui l'array non è definito

Senza le graffe è come se tu eseguissi una cosa del tipo:

int y[10]:
jump 100;
int y[20]:
jump 100;

100:
y[0]=1;

tranne che lo spazio dei nomi di y non è valido all'esterno del singolo case
Perdonate l'uso della pseudo istruzione jump che serve solo a rendere l'idea e.. a non usare il goto :slight_smile:

Concordo con la proposta di gpb, più pulita, ma prova banalmente a mettere i vari case tra parentesi graffe.

EDIT: Anticipato da fab!

La soluzione di Guglielmo è sicuramente la più ordinata.
Inserendo le graffe tra i vari casi del case il codice funziona.
Grazie a tutti dell'aiuto.