Sind wir in C ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Sind wir in C ?

Beitrag von Mathias »

Seit wann muss man in Pascal ein () bei einer Funktionen machen ?

Code: Alles auswählen

program Project1;
uses
  GLext;
var
  sp: integer;
begin
  sp := glCreateProgram(); // geht
  sp := glCreateProgram;  // geht nicht
end.     
Ich bin darüber gestolpert, als ich GLext anstelle von dglopengl verwenden wollte.

In den beiden Units ist die Funktion anders deklariert.
dglopengl:

Code: Alles auswählen

function glCreateProgram:TGLuint;cdecl;external;
Das fpc eigene GLext:

Code: Alles auswählen

  glCreateProgram: function(): GLuint; extdecl;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Sind wir in C ?

Beitrag von Niesi »

Das ist ein Bug, denke ich ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sind wir in C ?

Beitrag von Mathias »

Mal schauen was PascalDragon meint, bevor ich dies als Bug melde.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sind wir in C ?

Beitrag von Socke »

Hast du mal ausprobiert, ob {$mode objfpc} das Verhalten ändert? In deinem Programm müsstest du per Default im FPC-Modus sein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
kupferstecher
Beiträge: 422
Registriert: Do 17. Nov 2016, 11:52

Re: Sind wir in C ?

Beitrag von kupferstecher »

Mathias hat geschrieben:
So 17. Mär 2024, 14:59
Das fpc eigene GLext:

Code: Alles auswählen

  glCreateProgram: function(): GLuint; extdecl;
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)

--
https://www.freepascal.org/docs-html/ref/refse17.html

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sind wir in C ?

Beitrag von Mathias »

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

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Sind wir in C ?

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mo 18. Mär 2024, 19:06
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.
FPC Compiler Entwickler

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sind wir in C ?

Beitrag von Mathias »

Jetzt leuchtet mir das ganze voll ein.
Im Beispiel sieht man gut, das unterschiedliche Werte ausgespuckt werden.

Code: Alles auswählen

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

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Sind wir in C ?

Beitrag von MmVisual »

Um Verwechslungen zu vermeiden, rein optisch für den der hinter dem Bildschirm sitzt, würde ich das so schreiben:

Code: Alles auswählen

WriteLn(PtrUInt(@TestFunc));
Wie ich das in der Realität nutze:

Code: Alles auswählen

  Application.OnHint := @ShowHint;
  Application.AddOnActivateHandler(@ApplicationActivate);
  Application.AddOnExceptionHandler(@EException);
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sind wir in C ?

Beitrag von Mathias »

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 ?

Code: Alles auswählen

  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

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Sind wir in C ?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Sind wir in C ?

Beitrag von Mathias »

Oder passiert da etwas da gleiche wie hier.
Da kommen auch zwei verschiedene Resultate raus.

Code: Alles auswählen

var
  p:Pointer;
begin
  WriteLn(PtrUInt(p));
  WriteLn(PtrUInt(@p)); 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Sind wir in C ?

Beitrag von MmVisual »

Man könnte das probieren:

Code: Alles auswählen

WriteLn(PtrUInt(TestFunc()));
WriteLn(PtrUInt(TestFunc));
WriteLn(PtrUInt(@TestFunc));
WriteLn(PtrUInt(@TestFunc()));
WriteLn(PtrUInt(@(TestFunc())));
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Sind wir in C ?

Beitrag von m.fuchs »

Mathias hat geschrieben:
Mi 20. Mär 2024, 13:26
Müssten da bei den letzten 2 Ausgaben nicht das gleiche Resultat kommen ?

Code: Alles auswählen

  TestFunc := @Test;
  WriteLn(PtrUInt(TestFunc));    // Der Inhalt von Testfunc
  WriteLn(PtrUInt(@TestFunc));   // Die Adresse von Testfunc      
Nö ist schon richtig, ich habe mal deinen Kommentar korrigiert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten