Autor Beitrag
peeage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Mi 05.05.10 19:29 
Hallo zusammen,

wenn ich einen Pointer auf ein record erhalte, zeigt dieser dann auf das erste Feld in diesem record, so dass ich rein theoretisch mit dem incrementieren des Pointers zu den nachfolgenden Feldern gelange?
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 05.05.10 19:45 
Wie meinst du das? Wie dereferenzierst du den Pointer?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  rec.feld1 := 1;
  rec.feld2 := 2;
  rec.feld3 := 'asd';
  prec := @rec;

  prec^.feld1 := 1//<-- so?

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Mi 05.05.10 19:49 
Ja, der Pointer zeigt auf den Speicherplatz des ersten Elements.
Beim Inkrementieren it der Typ des Pointers ist wichtig, ein PByte würde auf das nächste Byte, ein PInteger 4 Byte weiter zeigen.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 05.05.10 20:06 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
  type my_rec = record
    feld1, feld2: Integer;
    feld3: String;
    feld4: Integer;
  end;

  var
    rec: my_rec;
    prec: PInteger;
begin
  rec.feld1 := 1;
  rec.feld2 := 2;
  rec.feld3 := 'asrdrdd';
  rec.feld4 := 3;
  prec := @rec;

  showmessage(IntToStr(prec^));
  inc(prec);
  showmessage(IntToStr(prec^));
  inc(prec);
  showmessage(IntToStr(prec^));
  inc(prec);
  showmessage(IntToStr(prec^));

Hierbei bekommt man relativ sinnloses im dritten Aufruf aber der vierte klappt wieder einwandfrei und gibt die 3 aus.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 05.05.10 20:16 
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Hierbei bekommt man relativ sinnloses im dritten Aufruf

Nämlich - der Vollständigkeit halber - den Zeiger auf die String-Daten. String ist nämlich erstmal nur ein Zeiger auf ein Stück mit Compiler-Magic verwalteten Speicher.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 05.05.10 21:30 
Richtig. Wie sieht es mit typen aus, die kein Zeiger sind und mehr Bytes belegen als ein Integer? Vermutlich bekommst du dann einen als Integer interpretierten Abschnitt des typen. Also würde ich abschließend behaupten: Tu's nur, wenn du genau weißt, was du tust: Wenn der record aus gleichgroßen Feldern besteht, kannst du das z.B. so machen.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Mi 05.05.10 21:36 
Die Dereferenzierung eines PInteger (PInteger^) liefert halt immer etwas zurück das als Integer interpretiert wird - solange PInteger auf eine Stelle verweist wo dir erlaubt ist 4 Byte auszulesen (sonst gibt es ggf. eine Zugriffsverletzung).
Genauso wie du eine Speicherstelle als Integer interpretieren kannst, so kannst du sie auch (hier via Casting) als String interpretieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  showmessage(IntToStr(prec^));
  inc(prec);
  showmessage(IntToStr(prec^));
  inc(prec);
  showmessage(string(prec^));
  inc(prec);
  showmessage(IntToStr(prec^));

Wie JayEff schon sagte, das sollte man nur machen wenn man sich der Sache sicher ist welche Daten an der Stelle stehen.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Mi 05.05.10 21:44 
user profile iconpeeage hat folgendes geschrieben Zum zitierten Posting springen:

wenn ich einen Pointer auf ein record erhalte, zeigt dieser dann auf das erste Feld in diesem record, so dass ich rein theoretisch mit dem incrementieren des Pointers zu den nachfolgenden Feldern gelange?


Das kommt auf den Typ des Pointers an. Ein PByte wird immer um 1 incrementiert, ein PInteger immer um 4, d.h. er wird immer um die Groesse des Typs incrementiert, auf den er laut Deklaration zeigt. Deshalb kann man auch mit einen Pointer auf den in einem Array gespeicherten Record alle Records im Array durchgehen.

Schwierig wird es, wenn der Record Felder mit unterschiedlichen Datentypen hat, denn dann kann der Pointer beim Incrementieren auf ungueltige Daten zeigen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type
  TMyRec = record
    eins: integer;
    zwei: byte;
    drei: word;
  end;
var
  MyRec: TMyRec;
  ThePointer: PInteger;
begin
  MyRec.eins := 1;
  MyRec.zwei := 2;
  MyRec.drei := 3;
  ThePointer := @MyRec;
  WriteLn(ThePointer^); // liefert: 1
  Inc(ThePointer);
  WriteLn(ThePointer^); // liefert Muell und evtl. ein Problem, da er jetzt
  // auf einen Integer zeigt, der den Inhalt der Felder zwei und drei sowie
  // das darauffolgende Byte enthaelt.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 06.05.10 00:24 
Moin!

Der Vollständigkeit halber werfe ich nochmal das Schlüsselwort packed ind den Raum, Details - zu diesem insgesamt definitiv nicht empfehlenswerten Vorgehen - in der DOH. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.