| Planet-Quellcodes.de · Regeln/Impressum |
Hilfe
Suche
Chat
Mitglieder
Kalender
|
| Herzlich Willkommen. ( Einloggen | Registrieren ) | erneutes Übersenden der Registrierungs-Mail |
| Seiten: (3) [1] 2 3 ( zum ersten ungelesenen Beitrag ) | ![]() ![]() |
| PapaNappa |
geschrieben am: 24.08.2005, 17:56
|
||
![]() Gruppe: Mitglieder Beiträge: 393 Mitglieds-Nr.: 33 Mitglied seit: 03.09.2004 |
Hallo! Ich wollte versuchen, den Sortieralgorithmus AvlSort (Variante 3) nach Delphi zu portieren, den Quellcode gibt es auf der Applet-Seite. Das Problem tritt bei sehr wenigen Elementen (bis 10 Mein Code (am Ende des Postes) dürfte eigentlich kaum oder garnicht vom Java-Original abweichen (welches nur in Variante 3 vorliegt, daher benutze ich diese), aber die Java-version funktioniert ja. Den Entwickler des Algorithmus und des Applets/der Page habe ich auch schon kontaktiert, aber er hat auch im Moment keine Zeit, um sich das näher anzugucken. hier der Code (Auszug):
-------------------- I look forward to killing you soon!
|
||
| Schutsch |
geschrieben am: 24.08.2005, 21:02
|
|
Gruppe: Mitglieder Beiträge: 87 Mitglieds-Nr.: 22 Mitglied seit: 03.09.2004 |
Ein bißchen Predebugging wäre ja schon hilfreich, ich meine es ist ja nicht sehr viel Code, aber eingrenzen sollte doch schon sein.
An deiner Stelle würde ich den enstehenden Baum schritt für schritt mit einer simplen Ausgaberoutine darstellen lassen, und dann selbst rausfinden, wo exakt der Fehler ist. So nach dem Motto : procedure viewavltree(s:string;node:tavlnode); begin writeln(s,node.index); if assigned(node.left) then viewavltree(s+' ',node.left); if assigned(node.right) then viewavltree(s+' ',node.right); end; Anders würde ich es jetzt auch nicht rauskriegen, sag doch bescheid, wenn du den Fehler gefunden hast. |
| RainerK |
geschrieben am: 25.08.2005, 16:05
|
||
|
Gruppe: Mitglieder Beiträge: 53 Mitglieds-Nr.: 185 Mitglied seit: 25.09.2004 |
Liegt es vieleicht an der Klammersetzung?
|
||
| PapaNappa |
geschrieben am: 25.08.2005, 19:15
|
![]() Gruppe: Mitglieder Beiträge: 393 Mitglieds-Nr.: 33 Mitglied seit: 03.09.2004 |
daran kann es eigentlich nicht liegen, außer Java hat in dem Fall eine andere Rangfolge der Operatoren, was ich aber nicht glaube.
Außerdem schlägt ja schon der Zugriff auf Left bzw. Right fehl, nicht erst auf .Balance @Schutsch: hab ich das nicht schon? in lRot/rRot bzw. in Balance. Mit der Ausgabe werd ich mal gucken, atm habe ich keine Zeit - morgen aber bestimmt. -------------------- I look forward to killing you soon!
|
| Schutsch |
geschrieben am: 26.08.2005, 18:27
|
||
|
Gruppe: Mitglieder Beiträge: 87 Mitglieds-Nr.: 22 Mitglied seit: 03.09.2004 |
Wo was ??? Die Prozedur da liefert dir nur ne Übersicht über den vorhandenen Baum. |
||
| Delphi-Laie |
geschrieben am: 28.10.2009, 13:31
|
|
Gruppe: Mitglieder Beiträge: 14 Mitglieds-Nr.: 756 Mitglied seit: 24.10.2009 |
Hallo, ist zwar schon Jahre her, aber trotzdem: Ich beschäftige mich auch gerade mit diesem Thema, also konkret mit der Delphi-Umsetzung des AVL-Sorts.
PapaNappa, hatten Sie meine PM dazu erhalten? Das Problem könnte in einem fehlerhaften Aufruf der Funktion rRot liegen. Die wird nämlich auch dann aufgerufen, wenn A.left = nil ist. Damit wird B auch nil zugewiesen, als B:=nil. Jeder Zugriff auf - logischerweise nichtexistente - "Unterelmente" auf B (also B.left, B.right und B.balance) muß damit zu einem Laufzeitfehler (konkret Exzeption) führen. Für lRot dürfte das analog gleiche gelten, die ist ja nur das "spiegelbildlich( invers)e" Pendant zu rRot. Nun kam ich auf die Idee, den Verdacht, daß lRot und rRot lediglich von der Deklaration her vertauscht sind (auch, weil zuerst rRot und dann lRot im Quelltext stehen, normalerweise fängt man ja mit links an), doch Pustekuchen, damit waren die Fehler auch nicht beseitigt. Ich werde weiterforschen und mich bei einer weiteren Einkreisung (oder gar Lösung) des Problems wieder melden. |
| (j)avatar |
geschrieben am: 28.10.2009, 14:18
|
||
![]() Gruppe: Mitglieder Beiträge: 58 Mitglieds-Nr.: 753 Mitglied seit: 31.08.2009 |
Hallo PapaNappa, leider funktionieren die beiden links (zumindest momentan) nicht. Wenn du den Java-Code posten würdest könnte ich mal den Delphi- und den Java-Code vergleichen und schauen, ob dir bei der Umsetzung Fehler unterlaufen sind. Mir ist das auch schon mal passiert, als ich einen Sortieralgorithmus aus C in Delphi übersetzten wollte, wodurch ich meine Facharbeit verhauen habe Meine Delphi-Zeit liegt zwar schon etwas zurück, aber das sollte kein Problem sein mfg -------------------- "Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde."
-Immanuel Kant |
||
| NetPanther |
geschrieben am: 28.10.2009, 15:11
|
||
![]() Administrator Gruppe: Administratoren Beiträge: 7.696 Mitglieds-Nr.: 1 Mitglied seit: 29.08.2004 |
Guten Tag, die Inhalte der verlinkten Seite stellt der einstige Gründer derzeit noch unter dieser Adresse zum Abruf bereit. Die o.g. Domain ist schon seit geraumer Zeit nicht mehr zu erreichen. MfG -------------------- :: NetPanther :: NetPanther@gmx.net :: Website :: IRC Channel: #NetPanther ::
Das Leben ist eine Beta. Nichts ist vollkommen. |
||
| Delphi-Laie |
geschrieben am: 28.10.2009, 15:39
|
|
Gruppe: Mitglieder Beiträge: 14 Mitglieds-Nr.: 756 Mitglied seit: 24.10.2009 |
Oh, konnte ich diese Diskussion reanimieren? Freut mich.
Peter Weigel quengelte ich schon im Sommer die Ohren (bzw. Augen) voll. Er gab vor wenigen Jahren seine Sortierseite an einen Schweizer Informatikprofessor ab, der sie nicht nur nicht weiterpflegte, sondern sogar ein wenig abbaute, zurückfuhr. Nachdem besagte Seite seit dem Frühsommer nicht mehr erreichbar ist, schwieg er auf meine und sogar Herrn Weigels diesbezügliche Anfrage. Herr Weigel entschloß sich dankenswerterweise zu dieser „Notlösung“. Ich finde es klasse, daß die beste deutschsprachige Sortierseite wenigstens auf diese Weise erhalten blieb. Zurück zum AVL-Sort: Ein (der?) Wurm steckt eindeutig auch oder allein schon „weiter vorn“ im Programmablauf, nämlich in der l-&rRot-aufrufenden Prozedur „Balance“. Beitrag bearbeitet von Delphi-Laie am 28.10.2009, 15:42 |
| (j)avatar |
geschrieben am: 28.10.2009, 16:33
|
||||
![]() Gruppe: Mitglieder Beiträge: 58 Mitglieds-Nr.: 753 Mitglied seit: 31.08.2009 |
Für den Fall das wirklich "nur" ein Fehler in balance steht, hab ich jetzt einfach mal "java-balance" in "delphi-balance" übersetzt. Stecken zwar vlt. Tipp- und/oder Flüchtigkeitsfehler drin, aber Delphi wird ja schon meckern, wenn solche Fehler drin sind. Bei Gelegenheit und falls meine Übersetzung nicht schon das Problem löst (Daumen drücken!) schau ich mir deinen Code und den Originalcode mal genauer an.
Ps.: hat schon mal jemand den original-Code geprüft? Vlt. hat sich da ja bereits ein Fehler eingeschlichen. mfg -------------------- "Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde."
-Immanuel Kant |
||||
| Delphi-Laie |
geschrieben am: 28.10.2009, 22:42
|
|
Gruppe: Mitglieder Beiträge: 14 Mitglieds-Nr.: 756 Mitglied seit: 24.10.2009 |
Danke für Deine Mühe!
Im Originalbeitrag von PapaNappa folgt den einzelnen Result-Zuweisung der exit-Befehl, was ich für korrekt(er) halte als Deine Version, bei der das finale result:=a ja immer aufgerufen wird. Damit wären die result-Zuweisungen vorher überflüssig. Besondere Erfahrung im Übersetzen von C-Derivaten nach Pascal/Delphi habe ich allerdings nicht, ich lehne mich also nicht weit hinaus. Der Fehler in Balance äußerte sich bei mir schon dahingehend, daß auf a.left.balance zugegriffen wird, obwohl a.left=nil ist (analog a.right(.balance)). Dem Autor der Internetseite kann ich ein Hochmaß an Sorgfalt bescheinigen, jedoch kann ich mich an zwei Algorithmen erinnern, die nicht so ohne weiteres in Pascal-Übersetzung funktionierten (einmal mußte eine Variable anders gesetzt werden, im anderen Falle funktioniert es bis heute bei mir nicht hundertprozentig zufriedenstellend). Egal, ich werde jedenfalls so schnell nicht aufgeben, und weitere Ergebnisse, sofern vorliegend, hier beitragen. Beitrag bearbeitet von Delphi-Laie am 28.10.2009, 22:58 |
| (j)avatar |
geschrieben am: 28.10.2009, 23:20
|
||
![]() Gruppe: Mitglieder Beiträge: 58 Mitglieds-Nr.: 753 Mitglied seit: 31.08.2009 |
@delphi-laie kann sein das mein code nicht ganz korrekt ist. hab bloß zeile für zeile übersetzt (also so wie google englische Seiten übersetzt Ich schau mir das ganze aber wie gesagt bei gelegenheit mal an, was aber eventuell bis zum Wochenende dauern könnte. Aber wenn a.left = nil ist solltest du mal gucken, wie das sein kann, das a.left nicht belegt wird. Das hört sich stark danach an, als läge das Problem schon in einer "übergeordneten" Funktion. Du solltest auf jeden Fall mal nachgucken wo a.left und a.right gesetzt werden sollten, oder du baust folgendes ein an Stellen, an denen a.left/right gelesen werden und schaust was passirt:
sonst bleibt nur debuggen. Tip: lass dir mit writeln() an so vielen Stellen wie möglich die wichtigsten Variablen ausgeben und geh dann Schritt für Schritt durch, was wann, wieso passiert. Ist sehr aufwändig, aber so findest du bestimmt den Fehler. mfg -------------------- "Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde."
-Immanuel Kant |
||
| Delphi-Laie |
|
|
Gruppe: Mitglieder Beiträge: 14 Mitglieds-Nr.: 756 Mitglied seit: 24.10.2009 |
Yo, danke erneut! Natürlich gehe ich so (ähnlich) vor, der Debugger läßt ja kaum etwas unentdeckt.
Einen Fehler habe ich schon entdeckt: Bei einer inversen Permutation (also absteigend, jedes Element einmal) muß nur der Stack entsprechend erhöht werden (ich maximiert ihn auf den Maximalwert über 16 Millionen). Dann sortiert mir das Programm auch 1.200 Elemente/Wert fehlerfrei. Bei einer Zufallspermutation kommen Abbruchfehler (der in lRoot) leider teilweise schon bei <10 Elementen. Beitrag bearbeitet von Delphi-Laie am 28.10.2009, 23:41 |
| (j)avatar |
geschrieben am: 29.10.2009, 00:07
|
![]() Gruppe: Mitglieder Beiträge: 58 Mitglieds-Nr.: 753 Mitglied seit: 31.08.2009 |
Sicher, dass die Vergrößerung des Stacks etwas damit zu tun hat? Wenn der zu klein ist bekommt man soweit ich weiß eine Fehlermeldung "Stackoverflow". Und 1.200 Elemente ist eigentlich noch recht wenig. Normalerweise sollten auch Listen mit mehreren millionen Elementen kein Problem sein. Bei Listen mit 1200 Elementen macht es nicht einmal Sinn viel Zeit in komplizierte Sortieralgorithmen zu stecken. Da tun es auch schon einfache Sortierverfahren, wie Bubblesort, die wesentlich einfacher zu implementieren sind, da sie kurz und nicht rekursiv sind.
Beitrag bearbeitet von (j)avatar am 29.10.2009, 00:08 -------------------- "Handle nur nach derjenigen Maxime, durch die du zugleich wollen kannst, dass sie ein allgemeines Gesetz werde."
-Immanuel Kant |
| Delphi-Laie |
geschrieben am: 29.10.2009, 11:30
|
||||||
|
Gruppe: Mitglieder Beiträge: 14 Mitglieds-Nr.: 756 Mitglied seit: 24.10.2009 |
Ja!
Genau die bekam ich ja, und zwar in der Zeile "begin" gleich nach der Funktionseröffnungszeile: function Insert..... Eigentlich verblüffend, weil ich die Stacknutzung nur von der Rekursion (her) kenne, und die finde ich in diesem Algorithmus nicht. Edit: Doch, schon welche gefunden, und zwar bei der Ergebniszuweisung der Funktion resolve und in der Funktion Insert.
Mir geht es um die Herausforderung. In anderen Delphiforen veröffentlichte ich ein Sortiervisualisierungsprogramm. Wenn ich es mit solch immensen Algorithmen noch erweitern könnte.... Ich verbeiße mich aber nicht darin. Die Entscheidung, ob ich mich als Nichtinformatiker damit zu weit aus dem Fenser lehnte, habe ich noch nicht getroffen. Beitrag bearbeitet von Delphi-Laie am 29.10.2009, 19:18 |
||||||
Seiten: (3) [1] 2 3 |
![]() ![]() |