Delphi-PRAXiS

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 11:46


Ist Pointer(0) = nil?
 
Hallo,

ich habe folgenden Code zum schreiben von Items in eine Listbox:
Delphi-Quellcode:
    importArray := explode(',',importList[0]);
    importCount := 0;
    for i := 0 to high(importArray) do
    begin
      ListBox2.Items.AddObject(importArray[i],Pointer(i));
    end;
auslesen:
Delphi-Quellcode:
    if Listbox2.items.Objects[i] = nil then sortArray[i] := -1
    else sortArray[i] := integer(Listbox2.items.Objects[i]);
Beim auslesen bekomme ich beim ersten Item (also Pointer(0)) nil zurück? Warum?

Viele Grüße ...

himitsu 24. Dez 2009 11:50

Re: Ist Pointer(0) = nil?
 
Weil i dort 0 (nil) ist?

Grolle 24. Dez 2009 12:07

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

Zitat von himitsu
Weil i dort 0 (nil) ist?

:? wär ja auch zu schön gewesen.

Neutral General 24. Dez 2009 12:21

Re: Ist Pointer(0) = nil?
 
In anderen Sprachen heißt das Ding übrigens "NULL"-Pointer. Woher diese Bezeichnung bloß kommt? :P :mrgreen:

Christian Seehase 24. Dez 2009 13:14

Re: Ist Pointer(0) = nil?
 
Moin Grolle,

was hast Du denn erwartet, was drinsteht?

alzaimar 24. Dez 2009 13:27

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

Zitat von Neutral General
In anderen Sprachen heißt das Ding übrigens "NULL"-Pointer. Woher diese Bezeichnung bloß kommt?

Vorsicht NULL <> 0.

Have you shone gewoosed, dat the number 0 in english zero hottet und neeshed null? So der Pointer should hotted ZERO, if it eerganed was zoo toone hat mid der number 0?

Doo moosed in dare shoolay nogg bethar aufpassayne.
Oh, Doo gaysed ya garnecked mayor indy shoolay.

Na dann cow dear ayn gooded boog. Leg-C-Cone hayesd dad, gloob egg.

Oudar lass as dear shanken.
Shit, dazoo issays nu oog zoo spayed.

Aygale: Frowlishe Way-nagged-10.

Neutral General 24. Dez 2009 14:05

Re: Ist Pointer(0) = nil?
 
Es gibt mehrere Wörter für 0 im Englischen. Hab mal nachgeschaut. u.a. sind da:

zero
naught/nought
null
nil

:P

alzaimar 24. Dez 2009 14:17

Re: Ist Pointer(0) = nil?
 
Aber hier geht es doch um den Bereich 'IT', oder? Warum hat man also "NULL" bzw. "NIL" gewählt? Lies nochmal.

Zitat:

Zitat von Neutral General
Es gibt mehrere Wörter für 0 im Englischen. Hab mal nachgeschaut. u.a. sind da:

... love, drop, zilch, zip, zippo und ...Neutral... :mrgreen:


:xmas:

Luckie 24. Dez 2009 14:22

Re: Ist Pointer(0) = nil?
 
Du hast noch zwei vergessen:
Im Tennis: Love
und teilweise auch wird die Null auch als Buchstabe "O" gesprochen. Zum Beispiel bei der Jeans von Levis: five-o-one. Aber jetzt wird es offtopic.

Mr_G 24. Dez 2009 14:42

Re: Ist Pointer(0) = nil?
 
Manchmal scheint NULL auch einfach nur die 0 zu sein :gruebel:
Code:
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif

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 21:19 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