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 }