Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pointeradresse auslesen (https://www.delphipraxis.net/201931-pointeradresse-auslesen.html)

freimatz 11. Sep 2019 17:20

AW: Pointeradresse auslesen
 
ok, ich habe da etwas falsch verstanden. Mit New weisst Du Eingabe schon etwas zu.

Schau mal auf http://docs.embarcadero.com/products...ystem_New.html

Da steht "The size of the allocated memory block corresponds to the size of the type that P points to.". Weisst du wieviel das ist? Sicher nicht genug um immer alles von deinem Eingabefeld zu speichern.

Was IntToStr(Integer(Eingabe)) zurück gibt kann ich dir gerade nicht sagen. Das könnte davon abhängen ob Du für 32-Bit oder 64-Bit compilierst und wie Integer implementiert ist. Unsere Umstellung auf 64-Bit ist schon länger her und ich habe das vergessen. Da ich nie einen Pointer auf einen Integer caste (weils einfach schlecht ist) brauche ich das auch nicht. (Und nachzuschauen bin ich zu faul)

paul.kunig 11. Sep 2019 17:31

AW: Pointeradresse auslesen
 
Das ist völlig irrelevant, ob der Speicherplatz ausreicht. Es ist lediglich ein Test zum Verständnis von Zeigern.
Wenn ich die Speicheradresse eines Zeigers ausgeben will, muss ich wohl in einen Integer casten, da ich einen Zeiger nicht anzeigen kann.

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

Amateurprofi 12. Sep 2019 01:07

AW: Pointeradresse auslesen
 
@Paul.Kunig:

Zitat:

wieso Delphi 5? Wurde nicht von mir eingetragen.
In der Signatur steht doch Delphi 10 Seattle!
Ja, in der Signatur steht Delphi 10 Seattle
Aber ganz oben in #1 steht: "Delphi-Version: 5"

Amateurprofi 12. Sep 2019 01:35

AW: Pointeradresse auslesen
 
Zitat:

Noch einmal die Frage:
Was gibt IntToStr(Integer(Eingabe)) zurück, wenn, wie in diesem Fall, Eingabe ein Zeiger ist?
Wie ich schon in #2 schrieb : Die Adresse des mit New allozierten Speicherbereichs.

Da freimatz "für 64 Bit Compilieren" ins Spiel brachte:
Es wäre besser IntToStr(NativeInt(Eingabe)) zu schreiben, denn unter 64Bit hat ein Pointer 8 Bytes.
Wenn du unter 64Bit Eingabe nach Integer castest kriegst du nur die unteren 4 Bytes der Adresse,
dagegen, wenn du nach NativeInt castest kriegst du unter 32Bit 4 Bytes und unter 64Bit 8 Bytes.

Amateurprofi 12. Sep 2019 01:51

AW: Pointeradresse auslesen
 
Zitat:

Zitat von freimatz (Beitrag 1445756)
ok, ich habe da etwas falsch verstanden. Mit New weisst Du Eingabe schon etwas zu.

Schau mal auf http://docs.embarcadero.com/products...ystem_New.html

Da steht "The size of the allocated memory block corresponds to the size of the type that P points to.". Weisst du wieviel das ist? Sicher nicht genug um immer alles von deinem Eingabefeld zu speichern.

Was IntToStr(Integer(Eingabe)) zurück gibt kann ich dir gerade nicht sagen. Das könnte davon abhängen ob Du für 32-Bit oder 64-Bit compilierst und wie Integer implementiert ist. Unsere Umstellung auf 64-Bit ist schon länger her und ich habe das vergessen. Da ich nie einen Pointer auf einen Integer caste (weils einfach schlecht ist) brauche ich das auch nicht. (Und nachzuschauen bin ich zu faul)

@freimatz:
Ich hab auch anfänglich gedacht, dass das problematisch sein könnte.
Tatsächlich werden mit New(Eingabe) nur 4 Bytes (ich bin bei 32Bit) auf dem Heap reserviert.
Aber: mit
Code:
Eingabe^ := Edit1.Text;
wird nicht einfach die Zeichenkette zu Eingabe^ kopiert, sondern es wird ein neuer String erzeugt. An Eingabe^ steht dann die Adresse des neu erzeugten Strings also 4 Bytes.

bcvs 12. Sep 2019 07:38

AW: Pointeradresse auslesen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1445729)
Zunächst mal:
Wir sprechen über Delpi 5, wenn ich #1 richtig interpretiere, also String = ShortString.

