Doppelte external Funktion wird falsch aufgerufen

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Doppelte external Funktion wird falsch aufgerufen

Beitrag von Mathias »

Folgendes Programm lösten eine Runtime Error 207 aus.
Ich bin beim Fehlersuchen auf folgendes gestossen, SDL_log gibt es bei SDL3 zweimal. Einmal wird es gebraucht als Log-Info-Ausgabe, das andere mal als Mathefunktion. Einziger feiner Unterschied C-Seitig, Log ist einmal goss und andere mal klein geschrieben.
Aber FPC ruft die falsche Funktion aus.

Code: Alles auswählen

uses
  //  SDL3,
  ctypes;

  {$LinkLib 'SDL3'}

  // Mathe Funktion
  function SDL_log(x: cdouble): cdouble; cdecl; external;
  function SDL_cos(x: cdouble): cdouble; cdecl; external;

  // Log Info Ausgabe
  procedure SDL_Log(fmt: PChar); varargs; cdecl; external;

begin
  WriteLn(SDL_log(12.45));  // geht

  SDL_Log('%ix%i', 123, 456);  // Runtime 207
  SDL_Log('log 1');

  SDL_cos('abc');             // Error: Incompatible type for arg no. 1: Got "Constant String", expected "Double"
  SDL_cos(PChar('abc'));      // Error: Incompatible type for arg no. 1: Got "PChar", expected "Double"
  SDL_cos('%ix%i', 123, 456); // Error: Wrong number of parameters specified for call to "SDL_cos"
end.
Sobald ich die externe Mathefunktion entferne, funktioniert es wie erwartet. Somit ist meine Vermutung das FPC bei "SDL_Log('%ix%i', 123, 456);" die Mathe Funktion aufruft. Aber dies dürfte eigentlich gar nicht sein, da keinen cdouble sondern ein PChar habe. Auch habe ich mehr als 1 Argument, somit müsste für den Compiler eigentlich klar sein, welches sdl_log er nehmen muss

Als Test habe ich noch SDL_cos versucht, da motzt der Compiler wie erartet, wen ich eine PChar mitgeben will.
Entferne ich die Zeile mit SDL_Log und dem Pchar, motz er wie bei SDL_cos.

Ist dies ein Bug oder ist dies so gewollt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
AlterPascaler
Beiträge: 45
Registriert: Mo 26. Jun 2023, 18:56
OS, Lazarus, FPC: Linux, Lazarus, Free Pascal
CPU-Target: xxBit
Wohnort: Deutschland, NRW

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von AlterPascaler »

Hallo,

hilft dir vielleicht das hier.
https://www.freepascal.org/docs-html/pr ... su146.html

3. The external can also be used with two arguments:
Procedure ProcName (Args : TPRocArgs); external 'Name'
name 'OtherProcName';

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

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von Mathias »

Ich vermute das ich es so machen muss.

So würde es gehen.

Code: Alles auswählen

  function SDL_log_m(x: cdouble): cdouble; cdecl; external name 'SDL_log';
Aber irgendwie sieht es nach einem Bug aus, das der Compiier so was merkwürdiges macht. er kann do nich einfach eine PChar an einem double übergeben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
AlterPascaler
Beiträge: 45
Registriert: Mo 26. Jun 2023, 18:56
OS, Lazarus, FPC: Linux, Lazarus, Free Pascal
CPU-Target: xxBit
Wohnort: Deutschland, NRW

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von AlterPascaler »

Kein schönes Verhalten, sehe ich auch so. Vielleicht meldest du das mal bei den FreePascal'ern.
Aber eine schnelle Änderung wird es wahrscheinlich nicht geben.

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

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von Mathias »

Vielleicht meldest du das mal bei den FreePascal'ern.
Wir sind doch im Forum von FPC. :idea:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
AlterPascaler
Beiträge: 45
Registriert: Mo 26. Jun 2023, 18:56
OS, Lazarus, FPC: Linux, Lazarus, Free Pascal
CPU-Target: xxBit
Wohnort: Deutschland, NRW

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von AlterPascaler »

Nun, ich dachte hier:https://gitlab.com/freepascal.org/fpc/source
Ein Ticket eröffnen.

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

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von Mathias »

AlterPascaler hat geschrieben:
Mi 27. Mär 2024, 19:57
Nun, ich dachte hier:https://gitlab.com/freepascal.org/fpc/source
Ein Ticket eröffnen.
Habe gerade einen eröffnet:
https://gitlab.com/freepascal.org/fpc/s ... sues/40717
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
AlterPascaler
Beiträge: 45
Registriert: Mo 26. Jun 2023, 18:56
OS, Lazarus, FPC: Linux, Lazarus, Free Pascal
CPU-Target: xxBit
Wohnort: Deutschland, NRW

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von AlterPascaler »

Toll, ich bin gespannt. Poste bitte das Ergebnis.
Gruß
AP

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

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von Mathias »

Code: Alles auswählen

  function SDL_log(x: cdouble): cdouble; cdecl; external name 'SDL_log';
  procedure SDL_Log(fmt: PChar); varargs; cdecl; external name 'SDL_Log';
...
  SDL_Log('%ix%i', 123, 456);
  SDL_Log('log 1');
  SDL_Log('double: %f', SDL_log(12.34));
Mit diesem Code würde es funktionieren, wen ich "SDL_log" und "SDL_Log" erzwinge.

Aber sauber ist es trotzdem nicht, wen der Compiler double und pchar verwechselt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
AlterPascaler
Beiträge: 45
Registriert: Mo 26. Jun 2023, 18:56
OS, Lazarus, FPC: Linux, Lazarus, Free Pascal
CPU-Target: xxBit
Wohnort: Deutschland, NRW

Re: Doppelte external Funktion wird falsch aufgerufen

Beitrag von AlterPascaler »

Mit diesem Code würde es funktionieren, wen ich "SDL_log" und "SDL_Log" erzwinge.
Was meinst du mit "erzwinge"? Reicht schon die "external name" Deklaration?

Antworten