Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wert hinter Pointer erhalten (https://www.delphipraxis.net/82070-wert-hinter-pointer-erhalten.html)

Cöster 7. Dez 2006 16:46


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.

DGL-luke 7. Dez 2006 17:10

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:
procedure PushInt(Val: Integer);
begin
  Stack.Push(Pointer(Val));
end;

function PopInt: Integer;
begin
  Result := Integer(Stack.Pop);
end;
(nur in Funktionen gekapselt, damit mans besser sieht)

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:
SomeInt := Integer(IntPtr^);
Wobei IntPtr (für "Pointer auf Integer") äquivalent zu Stack.Pop ist.

3_of_8 7. Dez 2006 17:16

Re: Wert hinter Pointer erhalten
 
Aua.

Delphi-Quellcode:
procedure PushInt(Val: Integer);
begin
  Stack.Push(Pointer(Val));
end;

function PopInt: Integer;
begin
  Result := Integer(Stack.Pop);
end;
Dann pusht er eine Variable auf den Stack und erhält die Adresse der Variable zurück.

Delphi-Quellcode:
procedure PushInt(Val: Integer);
begin
  Stack.Push(@Val);
end;

function PopInt: Integer;
begin
  Result:=PInteger(Stack.Pop)^;
end;
So schon eher.

EDIT: D'oh... Jetzt verstehe ich das... Klar, Lukes Code geht auch.

Cöster 7. Dez 2006 17:22

Re: Wert hinter Pointer erhalten
 
Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
PInteger(Stack.Pop)^

Jap, so geht's. Danke

3_of_8 7. Dez 2006 17:27

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.

Cöster 7. Dez 2006 17:36

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:
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;
Folgender hingegen 2mal hintereinander 2 :gruebel:
Delphi-Quellcode:
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;
Warum???

DGL-luke 7. Dez 2006 17:39

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".

Khabarakh 7. Dez 2006 17:40

Re: Wert hinter Pointer erhalten
 
@Cöster: Weil beide Zeiger auf "Puffer" zeigen und diese Variable nun einmal "2" enthält?
Zitat:

Zitat von DGL-luke
bedauerlicherunentschudbarerweise

:mrgreen:

3_of_8 7. Dez 2006 17:59

Re: Wert hinter Pointer erhalten
 
Ich hatte irgendwie in Erinnerung, dass Pointer(var) das gleiche wie @var macht... egal...

Dax 7. Dez 2006 18:28

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 19:01 Uhr.
Seite 1 von 2  1 2      

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