Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Pointer Frage (https://www.delphipraxis.net/155721-pointer-frage.html)

DelphiPeter 4. Nov 2010 21:35

Pointer Frage
 
Hallo Leute

also, ich versuche mich gerade an Zeigern, habe aber eine unklare Situation geschaffen.

Ich möchte als Beispiel, eine Stringliste erstellen, zurückgeben will ich den Zeiger als Integer Wert.
Danach möchte ich in die Stringliste etwas einfügen, habe den Wert den ich einfügen will, und den Zeiger auf die Liste als Integer.

WIE kann ich jetzt die Liste greifen und etwas eintragen?

Mein Versuch:

Delphi-Quellcode:
{...}
var
  zeiger: integer;
  p: pointer;
  strl, mylist: tstringlist;
begin
  strl := tstringlist.Create;
  strl.add('Hallo');
  p := @strl;
  zeiger := Integer(p);
  ShowMessage('Der Zeiger als Nummer: '+IntToStr(zeiger));

  mylist := TStringlist(Pointer(zeiger));
  mylist.Add('Welt!');

  ShowMessage(mylist.Text);
{...}

Assarbad 4. Nov 2010 21:36

AW: Pointer Frage
 
Nur als Warnung: dieser Code wird nicht mehr funktionieren, sobald Emb. einen 64bit-Compiler rausbringt.

jfheins 4. Nov 2010 21:40

AW: Pointer Frage
 
Zitat:

Zitat von Assarbad (Beitrag 1059764)
Nur als Warnung: dieser Code wird nicht mehr funktionieren, sobald Emb. einen 64bit-Compiler rausbringt.

Wir beide wissen, dass das keine größe Einschränkung ist :mrgreen:

@Topic: Es ist quasi sinnlos einen Zeiger auf ein Objekt zeigen zu lassen, da eine Objektreferenz bereits ein Zeiger ist.

==>
Delphi-Quellcode:
var
  p: tstringlist;
  strl, mylist: tstringlist;
begin
  strl := tstringlist.Create;
  strl.add('Hallo');
  p := strl;
  ShowMessage('Der Zeiger als Nummer: '+IntToStr(Integer(P)));

  mylist := p;
  mylist.Add('Welt!');

  ShowMessage(mylist.Text);

Assarbad 4. Nov 2010 21:41

AW: Pointer Frage
 
Zitat:

Zitat von jfheins (Beitrag 1059766)
Zitat:

Zitat von Assarbad (Beitrag 1059764)
Nur als Warnung: dieser Code wird nicht mehr funktionieren, sobald Emb. einen 64bit-Compiler rausbringt.

Wir beide wissen, dass das keine größe Einschränkung ist :mrgreen:

In dem Wissen, daß sie daran arbeiten, finde ich es schon sinnlos heute noch Code zu schreiben der nicht vorbereitet ist. :|

jfheins 4. Nov 2010 21:49

AW: Pointer Frage
 
Zitat:

Zitat von Assarbad (Beitrag 1059768)
In dem Wissen, daß sie daran arbeiten, finde ich es schon sinnlos heute noch Code zu schreiben der nicht vorbereitet ist. :|

Okay, ich bin da auch nicht mehr auf dem Laufenden - welcher Integer-Typ entspricht denn dann dem Pointer?

P.S.: Falls das ganze nur so eine Fingerübung ist, um mal ein wenig mit Pointer zu spielen empfehle ich für diesen Zweck records ;)

DelphiPeter 4. Nov 2010 22:00

AW: Pointer Frage
 
Ich glaube ich muss da weiter ausholen.

Ich arbeite mit einem Script Interpreter, die Verarbeitung von Listen, Dateien und anderen Objekten soll so wie folgt laufen:

Beispiel:
Delphi-Quellcode:
{...}
var list integer

list := ListCreate ()
ListAdd (list, 'mein Eintrag 1')
ListAdd (list, 'mein Eintrag 2')
ListSaveToFile (list, 'C:\MeineListe.txt')
ListFree (list)
{...}
Dafür ist es erforderlich, das ich mittels ListCreate eine Stringliste zur Laufzeit erzeuge, und diese Liste Anhand der "Nummer" - also dem Zeiger - identifizieren und verarbeiten kann.

Bummi 4. Nov 2010 22:04

AW: Pointer Frage
 
was spricht gegen

var list Pointer

??

DelphiPeter 4. Nov 2010 22:06

AW: Pointer Frage
 
Gute Idee, aber ich brauche die Adresse der Liste als Ganzzahl

