Autor Beitrag
Daniel L.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Mo 15.11.10 21:18 
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
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
F := Func(P);     { Prozeduralen Wert in P an F zuweisen }
Func(P) := F;     { Prozeduralen Wert in F an P zuweisen }
@F := P;          { Zeigerwert in P an F zuweisen }
P := @F;          { Zeigerwert in F an P zuweisen }
N := F(N);        { Funktion über F aufrufen }
N := Func(P)(N);  { Funktion über P aufrufen }
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 16.11.10 00:24 
gruselige Zeigerverbiegerei, aber wenn Du Fleisch reinpackst kannst Du mit dem Debugger verfolgen daß alles stimmt:
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:
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);     { Prozeduralen Wert in P an F zuweisen }
Func(P) := F;     { Prozeduralen Wert in F an P zuweisen }
@F := P;          { Zeigerwert in P an F zuweisen }
P := @F;          { Zeigerwert in F an P zuweisen }
N := F(N);        { Funktion über F aufrufen }
N := Func(P)(N);  { Funktion über P aufrufen }
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: BenBE
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 16.11.10 07:09 
user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.