C-Kurs/BubbleSortDebug/Musterlösung
Der erste Bug verursacht einen Segmentation fault oder eine falsche Ausgabe. Er befindet sich in Zeile 23. Die Abbruchbedingung ist j < 5, dass heisst j geht bis 4. Der darauffolgende Test greift durch j+1 auf das 6. Element in dem Array gibt, obwohl es nur 5 gibt. cItems gibt muss auf (cItems-1) geändert werden, damit es funktioniert.
Der zweite Bug verursacht einen vorzeitigen Abbruch der äußeren for-Schleife (Zeile 23), wodurch das array nicht komplett sortiert wird. in Zeile 36 wird citems dekrementiert. Dadurch wird auch die Abbruchbedingung verändert. Es gibt zwei Methoden diesen Bug zu beheben: 1. Einfach: Zeile 36 entfernen. Allerdings ist Bubblesort jetzt noch ineffizienter 2. cItems in Zeile 26 und 36 durch ein neue ersetzen, welche verhindert das cItems konstant bleibt.
Korrigierter Code:
1 #include <stdio.h>
2
3 typedef struct
4 {
5 char *data;
6 int key;
7 } item;
8
9 item array[] =
10 {
11 {"bill", 3},
12 {"neil", 4},
13 {"john", 2},
14 {"rick", 5},
15 {"alex", 1},
16 };
17
18 void sort(item *paItems, unsigned cItems)
19 {
20 int i = 0, j = 0;
21 int s = 1;
22 int cLeft = cItems - 1;
23 for (i = 0; i < cItems && s != 0; i++)
24 {
25 s = 0;
26 for (j = 0; j < cLeft; j++)
27 {
28 if (paItems[j].key > paItems[j+1].key)
29 {
30 item Temp = paItems[j];
31 paItems[j] = paItems[j+1];
32 paItems[j+1] = Temp;
33 s++;
34 }
35 }
36 cLeft--;
37 }
38 }
39
40 int main(void)
41 {
42 int i = 0;
43
44 sort(array, 5);
45 for (i = 0; i < 5; i++)
46 {
47 printf("array[%d] == {%s, %d}\n",
48 i, array[i].data, array[i].key);
49 }
50 }