zu "lokirobotics" : Habs probiert, gibt einen Stackoverflow......
Und "sternst" geb ich auch recht. "l" und "r" treffen irgendwann den wert von "p".
Habe mich grad mal intesiver damit auseinandergesetzt.
Habe ein (weils mir leichter fällt) Pascal (Delphi) Programm geschrieben, welches nun einwandfrei läuft.
Nun habe ich es nach "C" konvertiert. Da ich doch noch erhebliche Probleme mit "C" habe, wird mir dabei sicher ein Fehler unterlaufen sein. Den find ich nur irgendwie nicht.
Könnt Ihr da mal drauf schauen, was ich dort falsch gemacht habe. Das C-Programm bekommt einen Stackoverflow.....
Zunächst meine funktionierende Pascal-Variante:
und nun mein anscheinend fasch konvertiertes "C" ProgrammCode:const ar:Array[0..4] of Integer = (5,4,3,2,1); procedure QSort(lo,hi:Integer); var left,right,mid,tmp:Integer; begin left := lo; right := hi; mid := ar[(lo+hi) DIV 2]; repeat while (ar[left] < mid) do inc(left); while (ar[right] > mid) do dec(right); if left <= right then begin tmp := ar[left]; ar[left] := ar[right]; ar[right] := tmp; inc(left); dec(right); end; until left > right; if right > lo then QSort(lo,right); if left < hi then QSort(left,hi); end; begin QSort(0,sizeof(ar) DIV sizeof(ar[0]) -1); end.
Ich danke euch,Code:U16 ar[5] = {5,4,3,2,1}; void QSort(U16 lo, U16 hi) { U16 left,right,mid,tmp; left = lo; right = hi; mid = ar[(lo+hi)/2]; do { while (ar[left] < mid) left++; while (ar[right] > mid) right--; if (left <= right) { tmp = ar[left]; ar[left] = ar[right]; ar[right] = tmp; left++; right--; } } while (left <= right); if (right > lo) QSort(lo, right); if (left < hi) QSort(left, hi); } int main(void) { QSort(0,sizeof(ar) / sizeof(ar[0]) -1); }
Siro
Geändert von Siro (29.04.2011 um 14:41 Uhr)
Ich habe mein Problem gefunden. Habe es selbst verursacht weil ich komplett mit unsigned Werten U16 gearbeitet habe.
Das geht hier schief. Ich muss Signed bzw. "int" benutzen. hab ich in Pascal ja auch getan.
Der Wert "right" landete bei -1 (also 65535) und dann ging natürlich die Abfrage falsch.
oder ich schreibe hinter der left++ Zeile, im unterem Abschnitt if (right) right--; dann geht es auch mit unsigned Werten.
Hier noch mal die korrigierte Version:
Ich glaub jetzt hab ich alle Probleme gelöst, wird ja auch Zeit fürs Wochenende.Code:U16 ar[5] = {5,4,3,2,1}; void QSort(U16 lo, U16 hi) { U16 left,right,mid,tmp; left = lo; right = hi; mid = ar[(lo+hi)/2]; do { while (ar[left] < mid) left++; while (ar[right] > mid) right--; if (left <= right) { tmp = ar[left]; ar[left] = ar[right]; ar[right] = tmp; left++; if (right) right--; } } while (left <= right); if (right > lo) QSort(lo, right); if (left < hi) QSort(left, hi); } int main(void) { QSort(0,sizeof(ar) / sizeof(ar[0]) -1); }
Siro
Geändert von Siro (29.04.2011 um 15:12 Uhr)
Hi Siro. Es gibt ein qsort in der avr-libc. Warum also das Rad neu erfinden?![]()
Disclaimer: none. Sue me.
Weil es so gut wie alles, was es hier gemacht wird, schon fertig gibt. Wozu also überhaupt noch was selber machen?
Ich find solche Kommentare in einem Forum wie diesen mehr als sinnlos.
Siro will wahrscheinlich was lernen und das tut man nicht, wenn man Fertigkomponenten benutzt.
Es gibt fast alles schon irgendwo fertig, das stimmt...
Aber qsort gibt es nicht einfach nur irgendwo, sondern es ist Teil der C-Standardbibliothek, was vielen nicht bewusst ist. Von deinem Standpunkt aus betrachtet müsste man also auch z.B. die Existenz von Funktionen wie sprintf "geheimhalten", weil es ja sein könte, daß das Jemand lieber selber implementieren möchte um etwas dabei zu lernen.
Ich denke es sollte Jedem selbst überlassen sein, ob er Fertigkomponenten nutzen, oder lieber etwas eigenes implementieren möchte.
So viele Treppen und so wenig Zeit!
Du hast meinen Standpunkt missverstanden! Dein letzter Absatz ist genau das, was ich meinte. Jeder sollte seine Projekte so umsetzen, wie er möchte.
Man muss auch nichts geheimhalten. Ich kann ja auch eine fremde Implementierung als Grundlage für eine Eigene nehmen.
Ich find halt diese "Warum das Rad neu erfinden"-Aussagen schwachsinnig.
Jaa, mein letzter Satz ist etwas übertrieben gewesen, natürlich lernt man auch, wenn man Fertigkomponenten einsetzt. Mir ging es in dem Fall nur darum, dass man die Funktionsweise des QSort nicht sehr gut mitbekommt, wenn man nur nen Aufruf einer fertigen Funktion tätigt. War etwas missverständlich geschrieben, stimmt.
MfG
Lesezeichen