AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wert hinter Pointer erhalten

Ein Thema von Cöster · begonnen am 7. Dez 2006 · letzter Beitrag vom 8. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#1

Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 16:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:10


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:

SomeInt := Integer(IntPtr^); Wobei IntPtr (für "Pointer auf Integer") äquivalent zu Stack.Pop ist.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:16
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:22
Zitat von 3_of_8:
PInteger(Stack.Pop)^
Jap, so geht's. Danke
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:27
Ich muss allerdings sagen, dass Lukes Lösung weniger Overkill hat. Da wird dem Stack der Integer nämlich als Pointer verkauft und reingespeichert.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:36
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
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???
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:39
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".
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:40
@Cöster: Weil beide Zeiger auf "Puffer" zeigen und diese Variable nun einmal "2" enthält?
Zitat von DGL-luke:
bedauerlicherunentschudbarerweise
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 17:59
Ich hatte irgendwie in Erinnerung, dass Pointer(var) das gleiche wie @var macht... egal...
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: Wert hinter Pointer erhalten

  Alt 7. Dez 2006, 18:28
3_of_8 --patch
Ich hatte irgendwie in Erinnerung, dass Addr(var) das gleiche wie @var macht... egal...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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