Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi einfügen > doppelt verkettete Liste (https://www.delphipraxis.net/135034-einfuegen-doppelt-verkettete-liste.html)

himitsu 3. Jun 2009 15:17


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:
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;
Ich kann da jedenfalls keinen Fehler entdecken :nerd:

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

p80286 3. Jun 2009 15:50

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:
c.next:=Result;
result.next=c2;
C2.next:= (nil ?)
C.prev=(nil ?)
result.prev:=c;
C2.prev:=result;
Du hast da aber
Delphi-Quellcode:
C2.Next      := C.Next; // c.next = result!
damit baust Du so etwas wie einen Ringpuffer auf.
Außerdem würde ich new anstatt getmem empfehlen, es könnte sonst sein, das Du Speichersalat produzierst.

Gruß
K-H

Aphton 3. Jun 2009 16:06

Re: einfügen > doppelt verkettete Liste
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mir extra Mühe gegeben :)

himitsu 3. Jun 2009 16:09

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:
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
das war incl. Längenangabe in .Len

und hier nochmal im Prinzip
Code:
vorher     nachher

...        ...
A          A
C          C
B          Result
...        C2
            B
            ...
praktisch "C" aufsplitten und dazwischen das "Result" einfügen


[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

p80286 3. Jun 2009 16:24

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:
// 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;
Das sollte richtig sein.
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

himitsu 3. Jun 2009 16:49

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:

himitsu 3. Jun 2009 21:19

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 12:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz