AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pointeradresse auslesen

Ein Thema von paul.kunig · begonnen am 11. Sep 2019 · letzter Beitrag vom 20. Sep 2019
Antwort Antwort
Seite 1 von 3  1 23   
paul.kunig

Registriert seit: 25. Sep 2017
35 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Pointeradresse auslesen

  Alt 11. Sep 2019, 09:38
Delphi-Version: 5
Hallo zusammen,

folgender Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Eingabe: ^String;
begin
  New(Eingabe);
  Eingabe^ := Edit1.Text;

  ShowMessage(Eingabe^ + #13#10 +
  IntToStr(Integer(Eingabe)) + #13#10 +
  IntToStr(Integer(@Eingabe)) + #13#10 +
  IntToStr(Integer(Addr(Eingabe)))
  );

  Dispose(Eingabe);
end;
Führe ich das Ganze aus, erhalte ich folgende Werte:
1) Inhalt des Eingabefeldes
2) Einen Dezimalwert, der auch unter lokale Variablen in der Entwicklungsumgebung als Hexadezimalwert angezeigt wird.
3) Einen siebenstelligen Integer
4) Den selben Integer wie in Punkt 3.

Welcher von diesen Werten ist nun die Speicheradresse des Zeigers und woher kommt der verbliebene Wert?

Gruß
Paul
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
822 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 10:44
Siehe eingefügte Kommentare im Code
Delphi-Quellcode:
var
   Eingabe: ^String;
begin
   New(Eingabe);
   Eingabe^ := Edit1.Text;

   ShowMessage(Eingabe^ + #13#10 + // Der Text aus dem Edit nach Eingabe kopierte Text
   IntToStr(Integer(Eingabe)) + #13#10 + // Adresse des mit New allozierten Speicherbereichs
   IntToStr(Integer(@Eingabe)) + #13#10 + // Adresse der Variablen "Eingabe"
   IntToStr(Integer(Addr(Eingabe))) // dto
   );

   Dispose(Eingabe);
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
paul.kunig

Registriert seit: 25. Sep 2017
35 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 11:00
Hallo Amateurprofi,

danke für deine Antwort. Noch einmal zum Verständnis.

Die Variable "Eingabe" ist eine Typisierter Zeiger.
In diesen Speicherbereich wird der Wert aus dem Eingabefeld gespeichert.

Also sollte ich zwei Werte abrufen können.
1) Den Werte der unter dieser Speicheradresse abgelegt ist.
2) Die Adresse wo der Wert abgelegt ist.

Aus welchem Grund sollte die Variable "Eingabe", die ja ein Zeiger ist, erneut eine Speicheradresse bekommen?

Gruß
Paul
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
822 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 11:24
Hallo Amateurprofi,
Also sollte ich zwei Werte abrufen können.
1) Den Werte der unter dieser Speicheradresse abgelegt ist.
2) Die Adresse wo der Wert abgelegt ist.
Aus welchem Grund sollte die Variable "Eingabe", die ja ein Zeiger ist, erneut eine Speicheradresse bekommen?

Gruß
Paul
Zu 1) und 2):
Kannst und machst Du doch
1) Den Werte der unter dieser Speicheradresse abgelegt ist. Eingabe^ .
2) Die Adresse wo der Wert abgelegt ist. Eingabe .
3) Aus welchem Grund sollte die Variable "Eingabe", die ja ein Zeiger ist, erneut eine Speicheradresse bekommen?
Weil Du mit New(Eingabe) diesen Speicherbereich allozierst und die Adresse dieses Speicherbereichs in Eingabe stellst.

Das New und Dispose kannst Du auch weglassen, indem Du Eingabe als String deklarierst also:
var Eingabe:String; und Eingabe:=Edit1.Text;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
paul.kunig

Registriert seit: 25. Sep 2017
35 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 12:54
Ich möchte den Wert des Eingabefeldes im Heap speichern, daher der Typisierte Zeiger.

Um den Wert aus dem Speicherbereich auszulesen wird dieser dereferenziert, also Eingabe^.
Um die Speicheradresse auszulesen wird @ oder Addr() verwendet.

So weit, so gut.

Wenn ich den Zeiger nicht mit New() erzeuge, gibt es eine Zugriffsverletzung.
Also ist diese Speicherzuweisung notwendig.

Wozu sollte noch eine Adresse für ein und die selbe Variable, in diesem Fall ein Zeiger, benötigt werden.

Wobei diese anscheinend in verschiedenen Bereichen des Speichers abgelegt sind.
Adresse des Zeigers = achtstellig.
Adresse der Variable, die ja der Zeiger ist = siebenstellig.

Es erschließt sich mir nicht, warum die Adresse eines Zeigers in einer Variable gespeichert werden soll, obwohl der Zeiger selber die Möglichkeit bietet sich selber auszulesen.

Was übersehe ich?
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
822 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 13:51
Zunächst mal:
Wir sprechen über Delpi 5, wenn ich #1 richtig interpretiere, also String = ShortString.

Zitat:
Ich möchte den Wert des Eingabefeldes im Heap speichern, daher der Typisierte Zeiger.
.
Was aber aus #1 nicht hervorgeht.

Zitat:
Wenn ich den Zeiger nicht mit New() erzeuge, gibt es eine Zugriffsverletzung.
Also ist diese Speicherzuweisung notwendig.
.
Ja, wenn "Eingabe" als ^String deklariert ist, ist das so.

