Results 1 to 7 of 7

Thread: Convert C to Pas

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Quote Originally Posted by phibermon View Post
    short int = 16bit

    long int = 32bit

    int on it's own is supposed to be the platforms native integer as stored in a CPU register, so on a 64bit CPU running a 64bit OS, int = 64bit. On a 32bit Arm platform (like the Iphone) it's 32bits

    (...)
    Yes, 32bit/64bit support is quite tricky. I build a Unit that seems to work for Allegro.pas (or it does for Linux and Allegro 4, but it doesn't seems to work so good with Allegro 5 or Win64 ). Look at it:

    Code:
    (*
    Next are definitions of numeric data types. We may use FPC's ctype unit,
    but Delphi doesn't has it so I prefer to do it by hand.
    First: it defines some integers with specific lenght.
    Then: it defines the types used by C declarations.
    *)
    TYPE
    (* Generic pointer. *)
    AL_POINTER = POINTER;
    (* Signed 8bit integer values. *)
    AL_INT8 = SHORTINT;
    (* Unsigned 8bit integer values. *)
    AL_UINT8 = BYTE;
    (* Signed 16bit integer values. *)
    AL_INT16 = SMALLINT;
    (* Unsigned 16bit integer values. *)
    AL_UINT16 = WORD;
    (* Signed 32bit integer values. *)
    AL_INT32 = LONGINT;
    (* Unsigned 32bit integer values. *)
    AL_UINT32 = LONGWORD;
    (* Signed 64bit integer values. *)
    AL_INT64 = INT64;
    (* Unsigned 64bit integer values. *)
    AL_UINT64 = QWORD;
    (* Signed 8bit integer.
    Note that it isn't Pascal's CHAR type! *)
    AL_CHAR = AL_INT8;
    (* Unsigned 8bit integer values. *)
    AL_UCHAR = AL_UINT8;
    (* Signed 16bit integer values. *)
    AL_SHORT = AL_INT16;
    (* Unsigned 16bit integer values. *)
    AL_USHORT = AL_UINT16;
    (* Signed 32bit integer values. *)
    AL_INT = AL_INT32;
    (* Unsigned 32bit integer values. *)
    AL_UINT = AL_UINT32;
    {$IFDEF CPU64}
    {$IFDEF WINDOWS}
    (* Signed 32/64bit integer values. *)
    AL_LONG = AL_INT32;
    (* Unsigned 32/64bit integer values. *)
    AL_ULONG = AL_UINT32;
    {$ELSE}
    (* Signed 32/64bit integer values. *)
    AL_LONG = AL_INT64;
    (* Unsigned 32/64bit integer values. *)
    AL_ULONG = AL_UINT64;
    {$ENDIF}
    (* size_t equivalent. *)
    AL_SIZE_T = AL_UINT64;
    (* Fake pointer type. It's needed because the need of pointer arithmetics in
    some inlined methods. *)
    AL_UINTPTR_T = AL_UINT64;
    {$ELSE}
    (* Signed 32/64bit integer values. *)
    AL_LONG = AL_INT32;
    (* Unsigned 32/64bit integer values. *)
    AL_ULONG = AL_UINT32;
    (* size_t equivalent. *)
    AL_SIZE_T = AL_UINT32;
    (* Fake pointer type. It's needed because the need of pointer arithmetics in
    some inlined methods. *)
    AL_UINTPTR_T = AL_UINT32;
    {$ENDIF}
    (* Float value. *)
    AL_FLOAT = SINGLE;
    (* Double value. *)
    AL_DOUBLE = DOUBLE;
    (* Pointer. *)
    AL_VOIDptr = AL_POINTER;
    (* Special 8bit integer pointer. *)
    AL_UINT8ptr = ^AL_UINT8;
    (* Pointer to signed 8bit integer values. *)
    AL_CHARptr = ^AL_CHAR;
    (* Pointer to unsigned 8bit integer values. *)
    AL_UCHARptr = ^AL_UCHAR;
    (* Pointer to unsigned 16bit integer values. *)
    AL_USHORTptr = ^AL_USHORT;
    (* Special 16bit integer pointer. *)
    AL_UINT16ptr = ^AL_UINT16;
    (* Special 32bit integer pointer. *)
    AL_UINT32ptr = ^AL_UINT32;
    (* Pointer to signed 32bit integer values. *)
    AL_INTptr = ^AL_INT;
    (* Pointer to signed 32bit integer values. *)
    AL_UINTptr = ^AL_UINT;
    (* Pointer to float values. *)
    AL_FLOATptr = ^AL_FLOAT;
    (* Pointer to text strings. Used to convert Pascal's @code(STRING) to C
    @code(char * ) *)
    AL_STRptr = PCHAR;
    No signature provided yet.

  2. #2
    Just use PtrInt + PtrUInt under FPC and NativeInt + NativeUInt under newer Delphi versions (>= XE2 or so).

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •