![]() |
TStringList x64 nicht nil
List sollte eigentlich nil sein ist sie aber nicht, erst bei expliziter Zuweisung
Delphi-Quellcode:
Kennt jemand das Problem?
var
List: TstringList begin OpenFile(FileName, List); end; |
AW: TStringList x64 nicht nil
Zitat:
|
AW: TStringList x64 nicht nil
Zitat:
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. |
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 |
AW: TStringList x64 nicht nil
Zitat:
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. |
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 |
AW: TStringList x64 nicht nil
Zitat:
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! |
AW: TStringList x64 nicht nil
Wenn Du jede Variable initialisierst weißt Du woran Du bist.
Gruß K-H |
AW: TStringList x64 nicht nil
Zitat:
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. |
AW: TStringList x64 nicht nil
Zitat:
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. |
AW: TStringList x64 nicht nil
Es ist ganz ausdrücklich dokumentiert, dass lokale Variablen NICHT initialisiert sind.
Jedes andere von Dir beobachtete Verhalten ist als rein zufällig zu beurteilen. |
AW: TStringList x64 nicht nil
@Uwe
Welche Delphi Version? 10.3 oder Delphi 2010! Das ist der Unterschied. 32Bit bitte mit Delphi 2010 nicht mit 10.3 |
AW: TStringList x64 nicht nil
Zitat:
|
AW: TStringList x64 nicht nil
Zitat:
Und ja ich werde bei 64Bit in der Zukunft darauf achten alles vorher zu initialisieren.
Delphi-Quellcode:
Ist immer NIL! Beim ersten Aufruf von TestList Egal wie oft ich die Anwendung starte (D2010)
procedure TestList;
var List: TStringList; begin if List = nil then Writeln('List = nil') else Writeln('List <> nil'); end; Wie schon gesagt hat mit Glück nichts zu tun das ist so gegeben. Unter D2010 scheint eine Initialisierung nicht nötig zu sein darauf wollte ich hinaus. Zitat:
|
AW: TStringList x64 nicht nil
Hallo,
ich werfe mal die Optimierung mit rein. mit Optimierung=nil ohne Optimierung<>nil getest unter D2007 und Compiler-Warnung W1036 "Variable ist möglicherweise nicht initialisiert", die in beiden Fällen angezeigt wird. Damit ist doch alles gesagt. |
AW: TStringList x64 nicht nil
Ich finde diese Diskussion ziemlich müßig. Wenn ich nicht sicher weiß, ob in jeder Delphi-Version das erwartete Verhalten auftritt, dann sorge ich selbst für klare Verhältnisse, indem ich lokale Variablen vor dem ersten Lesezugriff grundsätzlich initialisiere. Dann ist es auch wurscht, ob Delphi XE oder Delphi Schießmichtot oder x32 oder x64.
|
AW: TStringList x64 nicht nil
Halo,
müßig ist es nicht. Es lesen ja auch Anfänger mit (hoffentlich). Und man sollte schon alle Compiler-Warnungen beheben. |
AW: TStringList x64 nicht nil
Es wäre interessant zu wissen was OpenFile macht.
Ist das eine Funktion von Delphi oder eine eigene?
Delphi-Quellcode:
Egal wie man es dreht und wendet. Wenn OpenFile eine Instanz der Liste erzeugt, sollte sie sie auch wieder freigeben.
OpenFile(FileName, List);
Ich vertehe gar nicht, wo man daraus so ein großes Problem machen kann. Wenn man bei sowas einfachen einen Fehler erzeugt, ist der Code schlecht und sollte überdacht werden. |
AW: TStringList x64 nicht nil
Hi Zusammen,
ist es nicht so, dass das einfach nur Speicher reserviert wird für die Variable und und dieser Speicher (gerade nach einem Neustart) mit relativ vielen "0"ern belegt ist? So habe ich mir sowas bisher immre erklärt. Auch ohne Initialisierung hast du so oft nil (als Entsprechung des "leeren" Arbeitsspeichers), aber da im reservierten RAM ja nun mal auch Bytemüll drin stehen kann, ist das nicht sicher gestellt. Unabhängig kann ich nur jeden Entwickler darum bitten Variablen immer zu initialisieren. Der Compiler meckert (zumindest in allen Versionen, die ich in Erinnerung hatte) das nicht umsonst an (in der Standardeinstellung). LG Incocnito |
AW: TStringList x64 nicht nil
Zitat:
Zitat:
Gruß K-H |
AW: TStringList x64 nicht nil
Zitat:
Als ich das Projekt übernommen hatte, hatte ich über 600 Warungen / Hinweise. Da findest du die Wichtigen nicht! :? 2 Wochen, incl. Umbau, hat es gedauert, das auf 0 Fehler zu kürzen. Da kann man auch solche Warnungen erkennen. [/OT] |
AW: TStringList x64 nicht nil
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
|
AW: TStringList x64 nicht nil
Die Sache ist die: lokale Variablen sind nur Speicherbereiche auf dem Stack. Der mag vielleicht bei Programmstart mit 0en initialisiert sein, aber sobald mal ein bisschen Code gelaufen ist liegen an den Stack-Adressen alle möglichen Werte wie alte Rücksprungadressen oder Parameter für Funktionsaufrufe. Wenn eine lokale Variable deklariert wird, wird ihr bloß ein entsprechend großer Bereich auf dem grad verfügbaren Stack zugewiesen. Wenn der Bereich zuvor schon genutzt wurde, dann steht an dieser Speicherstelle mit großer Wahrscheinlichkeit keine 0.
Das kann also grundsätzlich noch nie geklappt haben (außer durch Glück oder vllt. beim Debuggen). |
AW: TStringList x64 nicht nil
Zitat:
außer bei globalen Variablen oder als Objektfelder, aber die sind auch in x64 immer mit 0 initialisiert. |
AW: TStringList x64 nicht nil
Zitat:
|
AW: TStringList x64 nicht nil
Wie ist denn OpenFile deklariert? Ist List evtl. ein var Parameter? Wenn ja, warnt der Compiler nicht.
|
AW: TStringList x64 nicht nil
Zitat:
Delphi-Quellcode:
OpenFile(ip_FileName: AnsiString; var List: TStringList)
|
AW: TStringList x64 nicht nil
Dann gibts natürlich keine Warnung, weil der Compiler davon ausgeht, dass die Liste ggf. in der Funktion angelegt und über den Var-Parameter zurückgegeben wird.
Falls du die Liste in der Funktion nicht erstellst oder komplett neu zuweist ist der var Parameter falsch und sollte weg. |
AW: TStringList x64 nicht nil
Zitat:
Es hat schon einen Grund warum beim initialisieren meiner Klasse die Liste NIL sein muss. Sie wird erst gefüllt wenn OpenFile von außerhalb meiner Klasse aufgerufen wird. Darum ging es aber auch nicht sondern um die Frage warum in x64 nicht NIL und unter x86 = NIL ohne List zu initialisieren. Denke die korrekte Antwort kommt von @hoika. Damit ist die Frage für mich beantwortet. Zitat:
Zitat:
Nur in meinem Fall gibt es keine Warnung sagte ich schon. Warum wurde auch schon geklärt. |
AW: TStringList x64 nicht nil
Zitat:
|
AW: TStringList x64 nicht nil
Zitat:
|
AW: TStringList x64 nicht nil
Zitat:
@Steve hat da schon recht. Benötige ich ein und Ausgabe dann verwende ich 'var' ansonsten den entsprechenden Parameter bei nur Ausgabe out. Un wenn der Compiler hier keine Unterschiede macht (Warnungen betreffend) dann ist da was faul. |
AW: TStringList x64 nicht nil
Zitat:
Bei VAR kommt auch eine Meldung, denn die Variable muß initialisiert sein, damit der Code in der Funktion prüfen kann, ob dort etwas übergeben wurde. (if not assigned then create) Bei OUT geht der Compiler davon aus, dass nichts übergeben wird und somit muß die Variable auch nicht initiaisiert sein. |
AW: TStringList x64 nicht nil
Zitat:
Ich wiederhole mich ungern aber meine Warnungen sind eingeschaltet und ich behandle sie alle. (EDIT) Hätte ich also eine Warnung bekommen wäre diese behandelt worden und die Anwendung wäre nicht abgestürzt. Solche Probleme sind im Nachhinein sehr schwer zu finden. Unter den Voraussetzung hätte ich meine Frage hier gar nicht erst reinstellen müssen. |
AW: TStringList x64 nicht nil
Dann müssen die das aber irgendwann kaputt gemacht haben und sollten den Bug schnell wieder reparieren.
|
AW: TStringList x64 nicht nil
Die Diskussion über varParameter hat jetzt aber nichts mehr mit der ursprünglichen Fragestellung zu tun! Bitte führt sie an anderer Stelle weiter, wenn ihr weiter darüber diskutieren wollt.
|
AW: TStringList x64 nicht nil
Nja, es geht darum dass Variablen initialisiert werden müssen und dass der Compilier dort (eigentlich) auch Warnungen wirft (was aber auch nicht immer funktioniert), wenn man es vergessen hat.
|
AW: TStringList x64 nicht nil
Zitat:
Delphi-Quellcode:
an eine Funktion übergeben wird. Nur ein Zuweisen einer neuen Instanz benötigt
const
Delphi-Quellcode:
(oder
var
Delphi-Quellcode:
). Eine Variable auf eine TStringList hält doch nur einen Pointer auf einen Speicherbereich, was die Veränderung des Speicherbereichs (=Inhalte der TStringList) aber nicht verhindert.
out
Kurz gesagt: Überleg dir ganz genau, ob du das
Delphi-Quellcode:
wirklich brauchst.
var
Grüße Dalai |
AW: TStringList x64 nicht nil
Das worked offenbar as expected:
![]() Zitat:
|
AW: TStringList x64 nicht nil
Zitat:
out ![]() Vielleicht wäre es aber tatsächlich an der Zeit, zumindest optional eine solche Warning einzuführen. Wir haben schließlich 2020 und nicht mehr 1997. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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 by Thomas Breitkreuz