[fpc-pascal] fpc-pascal Digest, Vol 228, Issue 17

Rafael Picanço cpicanco42 at gmail.com
Thu Jun 15 15:12:30 CEST 2023


Hi Tomas,

On top of your suggestion, the only way to make FPC happy is to assign nil
to the type constants and then assign the corresponding pointers to them
somewhere:

unit eyelink.constants
interface
const
  EXTERNAL_DEV_NONE : TGetExButtonStatesFunction = nil;
  EXTERNAL_DEV_CEDRUS : TGetExButtonStatesFunction = nil;
  EXTERNAL_DEV_SYS_KEYBOARD : TGetExButtonStatesFunction = nil;

implementation

initialization
  EXTERNAL_DEV_NONE := TGetExButtonStatesFunction(Pointer(0));
  EXTERNAL_DEV_CEDRUS := TGetExButtonStatesFunction(Pointer(1));
  EXTERNAL_DEV_SYS_KEYBOARD := TGetExButtonStatesFunction(Pointer(2));
end.

program godcastsucks;

uses eyelink.constants;

  function enable_external_calibration_device(
    buttonStatesfcn: TGetExButtonStatesFunction
    {other arguments removed for simplicity}): Int32; cdecl;
  var
    Statesfcn : TGetExButtonStatesFunction;
  begin
    if buttonStatesfcn = nil then
    begin
      WriteLn('Function is nil');
    end else begin
      WriteLn('Function is not nil');
    end;
    Result := Int32(buttonStatesfcn);
    case Result of
      0 : { do something };
      1 : { do something };
      2 : { do something }
    else
      begin
        Statesfcn := TGetExButtonStatesFunction(buttonStatesfcn);
        Statesfcn(nil);
        Result := -1;
      end;
    end;
  end;

function ExButtonStatesFunction(accdbs: PCCDBS): Int32; cdecl;
begin
  WriteLn('God casts sucks');
end;

begin

WriteLn(enable_external_calibration_device(TGetExButtonStatesFunction(EXTERNAL_DEV_CEDRUS)));
  WriteLn(enable_external_calibration_device(@ExButtonStatesFunction));
  ReadLn;
end.

Best,
R

PS. If you find a better solution, please make me known!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20230615/ad9f9094/attachment.htm>


More information about the fpc-pascal mailing list