AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Assigned=true bei uninitialisierter Variable ?

Ein Thema von Int3g3r · begonnen am 25. Jun 2020 · letzter Beitrag vom 13. Jul 2020
Antwort Antwort
Seite 1 von 2  1 2      
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#1

Assigned=true bei uninitialisierter Variable ?

  Alt 25. Jun 2020, 17:44
Delphi-Version: 10.1 Berlin
Guten Abend,

Delphi-Quellcode:
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;
Ich verwende hier eine lokale Variable für den TServer.
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 25. Jun 2020, 17:55
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#3

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 25. Jun 2020, 18:27
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:
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;
Noch besser wäre so:
Delphi-Quellcode:
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;
Assigned solltest du verwenden, wenn bestimmte Codeabschnitte nur ausführbar sind, wenn eine Variable<>nil ist. Um Fehler abzufangen: Try..Except
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (25. Jun 2020 um 18:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 25. Jun 2020, 19:17
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.

Zitat:
Delphi-Quellcode:
var server : TServer;
begin
   //server := nil;
   if not assigned(server) then
Ich hoffe mal der Compiler hat dich korrekt ausgemeckert, dass du auf eine uninitialisierte Variable zugreifst.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Jun 2020 um 19:24 Uhr)
  Mit Zitat antworten Zitat
Heimlich

Registriert seit: 1. Apr 2020
11 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 26. Jun 2020, 10:36
Noch besser wäre so:
Delphi-Quellcode:
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;
Was ist, wenn der Fehler in StopTCPServer passiert, dort aber keine Fehlerbehandlung erfolgt?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 26. Jun 2020, 11:30
Zitat von Hobbycoder:
Noch besser wäre so
Nicht wirklich.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Jun 2020 um 12:11 Uhr) Grund: oops, der Falsche
  Mit Zitat antworten Zitat
Heimlich

Registriert seit: 1. Apr 2020
11 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 26. Jun 2020, 12:09
Noch besser wäre so
Nicht wirklich.

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.
Ist mir eigentlich ziemlich wurscht, da Du den Falschen zitiert hast. Das try..except wird einfach falsch verwendet und die Meldung ist auch Fail. Kann richtig sein, muss aber nicht. Die Meldung kann zu Zeitverschwendung bei der Fehlersuche führen.

Geändert von Heimlich (26. Jun 2020 um 12:09 Uhr) Grund: Korrektur Schreibweise
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 26. Jun 2020, 12:13
Ups, den falschen gesteinigt.
Dann nehm ich den Felsen erstmal heimlich wieder runter, hat ja niemand gesehn.

Zitat von Heimlich:
Die Meldung kann zu Zeitverschwendung bei der Fehlersuche führen.
Und jupp, genau deswegen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#9

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 26. Jun 2020, 14:40
Ist mir eigentlich ziemlich wurscht, da Du den Falschen zitiert hast. Das try..except wird einfach falsch verwendet und die Meldung ist auch Fail. Kann richtig sein, muss aber nicht. Die Meldung kann zu Zeitverschwendung bei der Fehlersuche führen.
Die Meldung mit ShowMessage diente mehr der Veranschaulichung. Was ist denn bitte an dem try..except falsch, außer er Tatsache dass man statt der Meldung eine Fehlercode ausgeben könnte? Wie und Welche Fehlermeldung der TE ausgeben will weiß ich doch nicht und könnte er auch selber machen.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Assigned=true bei uninitialisierter Variable ?

  Alt 9. Jul 2020, 16:20
Vielen Dank für alle Kommentare und Klarstellungen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:31 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