AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Übergebenes nil erkennen?

Ein Thema von solus · begonnen am 25. Apr 2012 · letzter Beitrag vom 30. Apr 2012
Antwort Antwort
Seite 1 von 5  1 23     Letzte » 
solus

Registriert seit: 25. Apr 2012
7 Beiträge
 
#1

Übergebenes nil erkennen?

  Alt 25. Apr 2012, 19:54
Delphi-Version: 6
Guten Tag,

ich möchte einer Funktion eine Objektreferenz übergeben, die evtl. nil ist.
Die Funktion soll dann erkennen, ob ein nil übergeben wurde und entsprechend (nicht) reagieren.

Bisher dachte ich, dass Objektvariablen immer auf nil initialisert werden, wie integers immer auf 0 initialisiert werden.

Führe ich aber folgenden Code aus:

Delphi-Quellcode:
var blub : TRandomObject;
begin
if blub=nil then showmessage('1');
tim:=nil;
if blub=nil then showmessage('2');
end;
erscheint nur eine '2'.

Experimente mit assigned(blub) haben auch nicht weitergeholfen.

Mache ich etwas falsch oder muss ich die Objektvariablen manuell auf nil setzen?

Vielen Dank, Viele Grüße,
Solus

Geändert von mkinzler (25. Apr 2012 um 20:30 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Übergebenes nil erkennen?

  Alt 25. Apr 2012, 19:57
Lokale Variablen werden normalerweise nicht initialisiert, Du wirst daher den Pointer händisch auf nil setzen müssen.

[edit] Sry, Willkommen in der DP [/edit]
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
solus

Registriert seit: 25. Apr 2012
7 Beiträge
 
#3

AW: Übergebenes nil erkennen?

  Alt 25. Apr 2012, 20:53
Vielen Dank für die Antwort.

Im eigentlichen Anwendungsfall lag keine lokale Variable sondern ein Feld eines Objekts vor.
Gilt hier dasselbe und sollten die Variablen demnach vom Konstruktor wenn benötigt auf nil gestzt werden?

Analoge Frage: Werden globale Variablen initialisert?

grüße,
solus
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Übergebenes nil erkennen?

  Alt 25. Apr 2012, 22:27
Im eigentlichen Anwendungsfall lag keine lokale Variable sondern ein Feld eines Objekts vor.
Gilt hier dasselbe und sollten die Variablen demnach vom Konstruktor wenn benötigt auf nil gestzt werden?
Grundsätzlich sollte ein Programmierer nie dem Compiler vertrauen und alle Variablen initialisieren.

Der Compiler gibt auch Warnungen beim Compilieren aus.
-> http://www.delphi-treff.de/tutorials...wirds-wichtig/

Versuche grundsätzlich Deine Anwendung so zu schreiben, dass keine Warnungen und Hinweise auftreten.

Ausnahme: Warnungen die Du selbst einbaust {$message warn 'Hier muss ich noch mal genau prüfen !!!'} oder {$message hint 'TODO: Quellcode muss noch kommentiert werden, damit es auch ein anderer versteht ;)'} .
Wenn Du Deinen Code immer sauber hällst, fallen solche eigenen Hinweise und Warnungen natürlich auf und animieren Dich das angemahnte auch zu tun.

Analoge Frage: Werden globale Variablen initialisert?
Ja, wenn man sie z.B. so definiert:
Delphi-Quellcode:
...
var
  s: string = 'DefaultWert';
  i: Integer = 0;
...
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Übergebenes nil erkennen?

  Alt 25. Apr 2012, 23:01
Lokale Variablen werden normalerweise nicht initialisiert, Du wirst daher den Pointer händisch auf nil setzen müssen.
Wobei der Compiler dafür eigentlich auch eine Warnung werfen sollte, so ala "Variable nicht initialisiert", aber das wurde glaub ich schon erwähnt.
Genauso wird auch erwähnt, wenn man Variablen setzt und ihre Werte nirgends verwendet.

Globale Variablen und Felder in Objekten werden immer mit 0 initialisiert (also auch nil und Leerstrings '').
Aber bei lokalen Variablen werden nur bestimmte Typen automatisch initialisiert. Nur jene, welche automatisch von Delphi verwaltet werden. (Strings, dynamische Arrays und Interfaces)

Zitat:
Ja, wenn man sie z.B. so definiert:
Nein, diese werden immer initialisiert.
Nur kann man einen alternativen Initialwert vorgeben.
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. Apr 2012 um 23:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Übergebenes nil erkennen?

  Alt 25. Apr 2012, 23:04
Wobei der Compiler dafür eigentlich auch eine Warnung werfen sollte, so ala "Variable nicht initialisiert".
Ich war schneller

Der Compiler gibt auch Warnungen beim Compilieren aus.
-> http://www.delphi-treff.de/tutorials...wirds-wichtig/
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.007 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Übergebenes nil erkennen?

  Alt 25. Apr 2012, 23:15
Grundsätzlich sollte ein Programmierer nie dem Compiler vertrauen und alle Variablen initialisieren.
Ich frag mich gerade, ob du selber deinen Bytecode schreibst, wenn du das nicht tust. Dass Felder initialisiert werden, ist dokumentiertes Verhalten. Ordinalwerte sind 0, Boolean ist False, Zeiger sind nil, Strings sind leer.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Übergebenes nil erkennen?

  Alt 26. Apr 2012, 01:00
Nja, war'n bissl langsamer beim Lesen.
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. Apr 2012 um 01:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Übergebenes nil erkennen?

  Alt 26. Apr 2012, 01:04
Grundsätzlich sollte ein Programmierer nie dem Compiler vertrauen und alle Variablen initialisieren.
Ich frag mich gerade, ob du selber deinen Bytecode schreibst, wenn du das nicht tust. Dass Felder initialisiert werden, ist dokumentiertes Verhalten. Ordinalwerte sind 0, Boolean ist False, Zeiger sind nil, Strings sind leer.
Wenn es dokumentiert ist, ist das was anderes.
Meines Wissens ist es nur für Strings doumentiert.

[edit]Undokumentiere Dinge, die man "nur" durch ausprobieren weiss, können sich ja jederzeit bei einem Versionswechsel ändern.[/edit]

Wo steht das denn in der Doku?
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)

Geändert von MaBuSE (26. Apr 2012 um 01:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Übergebenes nil erkennen?

  Alt 26. Apr 2012, 01:09
Wo steht das denn in der Doku?
Ich habs gerade gefunden:
In der Delphi Hilfe steht ( http://docwiki.embarcadero.com/RADStudio/XE2/de/Variablen )
Lokale Variablen können nicht in ihren Deklarationen initialisiert werden. Aufeinander folgende Variablendeklarationen (z. B. var X, Y, Z: Real;) dürfen weder Initialisierungen enthalten noch Deklarationen von Varianten und Dateitypen.

Wenn Sie eine globale Variable nicht explizit initialisieren, wird sie vom Compiler mit 0 initialisiert. Objektinstanzdaten (Felder) werden auch mit 0 initialisiert. Auf der Wiin32-Plattform ist der Inhalt von lokalen Variablen so lange undefiniert, bis ein Wert zugewiesen wird.

Der bei der Deklaration einer Variablen zugewiesene Speicher wird automatisch freigegeben, wenn die Variable nicht mehr benötigt wird. Lokale Variablen werden freigegeben, wenn die Prozedur oder Funktion beendet wird, in der sie deklariert sind. Weitere Informationen über Variablen und die Verwaltung des Speichers finden Sie unter Speicherverwaltung.

Wobei 0 <> nil um die Frage vom Threadersteller zu beantworten.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:48 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