![]() |
Einfaches Addieren klapt nicht!
Sorry für den langen code aber kann mir bitte jemand sagen wo hier der Fehler is?! Und zwar wird die Summe nicht richtig ausgegeben (s. Kommentar):
Delphi-Quellcode:
Danke
procedure TDFSMain.Button5Click(Sender: TObject);
var shcount, i, edtop: integer; dirs: array[0..20] of string; Total: cardinal; begin try Label5.Show; for i := 0 to 20 do begin if TEdit(Findcomponent('T' + IntToStr(i))) <> nil then TEdit(Findcomponent('T' + IntToStr(i))).Destroy; if TEdit(Findcomponent('p' + IntToStr(i))) <> nil then TEdit(Findcomponent('P' + IntToStr(i))).Destroy; if TEdit(Findcomponent('s' + IntToStr(i))) <> nil then TEdit(Findcomponent('S' + IntToStr(i))).Destroy; end; if TEdit(Findcomponent('sum')) <> nil then TEdit(Findcomponent('sum')).Destroy; finally //ProgressBar1.Position := 0; //ProgressBar1.Update; Total := 0; Totalsize := 0; shcount := grFS.RowCount; edtop := 40; for i := 0 to shcount - 1 do begin with TEdit.Create(self) do begin Name := 'T' + IntToStr(i); parent := FSPC6; Left := 8; Top := edtop + 32; edtop := Top; Width := 121; Clear; Show; ReadOnly := True; Font.Color := clBlue; Text := grFS.Cells[0, i]; end; end; edtop := 40; for i := 0 to shcount - 1 do begin with TEdit.Create(self) do begin Name := 'P' + IntToStr(i); parent := FSPC6; Left := 136; Top := edtop + 32; edtop := Top; Width := 513; Clear; Show; ReadOnly := True; Font.Color := clGreen; Text := grFS.Cells[1, i]; dirs[i] := Text; end; end; edtop := 40; for i := 0 to shcount - 1 do begin with TEdit.Create(self) do begin Name := 'S' + IntToStr(i); totalsize := 0; parent := FSPC6; Left := 656; Top := edtop + 32; edtop := Top; Width := 121; ReadOnly := True; Clear; Show; try find(dirs[i]); //hier werden die ordnergrössen richtig ermittelt(gecheckt).. Text := FormatBytes(totalsize); //..und richtig ausgegeben Total := Total + Totalsize; //lediglich die Summe ist hier falsch! finally end; end; end; Label6.Top := edtop + 36; Label6.Left := 572; Label6.Visible := True; with TEdit.Create(self) do begin Name := 'sum'; parent := FSPC6; Left := 656; Top := edtop + 32; edtop := Top; Width := 121; ReadOnly := True; Font.Color := clRed; Clear; Show; Text := FormatBytes(total); end; //ProgressBar1.Position := 100; Label5.Hide; end; end; Evangelia |
Re: Einfaches Addieren klapt nicht!
Die Variable Total ist lokal, und nach der Zuweisung (Addition) wird nicht mehr darauf zugegriffen, also wird diese Anweisung vom Compiler wegoptimiert.
Abhaengig von deiner DelphiVersion (ab 7 isses sicher drinnen, vorher weiss ichs nich) siehst du links vom Code kleine blaue Punkte. Diese Punkte zeigen dir, ob diese Zeile Code miteinkompiliert wurde oder nicht. Dem Wegoptimieren entgegenwirken kannst du, in dem du a) im weiteren Ablauf der Prozedur nochmal (lesend) darauf zugreifst, oder b) die Flags {$O+/-} verwendest, naeheres dazu findest du in der OH unter F1. d'oh, ich hab das Text := FormatBytes(total); uebersehn :oops: Sry, das wars dann doch nicht greetz Mike |
Re: Einfaches Addieren klapt nicht!
ich sehe nirgends, wo Total oder Totalsize berechnet werden, sie werden nur auf 0 gesetzt.
Oder muss ich erst noch einen Kaffee trinken gehen, damit ich das finde? |
Re: Einfaches Addieren klapt nicht!
Delphi-Quellcode:
Steht im Beitrag drin, da wo ein Kommentar ist...
try
find(dirs[i]); //hier werden die ordnergrössen richtig ermittelt(gecheckt).. Text := FormatBytes(totalsize); //..und richtig ausgegeben Total := Total + Totalsize; //lediglich die Summe ist hier falsch! finally end; |
Re: Einfaches Addieren klapt nicht!
Liste der Anhänge anzeigen (Anzahl: 1)
ja und totalsize wird ja auch jedesmal korrekt ermittelt!
hier mal ein screenshot wobei die 2 ordner wirklich so groß sind nur die summe ist absurd! |
Re: Einfaches Addieren klapt nicht!
Zitat:
Delphi-Quellcode:
Und dann zum Schluss
TotalSize := 0 ;
Delphi-Quellcode:
Null bleibt Null.
Total := Total + TotalSize ;
Oder hast Du uns Code vorenthalten :gruebel: |
Re: Einfaches Addieren klapt nicht!
Delphi-Quellcode:
...wie gesagt totalsize gibt schon die richtigen werte aus!
procedure Find(Str: string);
var MySearch: TSearchRec; FindResult: Integer; begin FindResult:=FindFirst(Str+'\*.*', faAnyFile, MySearch); while FindResult=0 do begin if ((MySearch.Attr and faDirectory) = faDirectory) and (MySearch.Name<>'.') and (MySearch.Name<>'..') then Find(Str + '\' + MySearch.Name) else TotalSize:=TotalSize+MySearch.Size; FindResult:=FindNext(MySearch); end; SysUtils.FindClose(MySearch); end; |
Re: Einfaches Addieren klapt nicht!
Mal debuggt um rauszufinden wo die 10MB herkommen?
|
Re: Einfaches Addieren klapt nicht!
Du kriegst einen Overflow. Ein Cardinal ist ein Unsigned-32Bit-int. D.h. sein Zahlenbereich geht von 0 bis 4294967295. Wenn du deine 2 Zahlen addierst, merkst du, dass du knapp darueber hinausschiesst.
Was man dagegen tun kann: Total als Int64 deklarieren, dessen Zahlenbereich sollte vorerst mal reichen ;) greetz Mike PS: Ich geh mal davon aus, dass das nicht der gesamte Code is. Ansonsten isses ziemlich raetselhaft, wie 10.27 MB ins Editfeld kommen :zwinker: |
Re: Einfaches Addieren klapt nicht!
Moin litsa,
und um die Ausführungen von Mike zu komplettieren: In den Projektoptionen kannst Du auf dem Tab "Compiler" unter "Laufzeit-Fehler" die Option für die Prüfung eines Integer-Überlaufes aktivieren. Wenn Du das während der Testphase machst sorgen solche Fehler für eine Fehlermeldung. Nicht vergessen, das später wieder rauszunehmen, da die Prüfungen das Programm sonst grösser und langsamer machen. |
Re: Einfaches Addieren klapt nicht!
Zitat:
Zitat:
Nun hab aber ich ein Problem beim FormatBytes wenn Total: int64; (und genauso wenn Totalsize: int64;):
Delphi-Quellcode:
Formatbytes(Total) ergibt immer noch 10,27MB (obwohl wie gesagt Total ohne format richtig is). Wie komm ich jetzt da raus?!
function FormatBytes(const Bytes : cardinal):string;
begin if Bytes < 1024 then begin Result := Format('%s', [IntToStr(Bytes)]) + ' B'; Exit; end; if (Bytes >= 1024) and (Bytes < (1024 * 1024)) then begin Result := Format('%n', [Bytes / 1024]) + ' KB'; Exit; end; if (Bytes >= (1024*1024)) and (Bytes < (1024 * 1024 * 1024)) then begin Result := Format('%n', [Bytes / (1024 * 1024)]) + ' MB'; Exit; end; if Bytes >= (1024*1024*1024) then begin Result := Format('%n', [Bytes / (1024 * 1024 * 1024)]) + ' GB'; Exit; end; end; |
Re: Einfaches Addieren klapt nicht!
Moin litsa,
Code:
wenn schon, dann auch überall ändern ;-)
function FormatBytes(const Bytes : [b][color=red]cardinal[/color][/b]):string;
|
Re: Einfaches Addieren klapt nicht!
Zitat:
Zitat:
Supi kann jetzt sagen bin ein glückliches Mädel da dies auch gelöst wurde!! Ich danke euch allen :) Gruß Evangelia |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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 by Thomas Breitkreuz