www.mikrocontroller.net

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


Autor: Laplace (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Laplace (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich werde das mal testen.

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.