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);
}
}