| Autor |
Beitrag |
LastRide
      
Beiträge: 47
|
Verfasst: Sa 05.07.08 21:58
Hi,
Ich habe mal eine Frage und zwar wollte ich gerne den Inhalt einer Adresse ändern. Dazu weiß ich ist es notwendig einen Zeiger zu definieren :stolzsei: xD.
Wenn ich das richtig Verstanden habe definiere Ich den Zeiger so
Delphi-Quelltext 1: 2:
| var zeiger: ^TDaten; |
Und wenn ich es jetzt weiter Richtig verstehe muss ich ihm im Heap Speicher reservieren was wie folgt funktioniert.
Delphi-Quelltext
Jetzt kommt aber der Punkt an dem ich nicht weiter weiß und zwar wie lege ich jetzt die Adresse auf den Zeiger, lese den Inhalt aus und veränder diesen dann?
Wäre euch sehr dankbar wenn mir da jemand auf die Sprünge helfen könnte.
MfG
LastRide
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Sa 05.07.08 22:05
Sobald du Speicher mit new reservierst, ist die Adresse auf dem Zeiger. Das machst du damit ja gerade
Um nun den Inhalt zuzuweisen (und auszulesen) musst du dereferenzieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var zeiger : ^Integer;
begin new(zeiger); zeiger^ := 5; ShowMessage(IntToStr(zeiger^)); .. |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
LastRide 
      
Beiträge: 47
|
Verfasst: Sa 05.07.08 22:09
Das heißt ich setze für "5" jetzt einfach meine Adresse ein und schon wird mir der Inhalt angezeigt?
MfG LastRide
Edit: Ich habe falsch gedacht, sry. Wie Schaffe ich es denn dem Zeiger eine bestimmte Adresse zu Übergeben also nicht mit New(Zeiger) ihm seine eigene zu geben ?
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Sa 05.07.08 22:19
Mit dem @ Operator. (new brauchst du dann nicht) Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var daten: TMeineDaten; zeiger: ^TMeineDaten; begin daten := TMeineDaten.Create;
zeiger := @daten; |
Wichtig: wenn man einen Zeiger auf eine Lokale Variable setzt, so muss man bedenken dass diese dann nach dem Funktionsaufruf wieder freigegeben wird. Soll der Zeiger auch nach dem Funktionsaufruf noch auf gütlige Daten zeigen, so muss der Speicherplatz entweder mit new reserviert werden, oder per @ auf eine Globale Variable gesetzt werden.
// edit:
Ürbigens, hier findest du ein Tutorial zum Thema "Pointer" dass kaum Wünsche übrig lässt:
www.manuel-poeter.de...x.php?site=tutorials
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
LastRide 
      
Beiträge: 47
|
Verfasst: Sa 05.07.08 22:28
Also zum Beispiel wennich auf die Adresse "04110BA4" zugreifen möchte einfach
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| begin
Zeiger := @04110BA4; ShowMessage(IntToStr(Zeiger^)); Dispose(Zeiger);
end; |
machen und das wars ?
MfG
LastRide
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Sa 05.07.08 22:32
Nein. Wenn du die Adresse hast (ungewöhnliche Vorgehensweise allerdings), musst du sie direkt angeben (mit Pointer und Integer casten), ohne @ davor. Allerdings, soweit ich weiß sind die Adressen die man hier bekommt unter Delphi keine echten Adressen. Möglicherweise funktioniert das also nicht so wie du dir das Vorstellst.
Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var str: String;
procedure TForm1.Button1Click(Sender: TObject); var zeiger : ^String;
begin zeiger := Pointer(StrToInt(edit1.text)); caption := zeiger^; end;
procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text := IntToStr(Integer(@str)); end;
procedure TForm1.FormCreate(Sender: TObject); begin str := 'Hallo'; end; |
Der Sinn dieses Beispieles ist natürlich gering.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
LastRide 
      
Beiträge: 47
|
Verfasst: Sa 05.07.08 22:40
Ob gering oder nicht  es hilft mir weiter zu verstehen xD. Muss ich in deinem Beispiel also nur das hallo bei
Delphi-Quelltext
mit der Adresse Austauschen und fertig ist der Zeiger auf die Adresse ?
MfG
LastRide
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Sa 05.07.08 23:19
Fast ^^ du must den inhalt des editfeldes ändern (edit1.text) ^^
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
LastRide 
      
Beiträge: 47
|
Verfasst: So 06.07.08 11:50
Nachdem ich mir das pdf in deinem Link durch gelesen habe habe ich etwas bemerkt  . Und ich denke das wir aneinander vorbei geredet haben  . Also nochmal zum Verständnis:
Delphi-Quelltext
entspricht
Delphi-Quelltext
kann ich dann nicht einfach bei der Adresse, ich verwende jetzt mal das Beispiel,
Delphi-Quelltext
den Code so abändern ?
MfG LastRide
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 06.07.08 12:30
|
|
LastRide 
      
Beiträge: 47
|
Verfasst: So 06.07.08 13:01
Okay damit ist meine Frage dann schon zum teil Beantwortet  . Nur wie schaffe ich es jetzt den Wert auf den der Pointer zeigt auszulesen und zu ändern. Da wäre ich euch für eine Hilfe Stellung sehr verbunden.
MfG LastRide
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 06.07.08 13:12
Das hat doch Tilman schon erklärt. Wenn du aber einen Zeiger ohne Typ hast, musst du ihn erst in einen typisierten Zeiger umwandeln:
Delphi-Quelltext 1:
| PInteger(Zeiger)^ := 5; |
Zuerst wird der untypisierte Zeiger in einen Zeiger auf einen Integer umgewandelt, dann dereferenziert und schließlich wird die 5 ins Ziel geschrieben. Natürlich musst du statt PInteger den gewünschten Zeigertyp eintragen.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 07.07.08 13:15
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 07.07.08 13:50
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 07.07.08 15:11
packed bedeutet einfach, dass die Daten direkt hintereinander stehen und nicht zum Lese / Schreibzugriff optimiert sind (sondern um Speicher zu sparen), da Integers z.b. an einer durch 4 teilbaren Adresse schneller zu lesen sind (obwohl ich gerade auch meine Bedenkten habe, dass der Record auch dann im speicher mindestens bei einer durch 8 Teilbaren Adresse steht zwecks Standardalignment 
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|