Arduino IDE: 1.8.10
Board: Esp8266 Nodemcu
Esp Core Version: 2.6.2
Mit Vorzeichenlosen Werten im Array ist es einfach.
template <typename T, size_t size> T maxRead(T (&value)[size]) {
T maxValue {0};
for (auto &v : value) maxValue = max(maxValue, v); // max Wert aus Array ermitteln
return maxValue;
}
int8_t byteBuffer[] {23, 36, 45, 113, 81, 111};
float floatBuffer[] {6.5, 8.9, 14.2, 5.6, 10.4};
int32_t intBuffer[] {-44823, -41136, -42545, -43613, -49981, -47711};
uint32_t uintBuffer[] {823, 436, 545, 613, 981, 711};
void setup() {
Serial.begin(115200); delay(100);
Serial.print("\n\nbyte\t"); Serial.println(maxRead(byteBuffer));
Serial.print("float\t"); Serial.println(maxRead(floatBuffer));
Serial.print("int\t"); Serial.println(maxRead(intBuffer)); // geht natürlich nicht
Serial.print("uint\t"); Serial.println(maxRead(uintBuffer));
}
void loop() {}
Man könnte der Funktion den niedrigsten Wert vom Datentyp mitgeben. Sodas es auch mit negativen Werten funktioniert.
Schön geht anders!
template <typename T, size_t size> T maxRead(T (&value)[size], T maxValue = 0) {
for (auto &v : value) maxValue = max(maxValue, v); // max Wert aus Array ermitteln
return maxValue;
}
int8_t byteBuffer[] {23, 36, 45, 13, 81, 111};
float floatBuffer[] { -6.5, -8.9, -14.2, -5.6, -10.4};
int32_t intBuffer[] { -44823, -41136, -42545, -43613, -49981, -47711};
uint32_t uintBuffer[] {823, 436, 545, 613, 981, 711};
void setup() {
Serial.begin(115200);
delay(100);
Serial.print("\n\nbyte\t"); Serial.println(maxRead(byteBuffer));
Serial.print("float\t"); Serial.println(maxRead(floatBuffer, -999.9F)); // nicht schön
Serial.print("int\t"); Serial.println(maxRead(intBuffer, -2147483647)); // nicht schön
Serial.print("uint\t"); Serial.println(maxRead(uintBuffer));
}
void loop() {}
Mein Favorit momentan!
"maxValue" zunächst auf den niedrigsten Wert im Array setzen um anschließend den Max Wert zu ermitteln.
template <typename T, size_t size> T maxRead(T (&value)[size]) {
T maxValue {0};
for (auto &v : value) maxValue = min(maxValue, v); // zuerst min Wert ermitteln
for (auto &v : value) maxValue = max(maxValue, v); // max Wert aus Array ermitteln
return maxValue;
}
int8_t byteBuffer[] {23, 36, 45, 113, 81, 111};
float floatBuffer[] { -6.5, -8.9, -14.2, -5.6, -10.4};
int32_t intBuffer[] { -44823, -41136, -42545, -43613, -49981, -47711};
uint32_t uintBuffer[] {823, 436, 545, 613, 981, 711};
void setup() {
Serial.begin(115200);
delay(100);
Serial.print("\n\nbyte\t"); Serial.println(maxRead(byteBuffer));
Serial.print("float\t"); Serial.println(maxRead(floatBuffer));
Serial.print("int\t"); Serial.println(maxRead(intBuffer));
Serial.print("uint\t"); Serial.println(maxRead(uintBuffer));
}
void loop() {}
/*
Äquivalent Dazu den Min Wert ermitteln indem "minValue" zunächst auf den max Wert im Array gesetzt wird.
template <typename T, size_t size> T minRead(T (&value)[size]) {
T minValue {0};
for (auto &v : value) minValue = max(minValue, v);
for (auto &v : value) minValue = min(minValue, v);
return minValue;
}
*/
Gibt es noch bessere Möglichkeiten als zweimal das Array zu durchlaufen?
Danke und Gruß Fips