Das ist doch ein "Procedural Type", also ein Funktionspointer. Der muss m.E. immer mit Klammern aufgerufen werden, um es von der Funktionsadresse abzugrenzen.
Also z.B.
if Button1.OnClick = Button1.OnKeyDown then //...Adressen gleich? Wenn true, benutzt den gleichen Eventhandler
im Gegensatz zu
Button1.OnClick()
(Ja, die Parameter stimmen nat. nicht, nur als Beispiel gedacht)
Das ist doch ein "Procedural Type", also ein Funktionspointer. Der muss m.E. immer mit Klammern aufgerufen werden, um es von der Funktionsadresse abzugrenzen.
Jetzt leuchtet es mir ein, definitiv kein Bug.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Das ist doch ein "Procedural Type", also ein Funktionspointer. Der muss m.E. immer mit Klammern aufgerufen werden, um es von der Funktionsadresse abzugrenzen.
Jetzt leuchtet es mir ein, definitiv kein Bug.
Korrekt. Zumindest in den nicht-Delphi/TP-Modi. Im Delphi- bzw. TP-Modus versucht FPC auf die gleiche Art wie Delphi/TP zu entscheiden, ob der Funktionszeiger aufgerufen werden muss oder die Adresse gemeint ist.
var
TestFunc: function: Pointer;
function Test: Pointer;
begin
GetMem(Result, 16);
end;
begin
TestFunc := @Test;
WriteLn(PtrUInt(TestFunc)); // Die Adresse der Testfunc
WriteLn(PtrUInt(TestFunc())); // Der Ausgabewert von Testfunc
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Ich habe das mit dem @ probiert.
Jetzt werden mir 3 verschiedene Werte ausgespuckt.
Müssten da bei den letzten 2 Ausgaben nicht das gleiche Resultat kommen ?
TestFunc := @Test;
WriteLn(PtrUInt(TestFunc())); // Der Ausgabewert von Testfunc
WriteLn(PtrUInt(TestFunc)); // Die Adresse der Testfunc
WriteLn(PtrUInt(@TestFunc)); // Die Adresse der Testfunc
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Ja, ich hätte jetzt auch nur 2 unterschiedliche Adressen/Zahlen erwartet. Schließlich ist doch der Funktionszeiger zu einer Routine immer gleich.
Vielleicht kann ein nativer FPC Experte dazu was schreiben warum das so ist.