![]() |
Verschachtelte Schleifen - Gesamtfortschritt
Ich habe zwei verschachtelte Schleife:
Delphi-Quellcode:
Wie ermittele ich jetzt in der inneren Schleife den Gesamtfortschritt? Ich stehe da irgendwie auf dem Schlauch. :?
for i := 0 to x do
begin while j < y do begin // hier Gesamtfortschritt ermitteln end; end |
Re: Verschachtelte Schleifen - Gesamtfortschritt
i*y+j
wenn j bei 0 anfängt |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Wie meinst du das? Wie wird j erhöht?
|
Re: Verschachtelte Schleifen - Gesamtfortschritt
j wird immer um eins inkrementiert. Und ich sehe, da gibt es noch eine kleine Hürde, vor der while-Schleife wird die Zählvariable der while-Schleife immer auf null gesetzt:
Delphi-Quellcode:
Ich denke, da bräuchte ich eine Hilfsvariable: j_total := j_total + j oder so was.
for i := 0 to x do
begin j := 0; // <-- !!! while j < y do begin j_total := j_total + j // hier Gesamtfortschritt ermitteln end; end @sirius: Ich bräuchte es in Prozent. :oops: |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Naja, dann noch durch y*(x+1) teilen. Aber warum nimmst du eine While-Schleife? Kann es sein, das y hin und wieder schwankt oder j nicht bei 0 anfängt?
Edit: Teil 2 hat sich grad geändert :mrgreen: |
Re: Verschachtelte Schleifen - Gesamtfortschritt
( i*y+j ) / ( x*y ) * 100 = Prozent
Position Maximum |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Richtig sähe es so aus:
Delphi-Quellcode:
Damit wird eine Datei sicher gelöscht durch mehrmaliges Überschreiben mit bestimmten Bitmustern.
PosTotal := 0;
for Pass := 0 to FOverWriteCount do begin // Schreibpuffer füllen for i := 0 to Length(Buffer) div SizeOf(TTrippleByte) - 1 do if (Pass < Low(Mask)) or (Pass > High(Mask)) then begin Buffer[i * SizeOf(TTrippleByte)] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); end else PTrippleByte(@Buffer[i * SizeOf(TTrippleByte)])^ := Mask[Pass]; // Datei überschreiben SetFilePointer(H, 0, nil, FILE_BEGIN); Pos := 0; while Pos < Sectors do begin PosTotal := PosTotal + Pos; // MP SendMessage(Parent, FCM_DELFILE_PROG, Trunc((Pass* (Sectors+PosTotal)) / (FOverWriteCount * Sectors) * 100), 0); i := Min(Sectors - Pos, Length(Buffer) div Integer(SectorSize)); if not WriteFile(H, Buffer[0], i * SectorSize, W, nil) or (Integer(W) <> i * SectorSize) then Exit; Inc(Pos, i); end; end; |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Du tust übrgiens FOverwritecount+1 mal die Datei überschreiben.
Und du durchläufst die Whileschleife in i-Schritten, wobei i anfangs konstant bei "length(buffer) div Sectorsize" und im letzten Durchgang meist auf Sectors-Pos fällt. Damit hat die while-Schleife immer Sectors/(length(buffer) div Sectorsize) Druchläufe (evtl. einen mehr) und die For-Schleife hat FWriteCount+1 Druchläufe. Die musst du nur multiplizieren. |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Ich werde noch mal wahnsinnig:
Delphi-Quellcode:
Das liefert mindestens um den Faktor 1.000 zu hohe Werte. :wall:
PosTotal := 0;
for Pass := 0 to FPassCount - 1 do begin if Assigned(OnShredderPass) then OnShredderPass(self, Pass + 1, FPassCount); // Schreibpuffer füllen for i := 0 to Length(Buffer) div SizeOf(TTrippleByte) - 1 do if (Pass < Low(Mask)) or (Pass > High(Mask)) then begin Buffer[i * SizeOf(TTrippleByte)] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); end else PTrippleByte(@Buffer[i * SizeOf(TTrippleByte)])^ := Mask[Pass]; // Datei überschreiben SetFilePointer(H, 0, nil, FILE_BEGIN); Pos := 0; while Pos < Sectors do begin i := Min(Sectors - Pos, Length(Buffer) div Integer(SectorSize)); if not WriteFile(H, Buffer[0], i * SectorSize, W, nil) or (Integer(W) <> i * SectorSize) then Exit; Inc(Pos, i); if Assigned(OnShredderProgress) then begin PosTotal := PosTotal + Pos; // MP p := ((PosTotal / Sectorsize) / (FPassCount * Sectors/(length(buffer)) / Sectorsize) * 100); // !!! OnShredderProgress(self, Trunc(p)); end; end; end; |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Zitat:
(i*y+j) / ((x+1)*y) * 100 = Prozent |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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