Array min() und max() Funktion – C++ Arduino

Ich erkläre hier, warum die Minimum und Maximum Funktion für Arrays nicht funktioniert, und zeige wie es mit eigenen Funktionen doch funktioniert.

Wann braucht man min oder max von einem Array? Beispielsweise wenn das Array ein Schieberegister darstellt, kann es interessant sein, die Bandbreite der letzten x Werte zu kennen.

Beim Arduino programmieren mit Arrays habe ich gemerkt, das die min()  und max()  Funktionen nicht das mit Arrays macht, was ich erwartet habe. Die Funktionen funktionieren nur mit zwei Werten, und geben dann den grösseren beziehungweise den kleineren zurück. Nachfolgend die Implementierung der beiden Funktionen in der Arduino.h Datei.

#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))

Minimum und Maximum Funktion für Arrays

Um die entsprechende Funktion auch für Arrays mit mehr als zwei Elementen verfügbar zu haben, habe ich mir die folgenden Funktionen geschrieben. Besonders an meiner Implementation ist, das die Werte vom Array per Pointer an die Funktion übergeben werden. Daher kommt das * und  & im Code.

// Calculates the maximum value of the array. 
int maxOfArray(int *array, int lenght)
{
	int max=array[0]-1;			
	for (int k=0; k<lenght; k++)
	if (array[k] > max) 
	{
		max = array[k];
	}
	return max;
}
// Calculates the minimum value of the array. 
int minOfArray(int *array, int lenght)
{
	int min=array[0]+1;			
	for (int k=0; k<lenght; k++)
	if (array[k] < min) 
	{
		min = array[k];
	}
	return min;
}

Weil ich in den Funktionen Pointer verwende, kann der Funktion anstatt der Werte direkt die Adresse des Array mitgegeben werden. *array  ist die Variabel wo die Adresse des zu verarbeitenden Arrays mit &meinArray  gespeichert wird. Darum, das * und & Symbol müssen vor den Variablennamen stehen damit es funktioniert.

int meinArray[] = {2, 4, 8, 3, 6};

int ymin = minOfArray(&meinArray[0], 5);
int ymax = maxOfArray(&meinArray[0], 5);

Teile eines Arrays auswerten

Die Implementation mit dem Pointer hat den Vorteil, das auch nur teile vom Array ausgewertet werden können. Vor allem bei langen Arrays ein Vorteil.  Mit maxOfArray(&meinArray[128], 64) werden nur die Elemente 128-192 vom Array ausgewertet. Das Funktioniert, weil mit dem Indizes 128 die Adresse vom 128igsten Element an die Funktion übergeben wird. Aber unbedingt darauf achten, dass das Array auch mindestend 128 + 64 Elemente lang ist.

min() und max() mit dem Datentyp „float“

Nicht immer will man Arrays vom Datentyp „int“ auswerten. Natürlich kann man auch einen Funktion mit dem Datentyp „flaot“ schreiben.