Forum: Compiler & IDEs max und min aus 8 Werten finden


von Dirk S. (fusebit)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

...ein paar variablen und 2 vergleiche - viel zeit verschwendet man 
damit nicht.

Klaus.

von Florian D. (code-wiz)


Lesenswert?

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?

von Michael U. (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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
}

von Xenu (Gast)


Lesenswert?

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;

  

von Michael U. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael U. (Gast)


Lesenswert?

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

von Florian D. (code-wiz)


Lesenswert?

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

von Nörgler (Gast)


Lesenswert?

> Da hast du recht, die wären als Funktion besser aufgehoben.

Geht aber generisch nicht, weil C keine Templates kann.

von Karl H. (kbuchegg)


Lesenswert?

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


von Dirk S. (fusebit)


Lesenswert?

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
Noch kein Account? Hier anmelden.