qsort (Quicksort) mit struct-Array?

Gast #285588
Lesenswert?
• ▲
▼
Hallo Forum,

ich habe in C ein Array aus Strukturen (Bitfelder) und möchte das ganze
sortieren lassen. Hier mal die Deklaration der Strukturen:

struct m_note {
  volatile BYTE data1:7;
  volatile BYTE data2:7;
  volatile BYTE active:2;    //not used yet
};

Und hier das Array:

struct m_note active_note[8]={{0}};

Jetzt möchte ich das Array abhängig von der ersten Struktur-Variable
(member?) ".data1" aufsteigend sortieren lassen. Die Struktur mit dem
kleinsten Wert in .data1 soll an erster Stelle stehen usw. Ich nutze
dazu die qsort-Funktion. Hier mal die Sortierfunktion:

void note_sort(int (*compare_funct) (const void *zahl1, const void
*zahl2))  //Aufruf über note_sort(&compare_asc); (oder desc)
{
  qsort (active_note[0].data1, 8,
sizeof(active_note[0].data1),compare_funct);
}

Hier die Vergleichsfunktion:

int compare_asc(const void *zahl1, const void *zahl2)
{
  return(*(int *)zahl1 - * (int *)zahl2);  //aufsteigend sortieren
}

Und so wird sie aufgerufen:

note_sort(&compare_asc);

Das ganze klappt nicht so ganz. Kann mir jemand sagen, ob so etwas
prinzipiell möglich ist und wenn ja, wie? Und ist ein qsort auf dem
Mikrocontroller überhaupt sinnvoll (Rekursion)? Laufen soll das ganze
auf einem ATmega8.

(Und vielleicht kann mir noch jemand sagen, wie ich das mit dem
Syntax-Highlighting hier im Forum hinkriege)

Danke für eure Antworten,
Laplace
Persönliche Seite #285589
Lesenswert?
• ▲
▼
Deine Vergleichsfunktion darf nicht einfach zwei Zahlen miteinander
vergleichen, sondern muss die von Dir gewünschten Strukturmitglieder
miteinander vergleichen.

Also:

  int compare_asc(const void *zahl1, const void *zahl2)
  {
    struct m_note *p1;
    struct m_note *p2;

    p1 = (struct m_note *) zahl1;
    p2 = (struct m_note *) zahl2;

    return (p1->data1 - p2->data1);  //aufsteigend sortieren
  }

Und der Aufruf von qsort muss auch etwas anders aussehen:

  qsort(active_note, 8, sizeof (struct m_note), compare_funct);

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.