Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TStringList x64 nicht nil (https://www.delphipraxis.net/203372-tstringlist-x64-nicht-nil.html)

venice2 11. Feb 2020 20:57

TStringList x64 nicht nil
 
List sollte eigentlich nil sein ist sie aber nicht, erst bei expliziter Zuweisung

Delphi-Quellcode:
var
  List: TstringList
begin
 
  OpenFile(FileName, List);
end;
Kennt jemand das Problem?

Uwe Raabe 11. Feb 2020 21:00

AW: TStringList x64 nicht nil
 
Zitat:

Zitat von venice2 (Beitrag 1457186)
List sollte eigentlich nil sein ist sie aber nicht, erst bei expliziter Zuweisung

Das ist so und war schon immer so. Abgesehen von reference-counted Typen werden Variablen nicht implizit initialisiert.

venice2 11. Feb 2020 21:03

AW: TStringList x64 nicht nil
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1457187)
Zitat:

Zitat von venice2 (Beitrag 1457186)
List sollte eigentlich nil sein ist sie aber nicht, erst bei expliziter Zuweisung

Das ist so und war schon immer so. Abgesehen von reference-counted Typen werden Variablen nicht implizit initialisiert.

In einer älteren Delphi Version ist es nicht so.
Hier ist meine Liste NIL auch ohne das ich extra
Delphi-Quellcode:
List := nil;


zuweise.

Versuch es einfach mal mit Delphi 2010 das Problem ist mir noch nie aufgefallen und auch noch nie aufgetreten.

Dalai 11. Feb 2020 21:05

AW: TStringList x64 nicht nil
 
Auch ältere Delphis dürften bei derartigem Code gewarnt haben, dass die Variable (möglicherweise) nicht initialisiert ist.

Grüße
Dalai

venice2 11. Feb 2020 21:07

AW: TStringList x64 nicht nil
 
Zitat:

Zitat von Dalai (Beitrag 1457189)
Auch ältere Delphis dürften gewarnt haben, dass die Variable nicht initialisiert ist.

Grüße
Dalai

Nein!
Gehe ich mit der Maus über die Zeile wird mir unter D2010 NIL angezeigt in Delphi 10.3 List()
Und Warnungen sind nicht OFF

TStringList ist doch ein Klasse und wenn diese nicht initialisiert wird sollte diese NIL sein so wie es in D2010 der Fall ist.

Dalai 11. Feb 2020 21:13

AW: TStringList x64 nicht nil
 
Du hattest bisher einfach nur Glück. Lokale Variablen wurden - bis auf Ausnahmen - noch nie initialisiert. Dass (d)ein Delphi 2010 nicht warnt, ist vielleicht ein Bug, vielleicht auch eine Einstellungssache, vielleicht abhängig vom genauen Code.

Grüße
Dalai

venice2 11. Feb 2020 21:17

AW: TStringList x64 nicht nil
 
Zitat:

vielleicht auch eine Einstellungssache
Ok! Habe dann wohl immer glück gehabt wobei ich schon sagte das Alle Warnungen eingeschaltet sind.

Seltsam nur das die x86 Anwendung das klaglos hinnimmt und alles läuft hingegen die x64 nicht.
Kein Beinbruch List := nil; davor zu setzen mir viel das nur auf.

Muss da jetzt nicht weiter drauf rumreiten dann ist es halt so!

p80286 11. Feb 2020 21:29

AW: TStringList x64 nicht nil
 
Wenn Du jede Variable initialisierst weißt Du woran Du bist.

Gruß
K-H

venice2 11. Feb 2020 22:03

AW: TStringList x64 nicht nil
 
Zitat:

Zitat von p80286 (Beitrag 1457196)
Wenn Du jede Variable initialisierst weißt Du woran Du bist.

Gruß
K-H

Eigentlich schon abgeschlossen aber Bitte Bilder sagen mehr als Worte.
Also ich denke mal das es mit Delphi nicht immer nachzuvollziehen ist was der Compiler eigentlich macht.
nil oder doch nicht nil

Mir ging es darum das es eine Nachweisbare Unstimmigkeit gibt.
Das hat mit Glück nichts zu tun es ist immer so. Da soll dann jemand durchblicken, daher auch meine Frage.

Uwe Raabe 11. Feb 2020 22:29

AW: TStringList x64 nicht nil
 
Zitat:

Zitat von venice2 (Beitrag 1457199)
Das hat mit Glück nichts zu tun es ist immer so.

Ist es nicht! Lass mal dieses Programm laufen. Gerne auch mal mit DEBUG und RELEASE spielen und mal mit und ohne Debugger laufen lassen.
Delphi-Quellcode:
Program Project634;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes;

procedure TestList;
var
  List: TStringList;
begin
  if List = nil then
    Writeln('List = nil')
  else
    Writeln('List <> nil');
end;

procedure SetList();
var
  List: TStringList;
begin
  List := TStringList.Create;
  try

  finally
    List.Free;
  end;
end;

procedure ClearList();
var
  List: TStringList;
begin
  List := nil;
end;

procedure Main();
begin
  TestList;
  SetList;
  TestList;
  ClearList;
  TestList;
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.
Seite 1 von 5  1 23     Letzte »    

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