Bubblesort-Problem - Fehlersuche

OP #2823268
Lesenswert?
• ▲
▼
Liebe Alle,

ich versuche ein Array auf meinem Atmega32 zu sortieren und verwende die 
(auf das zweidimensionale array angepasste) Codegrundlage von 
http://www.rn-wissen.de/index.php/Codevergleich_AVR-Compiler#Sortieren_mit_Bubble-Sort

Zielvorgabe ist vorerst nach dem ersten Wert sortieren zu lassen.

Ich rufe sort_toplist() in einer anderen Funktion auf und lass mir die 
Werte dann auf einem Display ausgeben. Leider sortiert die Funktion gar 
nichts. Hat jemand einen Tipp, was ich falsch mache?

Das array ist global definiert.

1
volatile int topliste_int[10][2] = { {4,330}, {12,333 }, {2,330}, 
2
{3,333}, {4,333},{ 17,12}, {6,333}, {7,333}, {8,333}, {9,3333} };
3

4
void sort_toplist (void)
5
{
6
        uint8_t i;
7
  uint8_t n;
8
  
9
  n = 10; // Größe 
10
  
11
  // Bereich schrumpft von n auf 2
12
  for (i = n; i >= 2; i--)
13
  {
14
    char max = CHAR_MIN;
15
    uint8_t j, j_max, rem;
16

17
    // im Bereich nach MAX suchen
18
    for (j = 0; j < i; j++)
19
    {
20
      if (topliste_int[j][0] >= max)
21
      {
22
        // MAX und Pos. merken
23
        j_max = j;
24
        max   = topliste_int[j_max][0];
25
        rem = topliste_int[j_max][1];
26
      }
27
    }
28

29
    // MAX ans Ende tauschen
30
    topliste_int[j_max][0] = topliste_int[i-1][0];
31
    topliste_int[j_max][1] = topliste_int[i-1][1];
32
    topliste_int[i-1][0]   = max;
33
    topliste_int[i-1][1]   = rem;
34
  }
35
}
OP #2823305
Lesenswert?
• ▲
▼
Der Rest sind leider doch über 1000 Zeilen, ich dachte eh nicht, dass 
die jemand ansieht :)

Hier ein Auszug des Aufrufs innerhalb der Menueführung:
1
      if(last_disp_state != 8)
2
      {
3
        GLCD_ClearTXT();
4
        
5
        loop = 1;
6
        
7
        update_toplist();
8
        
9
        while(loop)
10
        {
11
        
12
     // Hier folgt jetzt die Darstellung der einzelnen Wert, das klappt
13
     // auch
14

15

16
...
#2823327
Lesenswert?
• ▲
▼
Hans B. schrieb:
> VIelen Dank. Mea culpa. Wie peinlich. Jetzt gehts.

Fast.
Deine Datentypen in der Sort-Funktion musst du noch bereinigen.

Einen int zwischendurch in einem char bzw. uint8_t ablegen kommt nicht 
so prickelnd, wenn die Zahlen größer werden.

zb
1
            rem = topliste_int[j_max][1];

links ('rem') vom = steht der Datentyp uint8_t
rechts ('topliste_int[j_max][1]') vom = steht der Datentyp int

Das passt nicht zusammen.
#2823345
Lesenswert?
• ▲
▼
Hans B. schrieb:
> Er zerpflückt den zweiten Teil des Datenkörbchens wirklich
> durcheinander.
>
> Wenn ich rem als int deklariere, müsste es genügen?

Jetzt gehts aber in die Ratespielchen.

wenn du

   i = j;

machen willst und dabei nichts verloren gehen soll, dann wäre es 
wahrscheinlich eine extrem gute Idee, wenn i und j vom gleichen Datentyp 
sind.

Bis jetzt ist es nicht aufgefallen, aber bei deinem max hast du das 
gleiche Problem. wenn in deinem Array, das [][0] Element den Datentyp 
int hat, dann wird es wohl nicht so prickelnd sein, wenn du max als char 
definierst. Denn immerhin versuchst du ja darin diesen int auch mal 
abzuspeichern.
1
              max   = topliste_int[j_max][0];

ist max aber ein char, dann wird das wohl in die Hose gehen, sobald der 
Wert in  topliste_int[j_max][0] nicht mehr in einen char passt.


(Und den Datentyp 'char' willst du schon gar nicht für irgendwas 
verwenden, was nicht mit Textverarbeitung zu tun hat)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.