rompicapo aRRAY...

Dopo aver metabolizzato il millis devo metabolizzare l’ARRAY per due progetti separati.
Con la porzione di codice che segue sto cercando di memorizzare una serie di dati generati internamente al ciclo al verificarsi di un evento (nel caso specifico velocità rilevate e nel secondo saranno temperature).
Ho provato in più modi…riesco a lanciare la stampa seriale ed azzerare il contatore dopo “n” volte ma la stampa a seriale mi visualizza la lista vuota nelle prime posizioni dandomi invece solo l’ultimo valore…dove sbaglio?

   contatore2 ++;
    for (int num = 0; num < 5; num++)
    {
      valori2[4] = valore;
    }
    for (int b = 0; b < 5; b++)
    {
     if (contatore2 == 5)
     {
      Serial.println(valori2[0]);
      Serial.println(valori2[1]);
      Serial.println(valori2[2]);
      Serial.println(valori2[3]);
      Serial.println(valori2[4]);
      contatore2 = 0;
    }  
    }
      memset(valori2, 0, sizeof(valori2)); // azzera l'arra dopo n volte

ciao…un possibile problema è qua:

    for (int num = 0; num < 5; num++)
    {
      valori2[4] = valore;
    }

cioè salvi sempre alla posizione 5 dell’array valori

Scusa, ma con questo for cosa vorresti fare ? ? ?

for (int num = 0; num < 5; num++)
   {
     valori2[4] = valore;
   }

… perché NON vedo utilizzato l’indice e vedo assegnata, per 5 volte, la stessa variabile ‘valore’ al quinto elemento (si conta da 0 quindi 4 è il quindo elemento) di valori2 ::slight_smile:

Se vuoi riempire tutti e 5 gli elementi di valore2 con lo stesso 'valore, allora il tuo FOR dovrà essere …

for (int num = 0; num < 5; num++)
   {
     valori2[num] = valore;
   }

Guglielmo

P.S.: mi sono sovrapposto con ORSO2001

prova a spostare fuori dal for la if che stampa i valori

in primis...con il ciclo for salvi la variabile valore nelle posizioni dell'array...ma in tutte ci sarà lo stesso valore in quanto nel for non aggiorni tale variabile.
dopo...con l'ultimo pezzo di codice che hai postato, se contatore2 ha valore di 5 salvi nella prima posizione dell'array il valore della variabile valore...stampi l'array, che avrà nelle posizioni 2,3,4,5 valore "0" in quanto precedentemente l'hai azzerata con memset...e porti contatore2 a 0 e quindi non ti stamperà altro.

Ci spieghi COSA vuoi mettere in quell'array ? ? ?

Perché, attualmente, come ti è stato detto ci metti 5 volte la stessa cosa !!!

Guglielmo

E allora il valore nell'array NON lo devi mettere così, ad ogni tiro, dopo che hai il valore, lo metti in un elemento dell'array e dopo incrementi l'indice che indica l'elemento dove lo metti.

Guglielmo

Se ti agiti non funziona meglio, eh! :slight_smile:

... e se metti tutto il programma ti diciamo dove sbagli.

ho fatto una passeggiata sul lmare…
Dunque mi interessa solo questa parte di codice in quanto devo integrarla in due altri programmi visto che le array (e millis) stanno dappertutto come il prezzemolo.

Nello specifico il programma TEST è questo - ora è pasticciato - e gira solo su seriale che sto testando appunto solo il codiece interessato.

Output seriale è questo. I primi 5 numeri sono i valori reali quelli dopo “elenco tiri” l’output su seriale:

    // ----------- prova record ------

    contaSpari2 ++;
    int num;
    tiri2[num] = mpsSpeed;
    num = num + 1;
    //for (num = 0; num < 4; num++)
    //{  
    if (contaSpari2 == 5)
    {
      Serial.println("elenco tiri");
      Serial.println(tiri2[0]);
      Serial.println(tiri2[1]);
      Serial.println(tiri2[2]);
      Serial.println(tiri2[3]);
      Serial.println(tiri2[4]);
      contaSpari2 = 0;
  }
//}
    // memset(tiri2, 0, sizeof(tiri2)); // azzera l'array dopo 5 tiri
  }    // end else/if t2-t1
}      // end loop

bah

prova a ragionare su quello che deve fare il programma

  1. sparo
    2)memorizzo il valore nell'array
  2. sparo di nuovo
  3. memorizzo nell'array
    5)sparo...

tu al contrario fai
1)sparo
2)memorizzo nell'array
3)memorizzo nell'array
4)memorizzo nell'array
5)...
quindi vedi che nel for ci deve essere anche tutto l'ambaradan dello sparo, calcoli vari etc. etc...

uttavia non capisco come mai due valori me li memorizza e mostra....

sicuramente qui hai un problemino ... :slight_smile:

   // ----------- prova record ------

    contaSpari2 ++;
    int num;
    tiri2[num] = mpsSpeed;
    num = num + 1;

