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
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);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.