AGB  ·  Datenschutz  ·  Impressum  







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

Einfaches Addieren klapt nicht!

Ein Thema von litsa · begonnen am 29. Aug 2006 · letzter Beitrag vom 29. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von litsa
litsa

Registriert seit: 6. Jul 2006
Ort: Detmold
51 Beiträge
 
Delphi 2006 Architect
 
#1

Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:17
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:
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;
Danke
Evangelia
Evangelia
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:23
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 Sry, das wars dann doch nicht

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:26
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?
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Daniel B
Daniel B

Registriert seit: 27. Okt 2005
Ort: Dachau
453 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:34
Delphi-Quellcode:
        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;
Steht im Beitrag drin, da wo ein Kommentar ist...
Servus...
  Mit Zitat antworten Zitat
Benutzerbild von litsa
litsa

Registriert seit: 6. Jul 2006
Ort: Detmold
51 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:39
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!
Miniaturansicht angehängter Grafiken
snag-0036_464.jpg  
Evangelia
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:43
Zitat von litsa:
ja und totalsize wird ja auch jedesmal korrekt ermittelt!
Dann brauch ich auch noch einen Kaffee... Ich les immer nur
TotalSize := 0 ; Und dann zum Schluss
Total := Total + TotalSize ; Null bleibt Null.

Oder hast Du uns Code vorenthalten
  Mit Zitat antworten Zitat
Benutzerbild von litsa
litsa

Registriert seit: 6. Jul 2006
Ort: Detmold
51 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:46
Delphi-Quellcode:
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;
...wie gesagt totalsize gibt schon die richtigen werte aus!
Evangelia
  Mit Zitat antworten Zitat
Benutzerbild von Daniel B
Daniel B

Registriert seit: 27. Okt 2005
Ort: Dachau
453 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:50
Mal debuggt um rauszufinden wo die 10MB herkommen?
Servus...
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#9

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:50
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Einfaches Addieren klapt nicht!

  Alt 29. Aug 2006, 09:56
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:31 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