Autor |
Beitrag |
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Mi 31.01.07 21:26
Hi, kennt ihr schon den neuesten Delphicompiler-Bug?
ich verstehe es überhaupt nicht!
Hier Mein quellcode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| var StrParts: TStrParts; n,i: integer; p: string; Stop: Boolean;
begin ComboBox_Grundpfad.Items.Clear;
if ListBox_Quelle.Count > 0 then begin Seperate(Listbox_Quelle.Items[0],'\',StrParts); ShowMessage(IntToStr(High(STrParts))); for n := Low(StrParts) to High(StrParts) do begin p := p + StrParts[n] + '\'; if ListBox_Quelle.Count > 1 then for i := 1 to ListBox_Quelle.Count -1 do begin if Pos(p,ListBox_Quelle.Items[i]) <> 1 then begin Stop := True; Break; end; end; if Stop then Break else ComboBox_Grundpfad.Items.Add(p); end; ComboBox_Grundpfad.Itemindex := Combobox_Grundpfad.Items.Count -1; end; end; | Moderiert von Christian S.: Topic aus Sonstiges (Delphi) verschoben am Mi 31.01.2007 um 20:28
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Mi 31.01.07 21:52
Wie immer sitzt der Fehler vorm PC, aber komisch is es weiterhin.
Wenn ich die Variable Stop manuell auf False setze, fliegt er in der Schleife nicht raus.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| var StrParts: TStrParts; n,i: integer; p: string; Stop: Boolean;
begin ComboBox_Grundpfad.Items.Clear;
if ListBox_Quelle.Count > 0 then begin Seperate(Listbox_Quelle.Items[0],'\',StrParts); ShowMessage(IntToStr(High(STrParts))); Stop := False;
for n := Low(StrParts) to High(StrParts) do begin p := p + StrParts[n] + '\'; if ListBox_Quelle.Count > 1 then for i := 1 to ListBox_Quelle.Count -1 do begin if Pos(p,ListBox_Quelle.Items[i]) <> 1 then begin Stop := True; Break; end; end; if Stop then Break else ComboBox_Grundpfad.Items.Add(p); end; ComboBox_Grundpfad.Itemindex := Combobox_Grundpfad.Items.Count -1; end; end; |
Aber normalerweise ist doch eine Boolsche Variable automatisch False?
und warum wurde sie nur durch ShowMessage(IntToStr(High(STrParts))) richtig initialisiert?
-> Daraus lerne ich, dass ich auch Boolsche Variablen immer initialisieren muss!
|
|
Manina
      
Beiträge: 44
Win 7 Pro
RAD Studio 2010 Pro
|
Verfasst: Mi 31.01.07 22:12
Hi Jakob !
Ich erklär mir das so:
Stop ist eine lokale Variable der Procedure, liegt also irgendwo auf dem Stack. Wenn Du die nicht initialisiert, ist ihr Anfangswert nicht definiert, kann also auch TRUE sein !
Auf FALSE initialisiert werden glaub ich nur Variablen, die (z.B. in Private) im Formular definiert sind und beim Create angelegt werden.
Btw: Eigentlich müßte in der Procedure eine Compilerwarnung wegen "Variable nicht initialisiert" kommen...
Gruß, Manina.
_________________ Gates, oder Gates nicht ?
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Mi 31.01.07 22:31
ja, die warnung kam auch, aber ich hab die ignoiert, weil es sonst immer funktioniert hat.
Aber das war wohl immer nur zufall, dass die lokalen Variablen immer False waren.
Was aber komisch ist, dass eben diese eine Anweisung, die überhaupt nichts mit Stop zu tun hat, diese Variable initialisiert oder ändert...
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Mi 31.01.07 22:36
Wahrscheinlich hast du sonst nix gemacht, das Prog hat immer auf den gleichen Speicherbereich zugegriffen und bei der Änderung hats dann halt nich mehr gepasst. 
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Mi 31.01.07 22:37
Die ändert nicht die Variable, sondern den Inhalt des Stacks, auf den der Compiler dann die Variable Stop legt, wenn sie verwendet wird.
|
|
Corpsman
      
Beiträge: 228
KUbuntu 10.4
Lazarus
|
Verfasst: Mi 31.01.07 22:42
Ich hoffe mal das du deine CompilerWarnungen nicht immer ignorierst.
Ich höre gerade eine Compilerbau Vorlesung. Und solche Warnungen werden nicht ohne Grund Geworfen.
Generel Gillt das du Variablen Initialisieren solltest.
Allein schon deswegen weil du nicht weist ob die nächste Compilerversion das nicht vielleicht anders macht, als deine( Siehe die zig tausend verschiedenen C Compiler ). Du könntest sonst irgendwann in die Verlegenheit geraten ein Programm ohne veränderung bei sagen wir mal "nem Kumpel" zu Compileren und auf einmal geht nichts mehr.
_________________ --
Just Try it.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 31.01.07 22:56
Ein Grund dafür, dass Leute mit Sourcen, die Warnungen und Hinweise enthalten, oder bei denen Warnungen und Hinweise in den Projektoptionen abgeschaltet sind, nur widerwillig Hilfe erhalten ...
Es gibt nur ganz wenige Ausnahmen, wo diese Hinweise oder Warnungen ignoriert werden können ... Und für einen solchen Fall schaltet man sie nicht aus, sondern schreib seinen Source syntaktisch um
Ne, mal ernst:
Delphi initialisiert:
- globale Variablen - auf angegebenen Wert ODER 0\nil
- thread-Variablen (behandelt wie globale Variablen)
- mit GetMem angeforderte Speicherbereiche (dazu zählt auch SetLength  ) - Initialisierung mit ZeroMemory
Delphi initialisiert NICHT:
- lokale Variablen
- beliebige Dinge einer Klasse
- alles andere Zeugs, was nicht explizit als Initialisiert gekennzeichnet ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: Do 01.02.07 07:59
BenBE hat folgendes geschrieben: | Delphi initialisiert NICHT:
- lokale Variablen
- beliebige Dinge einer Klasse
- alles andere Zeugs, was nicht explizit als Initialisiert gekennzeichnet ist. |
aber lokale strings sind doch zb. immer EmptyStr
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 01.02.07 11:16
Bei Strings bin ich mir grad nicht so sicher. Da war was. Das kann was anderes sein. Weiß ich aber jetzt nicht aus dem Kopf.
Die initalisiere ich jedenfalls einfach auch mit x := '';, wenn ich danach sowas in der Art mache: x := x + 'd';
Dann bist du auf der sicheren Seite.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 01.02.07 14:23
Jakob Schöttl hat folgendes geschrieben: | BenBE hat folgendes geschrieben: | Delphi initialisiert NICHT:
- lokale Variablen
- beliebige Dinge einer Klasse
- alles andere Zeugs, was nicht explizit als Initialisiert gekennzeichnet ist. |
aber lokale strings sind doch zb. immer EmptyStr |
Darauf sollte man sich nicht verlassen ... und sogar genau prüfen, weil Delphi davor nicht warnt ... Ich hatte aber mal ein Programm, da hab ich vergessen, eine String-Variable zu verwenden ... und wunderte mich, warum das Programm beim Verlassen der Routine über ne halbe Minute brauch ... Nach ein wenig Debugging fand ich dann, dass Delphi beim Verlassen versucht hat, den nicht initialisierten String freizugeben und dabei allen Ernstes ~1,5GB Speicher freigeben wollte (Die Anwendung selber hat keine 10MB benötigt)... Wie gesagt ... Anwendung hing, keinerlei Fehlermeldung und das wegen eines nicht genutzten Strings ... Rein theoretisch gibt Delphi vor, Strings zu initialisieren. Rein praktisch funktioniert das manchmal nicht. Der Grund, warum Delphi dieseInitialisierung intern hat, ist um die Referenzzählung zu initialisieren... Manchmal funktioniert das nur halt nicht 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|