Forum: Compiler & IDEs Werte sortieren


von Crash (Gast)


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?

von Crash (Gast)


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)

von Andreas S. (andreas) (Admin) Benutzerseite


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

von Crash (Gast)


Lesenswert?

Ok, danke das werde ich so hinbekommen.
Habe auch schon was gefunden:
http://www.phim.unibe.ch/comp_doc/c_manual/C/EXAMPLES/qsort1.c

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

von Crash (Gast)


Lesenswert?

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

von Volker Kattoll (Gast)


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?

von Joerg Wunsch (Gast)


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.

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.