![]() |
Wert hinter Pointer erhalten
Hi!
Zunächst einmal: Hab es in der Hilfe und mit der Suchfunktion nicht finden können: In einen TStack füge ich Integer per StackName.Push(@IntegerName) ein. Nun will ich den Integer wieder erhalten, der sich hinter dem Pointer verbirgt, der mir durch StackName.Pop geliefert wird. Wie funktioniert diese Umwandlung? Mit StackName.Pop^ geht's nicht. |
Re: Wert hinter Pointer erhalten
:shock:
Du fügst einen Pointer auf einen Integer ein? Dann pass mal auf, dass dir der nicht wild wird... ich würds so machen:
Delphi-Quellcode:
(nur in Funktionen gekapselt, damit mans besser sieht)
procedure PushInt(Val: Integer);
begin Stack.Push(Pointer(Val)); end; function PopInt: Integer; begin Result := Integer(Stack.Pop); end; Damit sagst du Delphi, es soll den Integer behandeln, als wärs ein Pointer. Du speicherst dann den Integer selber in die Liste und nicht nur die Adresse darauf. EDIT: Vorausgesetzt, du alloziierst den Integer zuvor explizit, damit er beim Prozedurende nicht ungültig wird, kannst du ihn so dereferenzieren:
Delphi-Quellcode:
Wobei IntPtr (für "Pointer auf Integer") äquivalent zu Stack.Pop ist.
SomeInt := Integer(IntPtr^);
|
Re: Wert hinter Pointer erhalten
Aua.
Delphi-Quellcode:
Dann pusht er eine Variable auf den Stack und erhält die Adresse der Variable zurück.
procedure PushInt(Val: Integer);
begin Stack.Push(Pointer(Val)); end; function PopInt: Integer; begin Result := Integer(Stack.Pop); end;
Delphi-Quellcode:
So schon eher.
procedure PushInt(Val: Integer);
begin Stack.Push(@Val); end; function PopInt: Integer; begin Result:=PInteger(Stack.Pop)^; end; EDIT: D'oh... Jetzt verstehe ich das... Klar, Lukes Code geht auch. |
Re: Wert hinter Pointer erhalten
Zitat:
|
Re: Wert hinter Pointer erhalten
Ich muss allerdings sagen, dass Lukes Lösung weniger Overkill hat. Da wird dem Stack der Integer nämlich als Pointer verkauft und reingespeichert.
|
Re: Wert hinter Pointer erhalten
Moment: Kann es sein, dass NUR DGL-Lukes Lösung funzt?
Dieser Code gibt erst 2 und dann 4 zurück:
Delphi-Quellcode:
Folgender hingegen 2mal hintereinander 2 :gruebel:
procedure TForm1.FormCreate(Sender: TObject);
var Stack: TStack; Puffer: Integer; begin Stack := TStack.Create; Puffer := 4; Stack.Push(Pointer(Puffer)); Puffer := 2; Stack.Push(Pointer(Puffer)); ShowMessage(IntToStr(Integer(Stack.Pop))); ShowMessage(IntToStr(Integer(Stack.Pop))); Stack.Free; end;
Delphi-Quellcode:
Warum???
procedure TForm1.FormCreate(Sender: TObject);
var Stack: TStack; Puffer: Integer; begin Stack := TStack.Create; Puffer := 4; Stack.Push(@Puffer); Puffer := 2; Stack.Push(@Puffer); ShowMessage(IntToStr(PInteger(Stack.Pop)^)); ShowMessage(IntToStr(PInteger(Stack.Pop)^)); Stack.Free; end; |
Re: Wert hinter Pointer erhalten
Zusammenfassung, zur besseren verständlichkeit:
- Da ein Integer in die größe des Datentyps "Pointer" reinpasst (sprich identisch ist), kann man durch einen kleinen typecast (den 3_of_8 bedauerlicherunentschuldbarerweise als referenzierung verkannt hat) die Integers direkt in die Liste der Containerklasse speichern. Und auch so wieder rausholen. Das ist "common procedure" für die normalen Delphi-Listentypen. Man kann aber auch: - Einen Integer per New(SomeIntPtr) (typeof(SomeIntPtr) = PInteger) alloziieren und in den Stack nur die Adresse des Integers schreiben, die man dann natürlich beim Pushen ordentlich dereferenzieren muss. EDIT: @Cöster: "Behaviour as usual". |
Re: Wert hinter Pointer erhalten
@Cöster: Weil beide Zeiger auf "Puffer" zeigen und diese Variable nun einmal "2" enthält?
Zitat:
|
Re: Wert hinter Pointer erhalten
Ich hatte irgendwie in Erinnerung, dass Pointer(var) das gleiche wie @var macht... egal...
|
Re: Wert hinter Pointer erhalten
3_of_8 --patch Ich hatte irgendwie in Erinnerung, dass Addr(var) das gleiche wie @var macht... egal... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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