![]() |
einfügen > doppelt verkettete Liste
Also, ich haben eine doppelt verkettete Liste
(jedes Element kennt seine Vorgänger und Nachfolger) Die Elemente sind entsprechend ihrem ".Start"-Wert sortiert. Nun möchte ich einen größeren (.Len) Eintrag C in C' und C2 aufteilen und dazwischen einen neuen Eintrag Result einfügen. nur irgendwie geht da irgendwo was schief. :gruebel: Denn wenn ich am Ende die Liste nochmal durchgeh und den .Next-Wert prüfe, dann stimmt der urplötzlich nicht mehr mit dem Vorgänger überein :shock: hier der prinzipielle Aufbau:
Delphi-Quellcode:
Ich kann da jedenfalls keinen Fehler entdecken :nerd:
type TRec = record
Prev, Next: PRec; Start, Len: Integer; end; var Result, C, C2: PRec; GetMem(Result, SizeOf(TRec)); GetMem(C2, SizeOf(TRec)); Result.Prev := C; Result.Next := C2; Result.Start := Start; Result.Len := Len; C2.Prev := Result; C2.Next := C.Next; C2.Start := Start + Len; C2.Len := C.Len - (C2.Start - C.Start); C.Next := Result; C.Len := C.Len - Result.Len - C2.Len; Dieses entspricht dem Code ab Zeile 403 in InsertFileToClusterList. Die Prüfung wird am Ende des Einfügens in Zeile 274 (ClustersCount) vorgenommen. Brauchte mal etwas Abwechslung und hab mir mal einen Defragmentierer vorgenommen :angel2: Das Ganze ließt aktuell nur das VolumeBitmap (Clusterbelegungsliste) aus, erstellt daraus eine Liste, danach wird das Dateisystem ausgelesen (aktuell noch via FindFirst und Co.), die Dateien in eine weitere Liste eingefügt und zusätzlich die gefundenen Dateisegmente in diese Clusterbelegungsliste eingefügt. Ja und beim letzen Punkt geht was schief. Wenn ich den entsprechenden Code ausbau (den kleinen Exitcode Zeile 403 aktivier), dann gibt's keine Probleme, also sollte es doch an dieser Stelle hängen? :gruebel: Also, wie gesagt, für mich sieht das Richtig aus und ich hab keine Ahnung mehr, was los ist PS: wie sieht es denn eigentlich aus ... etwa 1 MB RAM je 10.000 Dateien/Ordner, für eine komplette Kopie des Dateisystems und des VolumeBitmaps, ist doch OK? [add] hab grad mal je vor und nach diesen Code eine Prüfschleife reingemacht und diese schlägt danach sofort zu ... also es liegt definitiv an diesem Codeabschnitt :cry: [edit] Anhang entfernt |
Re: einfügen > doppelt verkettete Liste
Hallo Himitsu,
so richtig verstanden was Du willst hab ich nicht aber ich versuch es mal wenn C ->Result->C2 dann sollte sein
Delphi-Quellcode:
Du hast da aber
c.next:=Result;
result.next=c2; C2.next:= (nil ?) C.prev=(nil ?) result.prev:=c; C2.prev:=result;
Delphi-Quellcode:
damit baust Du so etwas wie einen Ringpuffer auf.
C2.Next := C.Next; // c.next = result!
Außerdem würde ich new anstatt getmem empfehlen, es könnte sonst sein, das Du Speichersalat produzierst. Gruß K-H |
Re: einfügen > doppelt verkettete Liste
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mir extra Mühe gegeben :)
|
Re: einfügen > doppelt verkettete Liste
Liste der Anhänge anzeigen (Anzahl: 1)
New kann ich nicht nehmen, da ...
obwohl, jetzt geht es ja wieder ... also Anfangs war es so, daß ich den Dateinamen direkt an die Records angehängt hatte, somit die Größe der Records nicht konstant war und es deswegen nicht mit New ging. > kann ich ja nun wieder zurückändern also, es gibt ein "C", mit einer bestimmten Länge nun will ich darin einen neuen Wert einfügen
Code:
das war incl. Längenangabe in .Len
vorher nachher
... ... A A A A C C C C C C C Result C Result C Result C C2 C C2 B B B B ... ... A = C.Prev / B = C.Next und hier nochmal im Prinzip
Code:
praktisch "C" aufsplitten und dazwischen das "Result" einfügen
vorher nachher
... ... A A C C B Result ... C2 B ... [add] hab mir auch mal mühe gegeben (meine Paint-Künste sind aber nicht die besten :oops: ) also Aphton kommst schon in die Richtige Richtung ... nur das C2 auch noch nicht existiert im bild: oben vorher und unten nachher |
Re: einfügen > doppelt verkettete Liste
@Aphton
Da bekommt man ja knoten im Großhirn, aber Richtig bleibt richtig. @Himitsu also noch einmal: in einem C hast Du Werte, die Du auf Result und C2 verteilst und C bleibt erhalten. Dann solte das richtig sein
Delphi-Quellcode:
Das sollte richtig sein.
// Datenverteilen hab ich mir geschenkt
// Neue Sätze definieren Result.prev:=C; Result.next:=C2; C2.Prev:=Result; // und verketten // zuerst das untere Ende C2.next:=C.next; C.next.prev:=C2; // und jetzt oben C.next:=Result; Gruß K-H P.s. Ich hab bei solchen listen immer mit Erstsatz, Leztztsatz und Aktsatz gearbeitet das schien mir immer ganz übersichtlich. Falls notwendig hab ich dann noch einen Tempsatz eingeführt. [edit] Denkfehler berichtigt |
Re: einfügen > doppelt verkettete Liste
ahhhhh *shuppenvonaugenfallen*
stümmt, die äußeren Elemente vor und nach C hatte ich ganz vergessen :wall: hab die ganze Zeit nur in diese 3 Datensätze geguckt (hatte davorher schon einen netten Fehler drin) sowas kommt davon, wenn man erst mit 'ner einfach verketten Liste anfängt und es dann auf mehrfachverkettet umbaut :oops: Danke erstmal ... werd gleich nochmal alles durchsehn ... wer weiß wo das noch fehlt :freak: |
Re: einfügen > doppelt verkettete Liste
Liste der Anhänge anzeigen (Anzahl: 1)
falls es wen interessiert ... es waren wirklich nur ein paar falsch geänderte bzw. vergessene Bezüge
Also herzlichen Dank nochmal, für's Augenöffnen :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz