Forum: Compiler & IDEs "MIN" Funktion... woher?


von Lars (Gast)


Lesenswert?

Hallo

in der ENC28j60 Software in der Codesammlung kommt die Zeile
1
len = MIN(len, maxlen);

vor. Ich nutze keinen AVR und musste diese Zeile rausnehmen, da sie dem 
Compiler unbekannt war. Das Programm antwortet nicht auf den Ping den 
ich sende. Ich dachte es könnte daran liegen.
Woher stammt diese MIN Funktion? AVR-lib ?

Könnte ich die irgendwie umschreiben?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Grossschreibung MIN deutet auf ein Makro hin.

#define MIN(foo, bar) ((foo) < (bar) ? (foo) : (bar))

Das kann allerdings problematisch sein, weil innerhalb des Makros 
Argumente mehrfach auftreten. Und bei Argumente mit Seiteneffekten geht 
das schief

irgendwas = MIN(++x, y--);

Würde durch die Textersetzung zu

irgendwas = ((++x) < (y--) ? (++x) : (y--));

In C++ könnte man das eleganter und gefahrloser lösen...
http://www.wachtler.de/cpp/node33.html

von Feadi F. (feadi)


Lesenswert?

1
uint16_t MIN( uint16_t a, uint16_t b )
2
{
3
  if ( a > b )
4
    return b;
5
  else
6
    return a;
7
}

  

von Jan M. (mueschel)


Lesenswert?

Die einfachste Lösung:
#define MIN(a,b) (((a)>(b))?(b):(a))

Aber Achtung: Wie bei defines üblich, musst du mit den Argumenten 
aufpassen: MIN(a++,b) liefert nicht das gewünschte! (a wird um 2 
erhöht!)

von Lars (Gast)


Lesenswert?

alles Klar. Es ist wirklich ein Makro. Habs demnach auch in einer .h 
Datei gefunden.
avrlibdefs.h

Danke!

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.