pointer-compatibile integers (was: gpi-hash.c segfaults)

Thu, 31 Jul 1997 18:44:10 +0200 (MET DST)


According to Frank Heckenbach:
> 
> While we're at it: would it be possible to have predefined Pascal types
> as size_t and ptrdiff_t (and maybe other types?) so that such
> calculations can be done in Pascal?

Not enough integer types yet?  ;-)

This can be be implemented with

    Type
      PtrInt = Integer ( BitSizeOf ( Pointer ) );

Is this sufficient?  Since GPC fully supports pointer arithmetics,
I don't see too much applications for this.

If not ... what about `PtrInt', `PtrCard', and `PtrWord'?

Greetings,

    Peter


(* For those who have not followed the recent discussion about integer
types in GPC, here is some background:  Besides `Integer' (signed), GPC
supports `Cardinal' (unsigned) and `Word' (don't care about signedness,
in fact unsigned).  These types exist in several sizes which guarantee
compatibility to GNU C and introduce some portability to other Pascal
compilers:

    GNU Pascal          GNU C

    ByteInt             signed char
    ShortInt            short int
    Integer             int
    MedInt              long int
    LongInt             long long int

There are also `*Card' and `*Word' versions of these, yielding a total
of fifteen basic integer types.  Besides this, GPC supports a synonym
`LongestInt' for `LongInt' which guarantees the longest possible integer
type (for the case that GNU C introduces `long long long int' which
we would implement as `LongLongInt'); same with `LongestCard' and
`LongestWord'.  Eighteen.

Compatibility to Borland Pascal and Delphi requires `Comp' (same as
`LongInt' and `SmallInt' (same as `ShortInt' in GPC).  Twenty.

Okay?  Good.  Now it *really* begins.

Like all Pascal compilers, GPC supports subranges like `1..42'.  This
adds 2 * sqr ( 2 pow 64 ) more possible integer types to our zoo.
The `2' comes from signed and unsigned variants ... let's speak of
"20 + two classes" of integer types.  As an extension, GPC allows these
subranges to be `packed' (i.e. allocate only one byte for `packed 1..42';
the default of allocating four bytes results in faster code) which leaves
us with 20 + four classes of integer types.

In low-level programming you often have the situation that you want to
know exactly how many bits a variable occupies.  While this could be
done with packed subranges, it is more comfortable to have an extended
syntax for `Integer'.  In GPC, `Integer ( 42 )' yields a 42-bit integer.
Depending on the machine (which might not have 42-bit registers) this
will probably be stored in a 64-bit word, except in packed records;
however on those machines where you need, say, `Integer ( 8 )' for your
low-level stuff, you can be sure that the hardware supports it.  Having
this for `Cardinal' and `Word' as well yields 20 + 7 classes.

Adding `Ptr[Int|Card|Word]' as suggested above would make it
23 + 7 classes of integer types.  Well, no big deal.

I know this is a great source of confusion, but the discussion convinced
me that all these integer types have their place where they are important.

Greetings,

    Peter  :*)

 Dipl.-Phys. Peter Gerwinski, Essen, Germany, free physicist and programmer
peter.gerwinski@uni-essen.de - http://home.pages.de/~peter.gerwinski/ [970201]
 maintainer GNU Pascal [970714] - http://home.pages.de/~gnu-pascal/ [970125]


Peter Gerwinski (peter@agnes.dida.physik.uni-essen.de)

HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada - Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es