Auch wenn es hier nicht relevant ist:
<nostalgiemodus>
Delphi 1 : String = ShortString
Delphi 2..2007 : String = AnsiString
</nostalgiemodus>

freimatz 12. Sep 2019 07:51

AW: Pointeradresse auslesen
 
@Amateurprofi: Hm, ja, richtig, daran habe ich nicht gedacht. Also ist der String selber schon ein Pointer - auf dieses komische Konstrukt wo vorne die Grösse und der Refenzzähler gespeichert ist. Dann klappt das trotzdem so, auch wenn es keinen Sinn macht.
<Klugscheiss>Soweit ich weiss wird jedoch bei der Zuweisung der String nicht kopiert sondern erstmal nur die Referenz bis sich einer der beiden ändert.</Klugscheiss>

samso 12. Sep 2019 07:52

AW: Pointeradresse auslesen
 
Zitat:

Zitat von paul.kunig (Beitrag 1445757)
Das ist völlig irrelevant, ob der Speicherplatz ausreicht. Es ist lediglich ein Test zum Verständnis von Zeigern.
Wenn ich die Speicheradresse eines Zeigers ausgeben will, muss ich wohl in einen Integer casten, da ich einen Zeiger nicht anzeigen kann.

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

Leider hast Du Dir zur Erforschung von Zeigern einen Kandidaten ausgesucht, der die Sache kompliziert macht. Ein String ist bereits eine Zeiger. D.h. ^String ist ein Zeiger auf einen Zeiger. Ich würde vorschlagen, dass Du die Sache vielleicht zunächst mal etwas einfacher gestaltest:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Eingabe: ^Integer; // für die Variable "Eingabe" wird Platz auf dem Stack reserviert
begin
  New(Eingabe); // reserviert Platz für den Integer im Speicher
  Eingabe^ := 123; // der reserviert Platz wird mit einem Wert gefüllt

  ShowMessage(IntToStr(Eingabe^) + #13#10 +  // Erwartete Ausgabe "123"
  IntToStr(Integer(Eingabe)) + #13#10 +      // Erwartete Ausgabe: Wert des Zeigers auf "123"
  IntToStr(Integer(@Eingabe)) + #13#10 +     // Erwartete Ausgabe: Adresse der Variablen "Eingabe" (die Adresse auf dem Stack)
  IntToStr(Integer(Addr(Eingabe)))          // wie vorherige Zeile
  );

  Dispose(Eingabe); // gibt den Platz für den Integer wieder frei
end;

samso 12. Sep 2019 08:05

AW: Pointeradresse auslesen
 
Zitat:

Zitat von paul.kunig (Beitrag 1445695)

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

Gruß
Paul

Weil der Wert einer Variablen irgendwo gespeichert werden muss. Deshalb hat jede Variable eine Speicheradresse. In Deinem Fall wird der Wert der Variable auf dem Stack gespeichert. Wenn Du noch tiefer einsteigen willst, dann musst Du Dich mit der CPU beschäftigen.

Amateurprofi 12. Sep 2019 10:36

AW: Pointeradresse auslesen
 
Zitat:

Zitat von bcvs (Beitrag 1445821)
Zitat:

Zitat von Amateurprofi (Beitrag 1445729)
Zunächst mal:
Wir sprechen über Delpi 5, wenn ich #1 richtig interpretiere, also String = ShortString.

Auch wenn es hier nicht relevant ist:
<nostalgiemodus>
Delphi 1 : String = ShortString
Delphi 2..2007 : String = AnsiString
</nostalgiemodus>

Richtig, da hab ich was durcheinander gebracht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 Uhr.
Seite 2 von 3     12 3      

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