Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Übergebenes nil erkennen? (https://www.delphipraxis.net/167926-uebergebenes-nil-erkennen.html)

solus 25. Apr 2012 18:54

Delphi-Version: 6

Übergebenes nil erkennen?
 
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

DeddyH 25. Apr 2012 18:57

AW: Übergebenes nil erkennen?
 
Lokale Variablen werden normalerweise nicht initialisiert, Du wirst daher den Pointer händisch auf nil setzen müssen.

[edit] Sry, Willkommen in der DP :dp: [/edit]

solus 25. Apr 2012 19:53

AW: Übergebenes nil erkennen?
 
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

MaBuSE 25. Apr 2012 21:27

AW: Übergebenes nil erkennen?
 
Zitat:

Zitat von solus (Beitrag 1163553)
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
Delphi-Quellcode:
{$message warn 'Hier muss ich noch mal genau prüfen !!!'}
oder
Delphi-Quellcode:
{$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.

Zitat:

Zitat von solus (Beitrag 1163553)
Analoge Frage: Werden globale Variablen initialisert?

Ja, wenn man sie z.B. so definiert:
Delphi-Quellcode:
...
var
  s: string = 'DefaultWert';
  i: Integer = 0;
...

himitsu 25. Apr 2012 22:01

AW: Übergebenes nil erkennen?
 
Zitat:

Zitat von DeddyH (Beitrag 1163550)
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. :angle2:
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.

MaBuSE 25. Apr 2012 22:04

AW: Übergebenes nil erkennen?
 
Zitat:

Zitat von himitsu (Beitrag 1163562)
Wobei der Compiler dafür eigentlich auch eine Warnung werfen sollte, so ala "Variable nicht initialisiert". :angle2:

Ich war schneller :tongue:

Zitat:

Zitat von MaBuSE (Beitrag 1163558)
Der Compiler gibt auch Warnungen beim Compilieren aus.
-> http://www.delphi-treff.de/tutorials...wirds-wichtig/


Stevie 25. Apr 2012 22:15

AW: Übergebenes nil erkennen?
 
Zitat:

Zitat von MaBuSE (Beitrag 1163558)
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.

himitsu 26. Apr 2012 00:00

AW: Übergebenes nil erkennen?
 
Nja, war'n bissl langsamer beim Lesen. :oops:

MaBuSE 26. Apr 2012 00:04

AW: Übergebenes nil erkennen?
 
Zitat:

Zitat von Stevie (Beitrag 1163564)
Zitat:

Zitat von MaBuSE (Beitrag 1163558)
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 26. Apr 2012 00:09

AW: Übergebenes nil erkennen?
 
Zitat:

Zitat von MaBuSE (Beitrag 1163577)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 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