Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mi 31.01.07 21:26 
Hi, kennt ihr schon den neuesten Delphicompiler-Bug?
ich verstehe es überhaupt nicht!
Hier Mein quellcode:
ausblenden 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))); //Wenn ich die Anweisung stehen lasse, gehts alles. Die Schliefe arbeitet eben das ganze array ab.
//Wenn ich sie als kommentar markiere gehts nicht: die erste Schleife von Low to High wird nur einmal abgearbeitet. -> GLEICHE PARAMETRIERUNG!!
    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 user profile iconChristian S.: Topic aus Sonstiges (Delphi) verschoben am Mi 31.01.2007 um 20:28
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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.
ausblenden 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))); //Wenn ich die Anweisung stehen lasse, gehts alles. Die Schliefe arbeitet eben das ganze array ab.
//Wenn ich sie als kommentar markiere gehts nicht: die erste Schleife von Low to High wird nur einmal abgearbeitet. -> GLEICHE PARAMETRIERUNG!!

    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Win 7 Pro
RAD Studio 2010 Pro
BeitragVerfasst: 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... :gruebel:

Gruß, Manina.

_________________
Gates, oder Gates nicht ?
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. :nixweiss:

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 :P

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 01.02.07 07:59 
user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 01.02.07 14:23 
user profile iconJakob Schöttl hat folgendes geschrieben:
user profile iconBenBE 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 :P

_________________
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.