Assarbad 4. Nov 2010 22:15

AW: Pointer Frage
 
Zitat:

Zitat von jfheins (Beitrag 1059769)
Zitat:

Zitat von Assarbad (Beitrag 1059768)
In dem Wissen, daß sie daran arbeiten, finde ich es schon sinnlos heute noch Code zu schreiben der nicht vorbereitet ist. :|

Okay, ich bin da auch nicht mehr auf dem Laufenden - welcher Integer-Typ entspricht denn dann dem Pointer?

In Delphi meines Wissens nach keiner. Im PSDK hat man ULONG_PTR und andere *_PTR deswegen eingeführt.

Bummi 4. Nov 2010 22:22

AW: Pointer Frage
 
Dann kannst Du ihn wie Du vorhattest (und fast alle es tun) als Integer casten.
gegf. habe wir alle Glück und Pointer werden wie Integer bei D64bit beide 8 Byte lang, dann passts eh wieder. ;-)

Assarbad 4. Nov 2010 22:38

AW: Pointer Frage
 
Zitat:

Zitat von Bummi (Beitrag 1059777)
gegf. habe wir alle Glück und Pointer werden wie Integer bei D64bit beide 8 Byte lang, dann passts eh wieder. ;-)

... Leute, ist das echt euer Ernst? :wall:

Warum sagen wir nicht auch allen hier im Forum die noch nicht Delphi 2009 oder neuer haben, daß sie sich um Unicode keine Gedanken machen brauchen? :roll:

Dezipaitor 4. Nov 2010 22:47

AW: Pointer Frage
 
Ich glaube NATIVE_INT gibt es bereits.

Assarbad 4. Nov 2010 22:54

AW: Pointer Frage
 
Zitat:

Zitat von Dezipaitor (Beitrag 1059779)
Ich glaube NATIVE_INT gibt es bereits.

Danke für den Hinweis. NativeInt und NativeUInt lt. XE Doku. :thumb:

Code:
NativeUInt represents a subset of the natural numbers. The range of NativeUInt depends on the current CPU architecture. On a 32-bit architecture, NativeUInt is equivalent to the Cardinal type. On a 64-bit architecture, NativeUInt is equivalent to the UInt64 type.
Soviel Weitsicht hatte ich Emb. nach dem Debakel mit Unicode garnicht mehr zugetraut.

mleyen 5. Nov 2010 07:15

AW: Pointer Frage
 
(Schade nur das in 2007 SizeOf(NativeInt) 8 ergibt :roll:)

himitsu 5. Nov 2010 08:15

AW: Pointer Frage
 
Mit NativeInt würde dann der Code eventuell mal in einem 64-Bit-Compiler laufen, aber jetzt läuft da nix wie gewollt.

Assarbad 5. Nov 2010 11:24

AW: Pointer Frage
 
Aufgrund von:
Zitat:

Zitat von himitsu (Beitrag 1059797)
Mit NativeInt würde dann der Code eventuell mal in einem 64-Bit-Compiler laufen, aber jetzt läuft da nix wie gewollt.

... nehme ich meine voreilige Aussage:

Zitat:

Zitat von Assarbad (Beitrag 1059782)
Soviel Weitsicht hatte ich Emb. nach dem Debakel mit Unicode garnicht mehr zugetraut.

.. zurück. :wall:

mkinzler 5. Nov 2010 11:26

AW: Pointer Frage
 
Wenn MS von der Brücke springt ( Integer bisher wachsender Typ ; neu fester Typ) dann springt CG hinterher ( Integer = Cardinal; neuer wachsender Typ NativeInt)

Assarbad 5. Nov 2010 11:50

AW: Pointer Frage
 
Zitat:

Zitat von mkinzler (Beitrag 1059844)
Wenn MS von der Brücke springt ( Integer bisher wachsender Typ ; neu fester Typ)

Den mußt du erklären, denn ich denke der basiert eher auf einem Mißverständnis über C/C++ (nichtmal MSVC), als auf Tatsachen. Vor allem hält sich MS eben an den Standard (C/C++) statt mal eben aus dem Bauch Entscheidungen zu treffen (siehe Unicode bei Delphi).

himitsu 5. Nov 2010 12:37

AW: Pointer Frage
 
NativeInt war bisher aber nicht wachsend.

Und in einem aktuellen Win32-Programm kann man diesen auch nicht gut für eine Zeigerkonvertierung nutzen, da Pointer und NativeInt aktuell nicht gleich groß sind.


