Moin Leute, ich erfasse 8 Werte mit einem ADC und möchte hieraus den maximalen und minimalen Wert finden. Wie geht das am einfachsten? Eine umfangreiche if(x1>x2)... Verknüpfung kann doch nicht das gelbe vom Ei sein. Bis dann Dirk
...ein paar variablen und 2 vergleiche - viel zeit verschwendet man damit nicht. Klaus.
1 | #define max( x, y ) ( ( x > y ) ? x : y )
|
2 | #define min( x, y ) ( ( x < y ) ? x : y )
|
3 | |
4 | int data[ 8 ]; |
5 | int dmax, dmin; |
6 | int i; |
7 | |
8 | dmax = dmin = data[ 0 ]; |
9 | |
10 | for( i=1; i<8; i++ ) { |
11 | dmax = max( dmax, data[ i ] ); |
12 | dmin = min( dmin, data[ i ] ); |
13 | }
|
soetwas vielleicht?
Hallo, Als Beispiel die Werte in einem Array mit index 0...7 C-Syntax ist nicht meine Stärke, Assembler passt hier zum GCC ;) also Basic-ähnlicher Pseudocode minwert = 1025 (bzw. mögliches Maximum +1) maxwert = 0 For I=0 to I=7 if array[I] > maxwert maxwert = array[i] endif if array[i] < minwert minwert = array[i] endif endif Gruß aus Berlin Michael
1 | #define MAX 1023 //höchstmöglicher zu erwartender Messwert
|
2 | #define MIN 0 //kleinstmöglicher zu erwartender Messwert
|
3 | unsigned int messwert_array[8], min_wert = MAX, max_wert = MIN; |
4 | |
5 | for(unsigned char i = 0; i < 8; i++) |
6 | {
|
7 | if(messwert_array[i] < min_wert) |
8 | min_wert = messwert_array[i]; |
9 | if(messwert_array[i] > max_wert) |
10 | max_wert = messwert_array[i]; |
11 | }
|
Wieso überprüfst Du das nicht gleich während des Einlesens? Beim ersten Einlesen des ADC setzt du min_val und max_val auf diesen Wert. Bei jedem weiteren Einlesen machst Du folgendes:
1 | if (val > max_val) max_val = val; |
2 | if (val < min_val) min_val = val; |
Hallo, @Florian Demski: so als Anmerkung von mir... ;) ich programmiere AVR in ASM, schau in C immer mal wieder rein, falls ich es doch mal intensiver nutzen will oder muß. Dein Codebeispiel ist für mich einer der Gründe, weshalb ich es manchmal schnell wieder lasse. Sicher elegant (ich verstehe es durchaus, ich kann ja programmieren, nur C eben nicht direkt), für einen Einsteiger aber der Beweis, wie man Abläufe in C so cryptisch verschlüsselt, daß man es erst nach einigem Nachdenken versteht. Oder gibt es einen Grund, den ich übersehe, weshalb man die min /max Sachen unbedingt in ein Define verpacken muß und für die If-Geschichte die Kurzschreibweise benutzen muß? Wirklich nur eine Anmerkung und keineswegs böse gemeint. Gruß aus Berlin Michael
Michael U. wrote: > ... > Oder gibt es einen Grund, den ich übersehe, weshalb man die min /max > Sachen unbedingt in ein Define verpacken muß und für die If-Geschichte > die Kurzschreibweise benutzen muß? Da hast du recht, die wären als Funktion besser aufgehoben. Das gibt sonst bei j = max( i++, 5 ); böse Überraschungen. Aber ansonsten: Gerade diese Makros sind normalerweise Standardbeispiele in den meisten C-Büchern. Auch wenn das seit Einführung von inline Funktionen keine gute Idee mehr ist.
Hallo, @Karl heinz Buchegger: naja, soweit habe ich garnicht geschaut. ;) Ich finde nur das Beispiel von Johannes M. für einen Einsteiger erstmal viel lesbarer und damit nachvollziehbarer. Mit den Makros sehe ich wie in ASM: ich benutze sie durchaus, allerdings ist ein Programm von jemand anderem mit vielen Makros auch für mich aufwändiger nachzuverfolgen, weil ich da auch jedesmal erst nachschauen muß, was im zugehörigen Makro definiert ist und es steht meist nicht direkt unter dessen Benutzung. ;) Gruß aus Berlin Michael
Michael U. wrote: > ich programmiere AVR in ASM, schau in C immer mal wieder rein, falls ich > es doch mal intensiver nutzen will oder muß. > Abläufe in C so cryptisch verschlüsselt, daß man es erst nach einigem > Nachdenken versteht. Das geht auch in Assembler, ist dann allerdings sehr effizient. http://www.hackersdelight.org/basics.pdf Seite 37: Doz, Max, Min
> Da hast du recht, die wären als Funktion besser aufgehoben.
Geht aber generisch nicht, weil C keine Templates kann.
Nörgler wrote: >> Da hast du recht, die wären als Funktion besser aufgehoben. > > Geht aber generisch nicht, weil C keine Templates kann. Da sind mir dann n Funktionen immer noch lieber als 1 Makro, welches grauslich in die Hose gehen kann :-)
Freut mich Euch eine anregene Diskussion beschert zu haben ;-) Die Tipps haben mir weitergeholfen, vielen Dank! Dirk
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.