mergesort bug
-
hi,
ich hab in meinem merge einen bug...
wenn ich j inkrementiere kann es sein das ich auf a[8] zugreife...hier gibt es zwar im moment keinen absturtz weil a[8] eine gross negative zahl ist...
...das array ist aber nur von a[0] bis a[7] definiert...
sieht jeman den fehler?void merge(int *a, int *b, int l, int m, int r) { int i = l; int j = m; for (int k = l; k < r; k++) { if ((j >= r) || (( i < m) && (a[i] <= a[j]))) { b[k] = a[i++]; } else { b[k] = a[j++]; } } } void copy(int *b, int *a, int l, int r) { for (int i = l; i < r; i++) a[i] = b[i]; } void mergesort(int *a, int *b, int l, int r) { /* rekursiver mergesort algorithmus */ if (l < r-1) { int m = (l + r) / 2; mergesort(a,b,l,m); mergesort(a,b,m,r); merge(a,b,l,m,r); copy(b,a,l,r); } } void main() { int a[] = {4,3,8,9,6,2,1,5}; int b[8] = {0}; mergesort(a, b, 0, sizeof(a)/sizeof(int)); }
-
Bin zu faul zum Test:
definiere a[8] = 0 zu Beginn deines Programms
und schau welche Werte a[8] im Laufe deines Programms annimmtWas glaubst du welchen Wert dein Programm findet, wenn du a[8] liest, aber vorher nicht beschrieben hast? Wo kommt der Wert her? Hat der immer die selbe Grösse, egal wie oft und in welcher Reihenfolge du auf deinem PC die Programme aufrufst
void main()
und C99, wer lehrt euch denn so was
-
Dein Index m (in mergesort) wird auch zweimal sortiert.
-
ich will die groesse des input arrays a nicht veraendern...
DirkB schrieb:
Dein Index m (in mergesort) wird auch zweimal sortiert.
wo denn?
-
Die 8 wird erst erreicht nachdem kopiert wurde.
d.h. es werden keine Operationen mit a[8] bei dir durchgeführt.int main() { int a[] = {4,3,8,9,6,2,1,5}; int b[sizeof(a)/sizeof(int)] = {0};
Ältere Compiler könnten eventuell mit der letzten Zeile nicht klarkommen?
MfG f.-th.
-
Nachtrag - gerade gefunden:
http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal-by-theLeider ist mein Englisch bei solchen Feinheiten nicht ganz belastbar.
Also ist die erste Adresse nach einem Array, unter C99 bei bestimmten Rahmenbedingungen legal nutzbar.
MfG f.-th.