Zitat:
Wozu sollte noch eine Adresse für ein und die selbe Variable, in diesem Fall ein Zeiger, benötigt werden.
.
"Eingabe" ist die Variable, in der die Adresse des allozierten Speicherbereiches steht.
Der Inhalt von "Eingabe" ist diese Adresse.
Also: Die Variable "Eingabe" und die Adresse des allozierten Speicherbereiches sind nicht dasselbe.
Egal, ob du den Speicher mit New(Eingabe) oder z.B. mit GetMem(Eingabe, SizeOf(String)) allozierst, brauchst du einen Ort, wo die Adresse des allozierten Speichers gespeichert wird

Zitat:
Wobei diese anscheinend in verschiedenen Bereichen des Speichers abgelegt sind.
Adresse des Zeigers = achtstellig.
Adresse der Variable, die ja der Zeiger ist = siebenstellig.
.
"Eingabe" ist eine lokale Variable, die auf dem Stack angelegt wird.
Der mit New allozierte Speicher liegt dagegen auf dem Heap.
Der Stack wächst von oben nach unten, der Heap aber von unten nach oben.
Heap und Stack sind also unterschiedliche Speicherbereiche.

Zitat:
Es erschließt sich mir nicht, warum die Adresse eines Zeigers in einer Variable gespeichert werden soll, obwohl der Zeiger selber die Möglichkeit bietet sich selber auszulesen.
.
Wie stellst Du Dir denn vor zunächst einen Speicherbereich für den Text zu allozieren und anschließend den Text in diesem zu speichern, wenn Du die Adresse des Speicherbereiches nicht irgendwo speicherst?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.326 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 14:09
Ich hoffe doch sehr, die Diskussion ist akademischer Natur. Pointer und Hantiererei mit ihnen (dazu gehört auch die drollige Pointerarithmetik) ist in einer guten Objektorientierten Sprache (ja, auch Delphi gehört dazu) weggekapselt. Durch falschen Behandlung von Pointern (von Speicherverwaltung über Fehladressierungen zu Pufferüberläufen) geht viel zu viel schief, das vermeidbar wäre. Pointer braucht man heutzutage nur noch in extremen Ausnahmefällen wie Aufrufe ungekapselter OS-Methoden oder auch Treibergeschichten.

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
paul.kunig

Registriert seit: 25. Sep 2017
35 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 15:23
Hallo Klaus,

wieso Delphi 5? Wurde nicht von mir eingetragen.

In der Signatur steht doch Delphi 10 Seattle!

Zitat:
Was aber aus #1 nicht hervorgeht.
Ich habe im ersten Thread die komplette Routine hineingeschrieben.
Daraus geht eindeutig hervor, dass es sich um einen Typisierten Zeiger handelt, der meiner Meinung nach im Heap gespeichert wird.

Zitat:
Ja, wenn "Eingabe" als ^String deklariert ist, ist das so.
Ja, ist im ersten Thread klar erkennbar.
Bitte Beitrag richtig lesen, um weitere Verwirrung meinerseits zu vermeiden.

Zudem schreibst du in deiner ersten Antwort, dass
IntToStr(Integer(Eingabe)) + #13#10 + // Adresse des mit New allozierten Speicherbereichs ,

wobei die beiden anderen Aufrufe(@ und Addr()) für Adresswiedergabe zuständig sind.

Also noch einmal:
Wenn "Eingabe" ein Typisierter Zeiger ist, sollte folgendes gelten/funktionieren.

Eingabe^ = Ausgabe des Speicherinhaltes/abgelegten Wertes
IntToStr(Integer(@Eingabe)) = Ausgabe der Speicheradresse
IntToStr(Integer(Addr(Eingabe))) = Ausgabe der Speicheradresse
IntToStr(Integer(Eingabe)) = ? (ohne Dereferenzierung)

Hierbei ist noch folgendes zu erwähnen.
Der zurückgegebene Wert aus IntToStr(Integer(Eingabe)) entspricht genau dem Wert, der in Überwachte Ausdrücke/Lokale Variablen im Feld Wert angezeigt wird, lediglich von Hexadezimal zu Integer umgewandelt.

Was gibt IntToStr(Integer(Eingabe)) zurück, wenn, wie in diesem Fall, Eingabe ein Zeiger ist?

Gruß
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
582 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 16:40
Mit "New(Eingabe)" machst Du einen pointer auf dem Heap. ok.
Du weist Eingabe jedoch nichts zu, in dem Fall ist das IMHO dann undefniert. Eingabe zeigt also irgendwohin.
Mit "Eingabe^ := Edit1.Text;" behandelst du dann das irgendwo als einen String und schreibst da etwas rein.

Wenn Du wirklich die Speicheradresse des Zeigers haben willst, dann wäre das bei dir 3. und 4.
Es nutzt dir aber rein gar nichts wenn du "den Wert des Eingabefeldes im Heap speichern" willst.
  Mit Zitat antworten Zitat
paul.kunig

Registriert seit: 25. Sep 2017
35 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Pointeradresse auslesen

  Alt 11. Sep 2019, 16:54
Wieso weise ich nichts zu?
Der Inhalt(Wert) des Eingabefeldes wird unter der Speicheradresse des Zeigers abgelegt.

@ und Addr() sind laut Delphi für die Ausgabe der Speicheradresse vorgesehen, richtig.

Aber was gibt IntToStr(Integer(Eingabe)) zurück, wenn, wie in diesem Fall, Eingabe ein Zeiger ist?
Ist die Frage so schwer, drücke ich mich falsch aus oder kann ich mein Anliegen nicht klar darstellen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf