Forum: Compiler & IDEs qsort (Quicksort) mit struct-Array?


von Laplace (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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

von Laplace (Gast)


Lesenswert?

Danke, ich werde das mal testen.

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.