mikrocontroller.net

Forum: Compiler & IDEs Werte sortieren


Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich lese gerade über den ADC 10 verschiedene Werte ein und würde diese
jetzt der Größe nach ordnen. Werte sind vom Typ Double.

Kann mir jemand einen Hinweis geben, wie man das macht?

Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
qsort(), sollte doch gehen, für 10 Werte.

Wohin muss ich für qsort() noch linken? Steht ja in der stdlib.h, wie
die dtostre() auch.
Libm.a?

extern void qsort(void *__base, size_t __nmemb, size_t __size,
          __compar_fn_t __compar);

Die Beschreibung der Parameter ist nicht gut gelungen, ich verstehe sie
jedenfalls nicht auf anhieb.

Angenommen ich habe die Werte: Wert[0]-Wert[9]
Dann ist "Wert" der erste Parameter, also base.
Size of each object?
Der zweiter Parameter wäre dann 10, aber was ist "size_t __size"
Bei Compar das selbe, wenn ich nur ascending will, was gebe ich dann
für compar an? Gar nichts?

Könnte mir jemand ein kleines Beispiel posten:
Wert[0]=3,44
...
Wert[9]=3,41

qsort(*Wert, 10, size_t __size, ascending)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man qsort: http://www.rt.com/man/qsort.3.html

So müsste das gehen:

int compare(a, b)
{
  if (a > b) {
    return 1;
  }
  if (a < b) {
    return -1;
  }
  return 0;
}

qsort(Wert, sizeof(Wert), sizeof(double), compare);

Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke das werde ich so hinbekommen.
Habe auch schon was gefunden:
http://www.phim.unibe.ch/comp_doc/c_manual/C/EXAMP...

Wofür ich das brauche?
Ich lese über den ADC Sensorwerte ein und bekomme zu 95% gute Werte
aber auch hin und wieder einen der aus der Reihe tanzt.

Werte[] = { 2,34; 2,35; 2,34; 2,36; 2,08; 3,14; 2,36}

Um den Median zu ermitteln muss ich die Werte ja vorher ordnen, dafür
brauchte ich die Funktion.

Werte_neu[] = { 2,08; 2,34; 2,34; 2,35; 2,36; 2,36; 3,14}

Mittelwert würde mir jetzt 2,42 liefern.
Wie man aber sieht liegt wohl der bessere Wert bei 2,35

Also rechne ich jetzt immer mit dem Wert_neu[3] und brauche keine
Rücksicht mehr auf große Schwankungen die manchmal auftreten Rücksicht
nehmen.

Ich weiss, es wissen bestimmt die meisten dass sich das Median
schimpft, aber was solls, besser als eine einfache Mittelwertbildung
(für die, die es nicht wissen).

Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich dafür noch libm.a wie bei der dtostre() linken?

Autor: Volker Kattoll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Crash,
bei so starken Ausreissern in den gemessenen Werten solltest du
analysieren, woher dieses kommt.
Liefert dein Sensor diese ?
Wenn ja, so könntest du mit einer RC-Kombination das Sensorsignal
glätten.
Was für einen Sensor nutzt du?

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo der Herr mit dem sinnvollen Namen...

qsort() ist Bestandteil der ganz normalen Standard-C-Bibliothek,
d. h. jedes gute C-Buch sollte Dir das erläutern können.

Da der ADC ja nur Integer-Werte liefert, sortiere lieber diese (also
vor der Umwandlung in float), spart Rechenzeit.

In Andreas' Beispiel fehlen die Typen für die Parameter, außerdem
werden die Parameter als Zeiger übergeben.  Beim Vergleich von int's
kann man die Funktion übrigens einfacher schreiben:

int
compare_int(void *a, void *b)
{
  int *ia, *ib;

  ia = (int *)a;
  ib = (int *)b;

  return *ia - *ib;
}

Für Deine Anwendung besser geeignet dürfte ein gleitender Mittelwert
sein: Du berechnest einfach bei jeder Messung den Mittelwert mit.

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.