AGB  ·  Datenschutz  ·  Impressum  







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

Ist Pointer(0) = nil?

Ein Thema von Grolle · begonnen am 24. Dez 2009 · letzter Beitrag vom 26. Dez 2009
Antwort Antwort
Seite 2 von 2     12   
Grolle

Registriert seit: 5. Nov 2004
Ort: Coesfeld
1.268 Beiträge
 
Delphi 2010 Professional
 
#11

Re: Ist Pointer(0) = nil?

  Alt 24. Dez 2009, 22:24
Hi,
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 ...

  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Ist Pointer(0) = nil?

  Alt 25. Dez 2009, 04:23
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...
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Ist Pointer(0) = nil?

  Alt 26. Dez 2009, 22:00
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 )
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 03:24 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