AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Compiler warnt nicht vor nicht initialisierter Variable
Thema durchsuchen
Ansicht
Themen-Optionen

Compiler warnt nicht vor nicht initialisierter Variable

Offene Frage von "jbg"
Ein Thema von Der schöne Günther · begonnen am 28. Mai 2015 · letzter Beitrag vom 29. Mai 2015
Antwort Antwort
Seite 2 von 2     12   
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#11

AW: Compiler warnt nicht vor nicht initialisierter Variable

  Alt 29. Mai 2015, 09:51
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.
Das Verlassen der Schleife kann aber nicht der einzige Grund sein, ersetzt man das break durch ein goto
Delphi-Quellcode:
procedure forProc();
label xx;
var
   myArray: TArray<Single>;
   arrayIndex: Integer;
begin
   for arrayIndex := Low(myArray) to High(myArray) do
      if (arrayIndex = 42) then goto xx;
xx:
   WriteLn(arrayIndex);
   readln;
end;
dann erhält man 3 (in Worten drei) mal die gleiche Warnung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#12

AW: Compiler warnt nicht vor nicht initialisierter Variable

  Alt 29. Mai 2015, 09:56
Das liegt an der Break-Anweisung. Der Compiler stellt nach dem Break den aktuellen Schleifenindex zur Verfügung.
Nein, außerhalb der Schleife ist die Schleifenvariable per se immer "ungültig".

Ja, es kann "zufällig" mal sein, daß die Variable danach noch den selben Wert hat, aber wenn hier eine der möglichen Optimierungen zuschlägt, dann war's das damit.
* der Compiler lässt intern die Zählung eventuell rückwärts laufen, wenn er das für optimaler erachtet
* oder er lässt die Variable wärend der Schleife in einem der CPU-Registier und kopiert es danach natürlich nicht in die Variable auf dem Stack, da das sinnlos wäre, weil laut Definition danach die Schleifenvariable nicht mehr verwendet wird.
* ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#13

AW: Compiler warnt nicht vor nicht initialisierter Variable

  Alt 29. Mai 2015, 15:58
Delphi-Quellcode:
   FUNCTION TestIndex:Boolean;
    LABEL
     Stop;

    VAR
     i: Integer;

    BEGIN
     Result := False;

     FOR i:=0 TO 10 // Schleife 1
      DO ;
     IF i = 8
      THEN ;
// [DCC Warning] Test.pas(12): W1037 FOR-Loop variable 'i' may be undefined after loop

     FOR i:=0 TO 10 // Schleife 2
      DO IF i = 8
          THEN Break;
     IF i = 8
      THEN ;
// Keine Warnung

// Diese Zeilen hinzufügen
// Dann wird es lustig:
     FOR i:=0 TO 10 // Schleife 3
      DO IF i = 8
          THEN GOTO Stop;
  Stop:
     IF i = 8
      THEN ;
[DCC Warning] Test.pas(27): W1037 FOR-Loop variable 'i' may be undefined after loop
[DCC Warning] Test.pas(12): W1037 FOR-Loop variable 'i' may be undefined after loop
[DCC Warning] Test.pas(27): W1037 FOR-Loop variable 'i' may be undefined after loop
[DCC Warning] Test.pas(12): W1037 FOR-Loop variable 'i' may be undefined after loop
    END;
Na ja, vielleicht vom Übergang von früheren Delphiversionen auf Delphi5 an klappte die Technik von Schleife 2 und man konnte sich das Hochzählen einer temporären Variablen parallel zum Schleifenindex sparen. Jedenfalls schien mir das durch die nun fehlende Warnung gerechtfertigt zu sein. Ich habe das dann bis jetzt (D2010) ziemlich intensiv genutzt und bin auch noch nicht hingefallen
Aber was da nach dem Hinzufügen von Schleife 3 angezeigt wird, macht einen natürlich nachdenklich.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#14

AW: Compiler warnt nicht vor nicht initialisierter Variable

  Alt 29. Mai 2015, 16:44
Man könnte noch schauen, was die verschiedenen Compiler dazu sagen (Win64, iOS32, iOS64, OSX, Linux, ...)
und mit oder ohne Generics.
Was sollen die anderes sagen, die haben alles das gleiche Frontend. Nur das Backend ist je unterschiedlich bzw. LLVM.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#15

AW: Compiler warnt nicht vor nicht initialisierter Variable

  Alt 29. Mai 2015, 17:32
Ich dachte Win/Win32 ist immernoch das Alte und noch nix mit LLVM?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#16

AW: Compiler warnt nicht vor nicht initialisierter Variable

  Alt 29. Mai 2015, 20:09
Ich dachte Win/Win32 ist immernoch das Alte und noch nix mit LLVM?
Habe ich was anderes geschrieben? "bzw." heißt nicht dass alles LLVM ist, sondern nur ein Teil (die Mobile-Compiler und BCB64)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:56 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