ogni volta che fai il giro del loop dichiari una nuova variabile num ( se scrivi int num, dichiari una nuova variabile di tipo intero di nome num) ed essendo nuova vale zero e quindi all'array tiri2[num] (num vale 0 tutte levolte)
assegni il valore del tiro
per cui l'unico valore assegnato all'array tiri2 è il valore tiri2[0] dove troverai l'ultimo sparo e in tutte le altre posizioni troverai zero...

Ciao Patrick...non sono ancora esperto e come hai detto tu bisognava ragionarci. Lo avevo pensato ma non avevo provato a spostare la variabile (sono un pò frettoloso).
Ora l'ho spostata nella sezione dichiarazione variabili e l'ho azzerata dopo la stampa a seriale. Funziona!!!

Grazie ancora a tutti. Ora anche le array sono meno ost(r)iche ed ho finalmente capito come inserire i dati ed utilizzarli 8) :grin: :sunglasses: :grin: :sunglasses: :grin: :sunglasses:

Patrick_M:
bah

prova a ragionare su quello che deve fare il programma

  1. sparo
    2)memorizzo il valore nell'array
  2. sparo di nuovo
  3. memorizzo nell'array
    5)sparo...

tu al contrario fai
1)sparo
2)memorizzo nell'array
3)memorizzo nell'array
4)memorizzo nell'array
5)...
quindi vedi che nel for ci deve essere anche tutto l'ambaradan dello sparo, calcoli vari etc. etc...

E' esattamente quello che intendevo e Patrick_M ti ha fatto capire il perché.
Ecco perché avevo bisogno di vedere quando e come "sparavi", altrimenti si vedeva solo che memorizzavi cinque posizioni ma con una sola lettura...

Poi l'array probabilmente ti serve solo in lettura perché

INIZIO

  • sparo,
  • memorizzo valore cella X
  • incremento X
  • torno a INIZIO

...ciao Patrick, devo dire che avevo agito in fretta facendo un errore che Gug NON mi avrebbe perdonato!!!!
Era ovvio che azzerando la variabile mi memorizzava solo l'ultimo valore. Si trattava di una variabile globale.
Ora tutto funziona...finalmente ho capito pure queste array!!!..però una cosa strana me l'ha fatta. Stamattina con kl'array dimensionata a 4 valori (quindi 5 posizioni) mi visualizzava correttamente i tiri...oggi pomeriggio no!...ho aggiunto una posizione quindi xxx[5] e non più [4] ed ha ripreso a mostrare i 5 tiri....mah :slight_smile: >:( :frowning: :o :confused:

PS: come mai hai la foto con Samantha?

... oh, ma un manuale di 'C' te lo vuoi comprare e te lo vuoi studiare ? ? ? :smiling_imp:

mioArray[4] è un array di 4 elementi che vanno da 0 a 3 e NON il contrario !!! Quindi, se ti serve menorizzare 5 misure, devi dimensionare l'array di 5 elementi che vanno da 0 a 4 !

Guglielmo

vince59:
...ciao Patrick, devo dire che avevo agito in fretta facendo un errore che Gug NON mi avrebbe perdonato!!!!
Era ovvio che azzerando la variabile mi memorizzava solo l'ultimo valore. Si trattava di una variabile globale.
Ora tutto funziona...finalmente ho capito pure queste array!!!..però una cosa strana me l'ha fatta. Stamattina con kl'array dimensionata a 4 valori (quindi 5 posizioni) :o :o mi visualizzava correttamente i tiri...oggi pomeriggio no!...ho aggiunto una posizione quindi xxx[5] e non più [4] ed ha ripreso a mostrare i 5 tiri....mah :slight_smile: >:( :frowning: :o :confused:

PS: come mai hai la foto con Samantha?

l'array dimensionato a 4 ha 4 posizioni più il terminatore \0 :wink:
dal reference

Creating (Declaring) an Array

All of the methods below are valid ways to create (declare) an array.

int myInts[6];
int myPins = {2, 4, 8, 3, 6};
int mySensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";

You can declare an array without initializing it as in myInts.
In myPins we declare an array without explicitly choosing a size. The compiler counts the elements and creates an array of the appropriate size.
Finally you can both initialize and size your array, as in mySensVals. Note that when declaring an array of type char, one more element than your initialization is required, to hold the required null character.

edit: Preceduto da Guglielmo il dito più veloce che c'è :smiley:

…porca miseria avevo memorizzato male io nella mia RAM…grazie Gug delle tue costruttive cazziate!!! eppure l’avevo letto due/tremila volte PURE al bagno nel mio manuale di C :confused: :confused: :confused: :confused:

Cazziato da Gug…il più veloce e feroce cazziatore del web!!! :confused: :confused: :confused: :confused:

PS: però se non sbaglio me lo faceva solo su visualizzazione LCD mentre su serial mi dava 5 valori…è possibile o il mio Arduino è posseduto da qualche “diavoletto”?

vince59:
.....

PS: come mai hai la foto con Samantha?

La foto con Samantha Cristoforetti è la mia.
Passava di qua e ci siamo conosciuti: persona molto speciale!

La tua, invece, non si capisce bene chi sia ... :smiley: