Trovare minimo o massimo di un array

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 :wink:

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

Io ti consiglio di dichiarare la funzione così:

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[])

Giusto, non me n'ero accorto! Corretto, tnx!

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 (<) :slight_smile:
Inoltre un GRAZIE a tutti :slight_smile:

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.

C'ho dovuto sbattere il naso, per accorgermi che non andava :cry: