Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ist Pointer(0) = nil? (https://www.delphipraxis.net/145142-ist-pointer-0-%3D-nil.html)

Grolle 24. Dez 2009 21:24

Re: Ist Pointer(0) = nil?
 
Hi,
Zitat:

Zitat von Christian Seehase
Moin Grolle,

was hast Du denn erwartet, was drinsteht?

Na, ganz einfach 0 (s. Quelltext #1). Ich dachte Pointer(0) und nil wäre ein Unterschied.

Viele weihnachtliche Grüße ...

Medium 25. Dez 2009 03:23

Re: Ist Pointer(0) = nil?
 
Naja, NULL heisst das Teil, weil in der Mathematik die 0 ja wirklich Repräsentant von "nichts" ist, und das hat man so übertragen. Ich vermute mal, dass man dann irgendwann gemerkt hat, dass "0" ja durchaus ein definierter Wert ist, und man zusätzlich den Bedarf an einem "undefiniert", bzw. "leer" hatte, der nicht dem definierten Wert 0 entsprechen durfte. Daher ist das Konzept "NULL" vom Wert "0" prinzipiell grundverschieden.

Warum ist es aber oft so, dass dennoch der sehr wohl definierte Wert 0 auftaucht? Das ist in der Art und Weise begründet wie die gängigen Betriebssysteme arbeiten. Der Speicher an der Stelle 0 ist ein vom laufenden Programm aus nicht zugänglicher Bereich. Das eigentliche Programm (=Codesegment) beginnt immer bei einer Adresse > 0, ich glaub bei DOS PE Executables bei $0400 oder $0800, kann mich aber auch irren. Das bot allerdings, egal wie der Wert nun genau ist, die Möglichkeit "0" als Adresse für Pointer zu verwenden, die "undefiniert", also NULL sind. Kein gültiger Pointer würde jemals an Adresse 0 verweisen, da es immer ein illegaler Zugriff wäre (einschlägige Exceptions kennt wohl jeder hier denke ich ;)). Deswegen, und nur deswegen ist unter sehr vielen Programmiersprachen NULL = 0. Die Namensverwandtschaft ist also eigentlich fast eher zufällig, nicht ursächlich.
Unter C bietet diese Konvention u.a. die Möglichkeit Konstrukte wie "if (ObjectVariable) {...}" zu basteln (welche auch sehr oft benutzt werden/wurden). Wenn ObjectVariable nämlich NULL (=0) ist, bewirkt der implizite Cast auf Bool das Ergebnis "false", so dass ohne eigentlichen Vergleich einfach eine Objektvariable wie ein Bool interpretiert werden kann, womit man nun also testen kann ob sich hinter dem Pointer ein erzeugtes Objekt befindet oder nicht (*). Unter Delphi macht man das mit Assigned(), und die C-Schreibweise sollte man auch mittlerweile tunlichst nicht mehr nehmen, da sie nicht grad aktuellen syntaktischen Standards entspricht.

*) Jau, auch hier kann man sich selbst ins Knie schießen und die Instanz freigeben ohne den Pointer zu nullen. Dann zeigt der Pointer nicht auf NULL, hat aber auch keine gültige Instanz hinter sich. Geht unter Delphi auch, man muss nur FreeAndNil() missachten, und nur Instanz.Free() benutzen :)

Aber ich schweife ab...

himitsu 26. Dez 2009 21:00

Re: Ist Pointer(0) = nil?
 
Was du machen kannst:

den inversen Pointer speichern
> die $ffffffff wird als Pointer wohl nie vorkommen (in 'nem 32-Bit-Programm)

oder einen eigenen Wert für nichts/leer definieren, welcher nicht einem Pointer oder NIL in die Quere kommt ... z.B. auch die $ffffffff

oder in deinem Fall ... du nutzt ja keine Pointer, sondern legst einen Index drinnen ab.
Was willst du denn genau erreichen?
Im Prinzip kannst du -1 für keinen Index nehmen (was übrigens auch $ffffffff ist :lol: )
und die restlichen Werte entsprechen einem Index

oder du setzt den Index um 1 hoch, so daß er nun 1-basierend ist und schon hast du die 0 wieder frei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.
Seite 2 von 2     12   

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