Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#1

einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 15:17
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.


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

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

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
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?


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

[edit]
Anhang entfernt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat