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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren