C-Kurs/BubbleSortDebug/Musterlösung: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „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 ...“) |
(Zeilennummern entfernt) |
||
Zeile 8: | Zeile 8: | ||
Korrigierter Code: | Korrigierter Code: | ||
<pre> | <pre> | ||
− | + | #include <stdio.h> | |
− | + | ||
− | + | typedef struct | |
− | + | { | |
− | + | char *data; | |
− | + | int key; | |
− | + | } item; | |
− | + | ||
− | + | item array[] = | |
− | + | { | |
− | + | {"bill", 3}, | |
− | + | {"neil", 4}, | |
− | + | {"john", 2}, | |
− | + | {"rick", 5}, | |
− | + | {"alex", 1}, | |
− | + | }; | |
− | + | ||
− | + | void sort(item *paItems, unsigned cItems) | |
− | + | { | |
− | + | int i = 0, j = 0; | |
− | + | int s = 1; | |
− | + | int cLeft = cItems - 1; | |
− | + | for (i = 0; i < cItems && s != 0; i++) | |
− | + | { | |
− | + | s = 0; | |
− | + | for (j = 0; j < cLeft; j++) | |
− | + | { | |
− | + | if (paItems[j].key > paItems[j+1].key) | |
− | + | { | |
− | + | item Temp = paItems[j]; | |
− | + | paItems[j] = paItems[j+1]; | |
− | + | paItems[j+1] = Temp; | |
− | + | s++; | |
− | + | } | |
− | + | } | |
− | + | cLeft--; | |
− | + | } | |
− | + | } | |
− | + | ||
− | + | int main(void) | |
− | + | { | |
− | + | int i = 0; | |
− | + | ||
− | + | sort(array, 5); | |
− | + | for (i = 0; i < 5; i++) | |
− | + | { | |
− | + | printf("array[%d] == {%s, %d}\n", | |
− | + | i, array[i].data, array[i].key); | |
− | + | } | |
− | + | } | |
</pre> | </pre> |
Version vom 23. September 2009, 13:26 Uhr
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:
#include <stdio.h> typedef struct { char *data; int key; } item; item array[] = { {"bill", 3}, {"neil", 4}, {"john", 2}, {"rick", 5}, {"alex", 1}, }; void sort(item *paItems, unsigned cItems) { int i = 0, j = 0; int s = 1; int cLeft = cItems - 1; for (i = 0; i < cItems && s != 0; i++) { s = 0; for (j = 0; j < cLeft; j++) { if (paItems[j].key > paItems[j+1].key) { item Temp = paItems[j]; paItems[j] = paItems[j+1]; paItems[j+1] = Temp; s++; } } cLeft--; } } int main(void) { int i = 0; sort(array, 5); for (i = 0; i < 5; i++) { printf("array[%d] == {%s, %d}\n", i, array[i].data, array[i].key); } }