Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Variablen in prozedurale Typen umwandeln
Daniel L. - Mo 15.11.10 21:18
Titel: Variablen in prozedurale Typen umwandeln
Hi,
ich lese gerade die Delphi-Hilfe Kapitel "Typumwandlungen", und es stellt sich für mich die Frage, ob in dem zweiten Quelltextfenster die Zeilen 1 und 3 das Gleiche bewirken:
F := Func(P); ?entspricht? @F := P;
Func (P) bewirkt doch, dass der Inhalt von P, also das Bitmuster von P, nach F kopiert wird, und damit zeigt F dann ja auf P, oder seh ich das falsch?
Danke schon mal und Grüsse: Daniel
DelphiHilfe:
| Zitat: |
Variablen können in prozedurale Typen umgewandelt werden. Ausgehend von den Deklarationen Delphi-Quelltext 1: 2: 3: 4: 5:
| type Func = function(X: Integer): Integer; var F: Func; P: Pointer; N : Integer; |
sind z. B. folgende Zuweisungen möglich: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| F := Func(P); Func(P) := F; @F := P; P := @F; N := F(N); N := Func(P)(N); | |
bummi - Di 16.11.10 00:24
gruselige Zeigerverbiegerei, aber wenn Du Fleisch reinpackst kannst Du mit dem Debugger verfolgen daß alles stimmt:
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: 24:
| type Func = function(X: Integer): Integer; var F: Func; P: Pointer; N : Integer;
Function MyFunc(X: Integer): Integer; begin result := X + 1; end;
procedure TForm1.Button1Click(Sender: TObject); begin n := 1; Func(P) := MyFunc; F := Func(P); Func(P) := F; @F := P; P := @F; N := F(N); N := Func(P)(N); end; |
jaenicke - Di 16.11.10 07:09
Daniel L. hat folgendes geschrieben : |
und es stellt sich für mich die Frage, ob in dem zweiten Quelltextfenster die Zeilen 1 und 3 das Gleiche bewirken:
F := Func(P); ?entspricht? @F := P; |
Durch die Compilermagic ja. Letztlich sollte es bei beiden auf ein einfaches mov auf Assemblerebene hinauslaufen. Es sollte aber auch ein einfaches
F := P; funktionieren. AFAIK macht Delphi das dann schon richtig (habs nicht ausprobiert).
BenBE - Di 16.11.10 10:23
@jaenicke: Wenn P ein Zeiger auf eine Prozedur ist dank Compilermagic ja, ansonsten gibt's nen Typenfehler oder ne Meldung wegen fehlender Parameter, weil er dann P aufruft. Konsistenter ist F := @P; was zwar von der Verwendung in C etwas abweicht, aber in Bezug auf die Compiler Magic unter Delphi konsistenter ist.
Man beachte zudem, dass F := Func(P); auch für P:Integer; funktioniert, was kein Fehler, sondern by Design ist.
Ansonsten gilt: Bei Zuweisungen von Prozeduralen Zeigertypen i.d.R. ein @ davor, außer auf der Zeile stehen nur prozedurale Typen, dann kann's @ entfallen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!