![]() |
Delphi-Version: 10.1 Berlin
Assigned=true bei uninitialisierter Variable ?
Guten Abend,
Delphi-Quellcode:
Ich verwende hier eine lokale Variable für den TServer.
procedure THeaderFooterForm.FormActivate(Sender: TObject);
var server : TServer; begin //server := nil; if not assigned(server) then server := TServer.Create('127.0.0.1',25222,true); server.StopTCPServer; FreeAndNil(server); end; Wenn ich am Anfang "server := nil;" nicht schreibe ist assigned true und das Create Event wird übersprungen. Somit erhalte ich eine exception sobald ich auf die Variable zugreife. Kann mir jemand erklären warum assigned = true ist bei einer lokalen Variable die wie hier zu sehen sonst gar nicht verwendet wird ? Ich kann mir nur vorstellen das per Zufall an dieser Adresse gerade ein Objekt "ist/vorher war" und daher assigned true zurück gibt, ist dies korrekt ? Lokale Variablen werden ja nie initialisiert somit haben diese einen undefinierten Wert. Somit wäre es zwingend notwenig in diesem Fall die Variable zu initialisieren. Gruss Int3g3r |
AW: Assigned=true bei uninitialisierter Variable ?
Assigned heißt ja nichts anderes, als dass die Variable nicht nil ist. Wie Du bereits weißt, sind lokale Variablen nicht initialisiert, da ist die Wahrscheinlichkeit verschwindend gering, dass sie bei ihrer Deklaration eine 0-Entsprechung (also nil) enthält, Assigned gibt also true zurück.
|
AW: Assigned=true bei uninitialisierter Variable ?
Du erzeugst ja lokal nur eine Variable vom Typ TServer. Im Speicher existiert das Object noch gar nicht.
Demnach kannst du dir die Prüfung mit not Assigned an der Stelle schenken. Assigned wird dann immer False bzw. not Assigned immer True liefern. Tut es zumindest bei mir. Die Assinged-Prüfung macht erst NACH dem Create Sinn. Denn erst dann wird der Speicher reserviert und die Adresse zugewiesen, sofern dabei kein Fehler auftritt. Zweitens müsste du nach deinem if Assigned() then auch in einem Block weitermachen.
Delphi-Quellcode:
Noch besser wäre so:
procedure THeaderFooterForm.FormActivate(Sender: TObject);
var server : TServer; begin server := TServer.Create('127.0.0.1',25222,true); if assigned(server) then begin server.StopTCPServer; FreeAndNil(server); end; end;
Delphi-Quellcode:
Assigned solltest du verwenden, wenn bestimmte Codeabschnitte nur ausführbar sind, wenn eine Variable<>nil ist. Um Fehler abzufangen: Try..Except
procedure THeaderFooterForm.FormActivate(Sender: TObject);
var server : TServer; begin try server := TServer.Create('127.0.0.1',25222,true); try server.StopTCPServer; finally FreeAndNil(server); end; except ShowMessage('Server konnte nicht gestartet werden.'); end; end; |
AW: Assigned=true bei uninitialisierter Variable ?
Tja, lokale Variablen sind nunmal per se niemals initialisiert (mit einigen Ausnahmen) und sind potentiell mit Zufallswerten gefüllt,
also musst du vorher irgendwas zuweisen, bevor du den Inhalt prüfen oder auslesen willst. Zufallswerte: einmal 0 oder uber 4 Milliarden Mal was Anderes und die Stochastik lehrt dich, dass du wahrscheinlich meistens keine 0 bekommst. :angle: Zitat:
Fazit: Du darfst die Zuweisung nicht auskommentieren, oder lass sie nutzlose vorherige Zuweisung und das IF-Assigned einfach weg (siehe Vorredner) und initialisiere die Variable mit deiner neuen Instanz. keine Ressourcenschutzblöcke? Wenn es im StopTCPServer knallt, dann hast du ein wunderschönes Speicherleck. |
AW: Assigned=true bei uninitialisierter Variable ?
Zitat:
|
AW: Assigned=true bei uninitialisierter Variable ?
Zitat:
Man vernichtet nicht sinnlos Fehlermeldungen. Weiterer Text als Zusatzinfo ist OK, aber wenn dann mit der Originalmeldung im Fenster (unten zum Aufklappen oder auf Knopfdruck), oder zumindestens in einem Log. |
AW: Assigned=true bei uninitialisierter Variable ?
Zitat:
|
AW: Assigned=true bei uninitialisierter Variable ?
Ups, den falschen gesteinigt.
Dann nehm ich den Felsen erstmal heimlich wieder runter, hat ja niemand gesehn. :stupid: Zitat:
|
AW: Assigned=true bei uninitialisierter Variable ?
Zitat:
|
AW: Assigned=true bei uninitialisierter Variable ?
Vielen Dank für alle Kommentare und Klarstellungen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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