mikrocontroller.net

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


Autor: Dirk S. (fusebit)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

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

Klaus.

Autor: Florian Demski (code-wiz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define max( x, y ) ( ( x > y ) ? x : y )
#define min( x, y ) ( ( x < y ) ? x : y )

int data[ 8 ];
int dmax, dmin;
int i;

dmax = dmin = data[ 0 ];

for( i=1; i<8; i++ ) {
    dmax = max( dmax, data[ i ] );
    dmin = min( dmin, data[ i ] );
}


soetwas vielleicht?

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define MAX 1023  //höchstmöglicher zu erwartender Messwert
#define MIN 0     //kleinstmöglicher zu erwartender Messwert
unsigned int messwert_array[8], min_wert = MAX, max_wert = MIN;

for(unsigned char i = 0; i < 8; i++)
{
    if(messwert_array[i] < min_wert)
        min_wert = messwert_array[i];
    if(messwert_array[i] > max_wert)
        max_wert = messwert_array[i];
}

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
if (val > max_val) max_val = val;
if (val < min_val) min_val = val;

  

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Demski (code-wiz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nörgler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da hast du recht, die wären als Funktion besser aufgehoben.

Geht aber generisch nicht, weil C keine Templates kann.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)


Autor: Dirk S. (fusebit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freut mich Euch eine anregene Diskussion beschert zu haben ;-)

Die Tipps haben mir weitergeholfen, vielen Dank!



Dirk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.