![]() |
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... |
Re: Wert hinter Pointer erhalten
Nein, ich habe es NICHT mit Addr() verwechselt. Ich dachte, dass der Typecast auf Pointer eine Referenzierung bewirkt. ;)
|
Re: Wert hinter Pointer erhalten
Aber in Zukunft bitte nicht mehr die Adressen von lokalen Variablen in globalen Datenstrukturen ablegen, ok?
Gruß Hawkeye |
Re: Wert hinter Pointer erhalten
Zitat:
PS: Wo issn da jetzt eig. ne globale Datenstruktur? |
Re: Wert hinter Pointer erhalten
Zitat:
Zitat:
Gruß Hawkeye |
Re: Wert hinter Pointer erhalten
edit: unwichtig.
|
Re: Wert hinter Pointer erhalten
Ich habe auch nie gesagt, dass das sonderlich schön ist. TStack, TQueue, TList usw. sind nunmal für Klasseninstanzen gedacht. Wenn man primitive Datentypen da reinbasteln will, empfiehlt sich eine eigene Liste oder alternativ eine Wrapper-Klasse wie in Java.
|
Re: Wert hinter Pointer erhalten
Zitat:
|
Re: Wert hinter Pointer erhalten
Moin Cöster,
ich hoffe nur, dass Dir klar geworden ist, dass das Ablegen der Adresse einer lokalen Variablen keine gute Idee ist, da diese nur innerhalb der lokalen Prozedur gültig ist. |
Re: Wert hinter Pointer erhalten
Zitat:
Danke nochmal an alle :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 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