Forum: Mikrocontroller und Digitale Elektronik Bubblesort-Problem - Fehlersuche


von Hans B. (hans_b92)


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
}

von Peter II (Gast)


Lesenswert?

du solltest erstmal sagen wie du ein 2 Dimensionen sortieren willst? 
Macht doch überhaupt keinen sinn.

von Karl H. (kbuchegg)


Lesenswert?

abgesehen vom Durcheinander, den du mit den Datentypen angestellt hast, 
sollte das schon funktionieren (auch wenn sich deine rem Werte 
zwischendurch verändern)

Zeig mal den Rest. Kann es sein, dass du die Funktion gar nicht 
aufrufst?

von Hans B. (hans_b92)


Lesenswert?

Im Endeffekt soll nach dem jeweiligen ersten Wert der Zehn Elemente der 
ersten Etage sortiert werden.

{ {8,232},{2,344} ....

wird zu

{ {2,344},{8,232} ....

Verständlich?

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> du solltest erstmal sagen wie du ein 2 Dimensionen sortieren willst?
> Macht doch überhaupt keinen sinn.


Sieh die 2 Dimensionen als die "Struktur des kleinen Mannes an". 
Eigentlich will er

struct Wert
{
  int key;
  int Value;
};

und dann ein 10-er Array davon, sortiert nach key.
Nur weiß er noch nicht, dass es Strukturen gibt.

von Hans B. (hans_b92)


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
...

von Hans B. (hans_b92)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Peter II schrieb:

>
> und dann ein 10-er Array davon, sortiert nach key.
> Nur weiß er noch nicht, dass es Strukturen gibt.

Ja, das könnte das Problem sein :)

von Karl H. (kbuchegg)


Lesenswert?

Hans B. schrieb:
> Der Rest sind leider doch über 1000 Zeilen, ich dachte eh nicht, dass
> die jemand ansieht :)

Dann specks ab, mach ein Testprogramm in dem nur die Sortierung getestet 
wird. Und wenns dann immer noch nicht geht, dann postest du eben dieses 
Testprogramm.

von Daniel F. (df311)


Lesenswert?

Hans B. schrieb:
> update_toplist();

sicher, dass die zeile und die zeile

Hans B. schrieb:
> void sort_toplist (void)

richtig kopiert wurden? wenn ja, liegt genau hier das problem 
(unterschiedliche funktionen) ...

von Hans B. (hans_b92)


Lesenswert?

VIelen Dank. Mea culpa. Wie peinlich. Jetzt gehts.

von Karl H. (kbuchegg)


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.

von Hans B. (hans_b92)


Lesenswert?

Er zerpflückt den zweiten Teil des Datenkörbchens wirklich 
durcheinander.

Wenn ich rem als int deklariere, müsste es genügen?

von Karl H. (kbuchegg)


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)

von Hans B. (hans_b92)


Lesenswert?

Vielen Dank, ich werds daraufhin prüfen. Dankeschön für die schnelle 
Unterstützung.

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.