Also was ist da nun mit der vielbeschworenen Abwärtskompatibilität von Delphi?

Assarbad 5. Nov 2010 12:50

AW: Pointer Frage
 
Zitat:

Zitat von himitsu (Beitrag 1059855)
Also was ist da nun mit der vielbeschworenen Abwärtskompatibilität von Delphi?

Keine Ahnung, ich habe die seit spätestens diesem Blogbeitrag von mir nicht mehr "beschworen" :zwinker:

mkinzler 5. Nov 2010 12:51

AW: Pointer Frage
 
Zitat:

Zitat von Assarbad (Beitrag 1059849)
Zitat:

Zitat von mkinzler (Beitrag 1059844)
Wenn MS von der Brücke springt ( Integer bisher wachsender Typ ; neu fester Typ)

Den mußt du erklären, denn ich denke der basiert eher auf einem Mißverständnis über C/C++ (nichtmal MSVC), als auf Tatsachen. Vor allem hält sich MS eben an den Standard (C/C++) statt mal eben aus dem Bauch Entscheidungen zu treffen (siehe Unicode bei Delphi).

Ok dann liegt es halt an c++, nicht an MSVC.

Zitat:

NativeInt war bisher aber nicht wachsend.
Soll nun aber sein.
Zitat:

Also was ist da nun mit der vielbeschworenen Abwärtskompatibilität von Delphi?
Die ist dann konsequenterweise hin

Assarbad 5. Nov 2010 13:06

AW: Pointer Frage
 
Zitat:

Zitat von mkinzler (Beitrag 1059858)
Ok dann liegt es halt an c++, nicht an MSVC.

Erklärt aber noch nicht deinen Kritikpunkt, oder?

Guck mal hier: http://en.wikipedia.org/wiki/C_varia...d_declarations

Da dieser Teil auch in der Schnittmenge von C/C++ enthalten ist sollte die Seite ja reichen für unsere Diskussion. Einen normalen Integer sollte man aber ohnehin nicht einsetzen, sondern ptrdiff_t, size_t und off_t. Und die sind dann an die jeweilige Umgebung angepaßt ... genau das was Delphi eben fehlt :zwinker:

mkinzler 5. Nov 2010 13:08

AW: Pointer Frage
 
Integer war wie string bisher ein generischer Typ in Delphi, also "angepasst". Dieser soll nun aber bei 32Bit eingefroren werden und Allen Bauer beruft sich dabei auf Kompatibilität zu MSVC (bzw. C++).

Assarbad 5. Nov 2010 13:41

AW: Pointer Frage
 
Zitat:

Zitat von mkinzler (Beitrag 1059860)
Integer war wie string bisher ein generischer Typ in Delphi, also "angepasst". Dieser soll nun aber bei 32Bit eingefroren werden und Allen Bauer beruft sich dabei auf Kompatibilität zu MSVC (bzw. C++).

Seltsames Argument von ihm. Aber nun ist's auch klar woher die Aussage stammt. Danke für den Hinweis ;)

p80286 5. Nov 2010 15:13

AW: Pointer Frage
 
Entschuldigt, Ausgangsfrage war doch wohl, wie kann ich einen Pointer als Zahl darstellen.
Da ist meiner Meinung nach ein Integer-Typ ziemlich ungeeignet. Da sollte doch bitte Word/Cardinal oder wie auch immer der richtige 8/16/23/64...Bit Typ heißt herhalten.
Und wenn es zur Darstellung nur Inttostr gibt, dann muß halt ein Wordtostr/Unsigninttostr .. her.

Wenn man denn Zeigerarithmetik treiben will, sollte der Integer unter Umständen auch ziemlich tödlich sein.

Gruß
K-H

Assarbad 5. Nov 2010 15:38

AW: Pointer Frage
 
Zitat:

Zitat von p80286 (Beitrag 1059887)
Da ist meiner Meinung nach ein Integer-Typ ziemlich ungeeignet. Da sollte doch bitte Word/Cardinal oder wie auch immer der richtige 8/16/23/64...Bit Typ heißt herhalten.

Aaaaah, 23, er ist ein Illuminatus *wild-herumlaufend*

Nee, mal im Ernst. Cardinal usw. sind auch Integer-Typen? Oder willst du auf vorzeichenbehaftet oder nicht hinaus?

p80286 5. Nov 2010 16:30

AW: Pointer Frage
 
23=Freitag...

Nee, natürlich das Vorzeichen. Wenn ich nicht unbedingt Rechnen will, ist das für mich so überflüssig wie ein Kropf.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz