Ciao gente,
non conosco bene tutto il linguaggio e le opzioni di Arduino. Cerco una funzioncina semplice che mi trova il minimo di un array di long.
Ho visto una come questa, ma non la compila
int maximumValue(apvector<int> &array)
// ^^^^^^^^^^^ qui c'è qualcosa che non capisco
{
int length = array.length( ); // establish size of array
//^^^^^^^^^ non esiste tale funzione in Arduino (forse si usa sizeof() )
int max = array[0]; // start with max = first element
for(int i = 1; i<length; i++)
{
if(array[i] > max)
max = array{i};
}
return max; // return highest value in array
}
Comunque il volume dell' array non è superiore ai 20 e quindi un byte mi potrebbe bastare.
Sono dal cellulare quindi non lo sto compilando ma prova questo
long maximumValue(long myArray[])
{
long max = myArray[0]; // start with max = first element
for (i = 0; i < (sizeof(myArray)/sizeof(long)); i++) {
if(myArray[i] > max)
max = myArray[i];
}
return max; // return highest value in array
}
Usala in questo modo:
maximumValue(qualsiasiArrayCheTiPare[]);
É scritta in modo tale che se dovessi cambiare tipo di dato lo cambi modificando pochissime linee di codice
Comunque si lenght su arduino si usa per le stringhe come avevi ben capito si usa sizeof che peró ti dá in numero di byte, il problema é che non sempre gli int o altri tipi valgono sempre 2 byte ma dipende dal compilatore. E questa é la spiegazione del perché trovi quella divisione dentro il for, vedi il reference se non mi sono spiegato bene
Edit: rileggendo tu vuoi il minimo, ma hai messo una funzione che ti dá il massimo, in ogni caso dovresti essere in grado di modificarla da solo per l obiettivo voluto
long maximumValue(long* array, unsigned int length) {
E di chiamarla sempre passando sempre esplicitamente la lunghezza dell'array, è la cosa migliore. Se i tuoi array sono piccoli (< 256 elementi), usa pure byte per la length.
Il resto del codice dovrebbe andare bene così com'è.
Beh, sarebbe meglio usare come tipo di ritorno lo stesso tipo dell'array.
Se l'array contiene byte, la funzione ritorna il massimo ma sempre un byte.
byte ~~long ~~maximumValue maximumValue(byte myArray[])
Bene, ho toppato che ho trovato solo la funzione per il massimo. Ma potrei anche usare min(x,y) oppure girare il simbolo di comparazione (<)
Inoltre un GRAZIE a tutti
Puoi fare tutto tranquillamente dentro quel singolo ciclo for basta creare una variabile minimo e aggiungere l istruzione dentro il for come dicevi tu con il simbolo invertito
Cosí ti funziona mille volte meglio delle funzioni min e max di arduino
Ritorno sull' argomento, perché mi sorprendeva che non funzionasse.
Alla fine la funzione ridotta all' osso sarebbe
uint8_t minValue(uint16_t myArray[]) {
uint8_t index = 0;
for (uint8_t i = 0; i < (sizeof(myArray)/sizeof(uint16_t)); i++) {
if(myArray[i] < myArray[index]) index = i;
}
return index; // return lowest index of the array
}
Però non funziona per il fatto che (sizeof(myArray)/sizeof(uint16_t) ritorna UNO
Sarebbe bello come dice aster94, per una funzione a scopo universale. Ma è meglio come consiglia nid69ita. Quindi ho dichiarato il valore che conosco dell' unico array che ne fa uso. A pensarci bene non serve neanche un array di appoggio.
Ora il discorso è perché sizeof() mi ritorna il valore 2 ?
Perché quando passi un array ad una funzione quel che viene passato in realtà è un puntatore al suo primo elemento (e su Arduino i puntatori occupano appunto 2 byte, quanto un uint16_t). Per questo ti sconsigliavo quel modo di calcolare il numero di elementi di un array e ti proponevo un'alternativa "sicura" già al post #2.