[fpc-pascal]I don't Understand Array

Gabor DEAK JAHN djg at argus.vki.bke.hu
Fri Feb 16 13:02:21 CET 2001


At 02/16/2001 06:30, you wrote:

Dear Luis,

> When declare a Array variable with character, The compiler add 3 character,
> see the next code :

> var
>    antes:char;
>    m     : array [0..3] of char;
>    despues : char;
> begin
>     Writeln('m[-4] : ',m[-4]);     // variable antes

If you declare a variable with indexes between [m..n], this means that you 
are allowed only to use those indexes when you use the array. In your case, 
m[0], m[1], m[2] and m[3] are the only allowed expressions (or, of course, 
an m[i] where i has a value of 0, 1, 2 or 3). The compiler notifies you with 
the warning 'Range check error while evaluating constants'. Actually, this 
should be labeled an error, not a warning, but its text clearly says: error.

Variables are completely independent. If you declare your antes, then m, 
then despues, you can make no assumptions about where they will be in the 
memory. It is far from certain that antes will be before m, even less 
certain that it will be immediately before it. The compiler is at perfect 
liberty to place these variables in any way it sees fit and for reasons of 
performance, they are usually aligned on multiple byte boundaries, meaning 
that up to a couple of bytes of hole can be between any two variables. This 
is the reason why you see three additional bytes between antes and m, the 
default alignment is at 4-byte boundaries.

If for any reason you want to keep some variables together, knowing their 
exact sequence, location and size, you have to use the device the language 
offers for this purpose, namely, a record (specifying the alignment as 
necessary).


Regards,

   Gabor DEAK JAHN

-------------------------------------------------------------------
Gabor DEAK JAHN -- Budapest, Hungary.
WWW: <http://www.tramontana.co.hu/>www.tramontana.co.hu
E-mail: djg at tramontana.co.hu





More information about the fpc-pascal mailing list