![]() |
Compiler warnt nicht vor nicht initialisierter Variable
XE7. Windows, 32 und 64 Bit, Debug und Release.
Folgendes Beispiel:
Delphi-Quellcode:
Die Variable
program Project27;
{$APPTYPE CONSOLE} {$R *.res} procedure forProc(); var myArray: TArray<Single>; arrayIndex: Integer; begin for arrayIndex := Low(myArray) to High(myArray) do if (arrayIndex = 42) then Break; WriteLn(arrayIndex); readln; end; begin forProc(); end.
Delphi-Quellcode:
kann klar undefiniert sein. Zur Laufzeit ist sie es tatsächlich auch, denn das Array ist leer. In der Konsole steht dann z.B.
arrayIndex
Delphi-Quellcode:
.
435345345
Warum warnt der Compiler davor nicht? Kommentiert man das
Delphi-Quellcode:
aus, dann gibt es vernünftigerweise einen
if (arrayIndex = 42) then Break;
Code:
[dcc32 Warnung] Project27.dpr(12): W1037 FOR-Schleifenvariable 'arrayIndex' kann nach Durchlauf undefiniert sein
|
AW: Compiler warnt nicht vor nicht initialisierter Variable
Delphi-Quellcode:
"kann nach Durchlauf undefiniert sein" und "Variable nicht initialisiert" ist ja im Grunde das Selbe Gleiche.
for arrayIndex := Low(myArray) to High(myArray) do
begin if (arrayIndex = 42) then Break; end; WriteLn(arrayIndex); // Die Variable ist außerhalb natürlich undefiniert, da Schleifenvariablen nach der Schleife keinen definierten Zustand besitzen. :roll: Aber man weiß ja, daß der Compiler manchmal nicht ganz weiß was er macht und dann die falsche Fehlermeldung bringt, wobei sie hier natürlich richtig ist, auch wenn es jeweils ein bissl anders klingt. |
AW: Compiler warnt nicht vor nicht initialisierter Variable
Ich verstehe nicht- Bekommst du eine Warnung? Ich nicht.
|
AW: Compiler warnt nicht vor nicht initialisierter Variable
Hab's nicht getestet (hier im XE oder 7), aber es ist/wäre vollkommen korrekt, wenn bei
Delphi-Quellcode:
eine Warnung kommt, daß die Variable dort nicht (mehr) initialisiert ist, denn das ist sie auch nicht.
WriteLn(arrayIndex);
Hab das "nicht" nicht gelesen. Hmmm, entweder ein Bug ... kann daheim dann nochmal nachsehn, aber mir ist so, als wenn da immer gewarnt wurde (wobei ich sowas selten mach) |
AW: Compiler warnt nicht vor nicht initialisierter Variable
Habs mal mit XE2 und XE7 getestet. Gleiches Ergebnis wie Günther schon sagte. Ich erhalte keine Warnung und
Delphi-Quellcode:
gibt Müll aus. Wenn ich die
WriteLn(arrayIndex)
Delphi-Quellcode:
-Prüfung auskommentiere, erhalte ich auch eine W1037-Warnung.
if (arrayIndex ...)
|
AW: Compiler warnt nicht vor nicht initialisierter Variable
Der Compiler kann zur Compilezeit ja nicht wissen dass High(myArray) = -1 ist. Er sieht nur das for-Konstrukt in dem ja theoretisch eine Zuweisung erfolgt.
|
AW: Compiler warnt nicht vor nicht initialisierter Variable
Das liegt an der Break-Anweisung. Der Compiler stellt nach dem Break den aktuellen Schleifenindex zur Verfügung. Kommentiere nur das Break aus, dann dürfte eine Warnung kommen.
|
AW: Compiler warnt nicht vor nicht initialisierter Variable
Aber wir wären uns alle einig dass wir Embarcaderos "Reported Bugs" wieder um eins größer machen sollten, oder?
|
AW: Compiler warnt nicht vor nicht initialisierter Variable
Jupp, so schnell wie möglich melden.
Jede Stunde früher scheint 'nen Monat eher bereinigt zu sein. Man könnte noch schauen, was die verschiedenen Compiler dazu sagen (Win64, iOS32, iOS64, OSX, Linux, ...) und mit oder ohne Generics. |
AW: Compiler warnt nicht vor nicht initialisierter Variable
Höre ich da Sarkasmus?
Win64 hatte ich eingangs auch geprüft, die anderen Plattformen kann ich nicht. Wäre mal interessant. Wäre jemand so freundlich? :angel2: Übrigens: Die
Delphi-Quellcode:
-Schleife ist nicht betroffen.
for..in
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 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