AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

einfügen > doppelt verkettete Liste

Ein Thema von himitsu · begonnen am 3. Jun 2009 · letzter Beitrag vom 3. Jun 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 16: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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

Re: einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 16:50
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
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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 17:06
Ich hab mir extra Mühe gegeben
Miniaturansicht angehängter Grafiken
dah_159.png  
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: einfügen > doppelt verkettete Liste

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

also Aphton kommst schon in die Richtige Richtung ... nur das C2 auch noch nicht existiert

im bild: oben vorher und unten nachher
Miniaturansicht angehängter Grafiken
unbenannt_212.png  
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

Re: einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 17:24
@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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 17:49
ahhhhh *shuppenvonaugenfallen*
stümmt, die äußeren Elemente vor und nach C hatte ich ganz vergessen

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

Danke erstmal ... werd gleich nochmal alles durchsehn ... wer weiß wo das noch fehlt
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: einfügen > doppelt verkettete Liste

  Alt 3. Jun 2009, 22:19
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
Angehängte Dateien
Dateityp: 7z defrag_348.7z (206,6 KB, 3x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 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