[fpc-pascal] IE 200307043
Prince Riley
wmarketing3 at gmail.com
Tue May 26 02:01:25 CEST 2009
Frank,
I think the crux of the matter here is how to make the distinction between a
pointer with 'no value' and one that is initialized or set to the 'lowest
possible value in the range'. The quote I mentioned comes directly from
Borland's Object Pascal Langage Manual
You can check on this, but when I looked it up the 'nil' constant in a
Object Pascal Language reference and what the reserved word 'nil' , a
special constant, means in terms of pointer value (it's not an address) I
was not able to find and what adding/subtracting/multiplying it by a
literal numeric value (or another valid pointer value) to 'nil' would
create.
If you're interested in the details (they are very instructive) compile a
sample program with the two programs on an Intel based machine and then
check the generated code with the GNU Debugger. Set a break point on the
following statement
p := nil;
and then single step to the next instruction. You'll see immediately that
two things happen: 1) the value assigned to 'p' by that statement is not a
valid segment/offset address (i32/i64 architecture). If you then set another
breakpoint on the next instruction,
p := p + 1;
you'll notice that the first thing that happens is 'p' get set to a valid
segment address and then the offset, and not the base segment, is
incremented by a value of '1' (again on a Intel CPU machine). Things get
even more interesting when 'p' is first typed, to an Integer for example,
and then assigned the 'nil' value. ....
var
R: Integer ;
P: Pointer;
IntArray1, IntArray2: array of Integer;
IP: ^Integer;
IntArrayPtr: Pointer;
begin
P := nil;
P := @R;
P := P + 1;
P := nil;
IntArray[0] := 1;
IntArray[1] := 1;
IP := @IntArray[0]
IP := IP + 1;
IntArrayPtr := @IntArray[1];
if IntArrayPtr^ <> IP^ then Writeln ("Integer Array values not the same");
end.
Setting breakpoints on the statements where values are assigned to 'P' and
'IP' and watching how their values are set, incremented, and dereferenced
will demonstrate how challenging even a simple pointer handling model can
be.
On Mon, May 25, 2009 at 10:57 PM, Frank Peelo <f26p at eircom.net> wrote:
> Prince Riley wrote:
>
>> Hello,
>>
>>
>
>>
>> "The reserved word nil is a special constant that can be assigned to any
>> pointer. When nil is assigned to a pointer, the pointer doesn't reference
>> anything."
>>
>> Since a pointer is a memory address value, then the interpretation of the
>> statement "nil +1" would mean for p to point at the very next valid address
>> above the lowest memory address 'p' can hold.
>>
>
> That is an "interesting" interpretation of "doesn't reference anything".
> There is no guarantee that nil is address 0, although it may be so in any
> available compiler -- at least, any compiler targetting an architecture that
> does not have usable memory at address 0. Nil doesn't point at anything.
> It's an undefined address.
>
> So it would appear that 'p := nil + 1' should not compile or work.
>>
>
> That would be reasonable - although if nil /was/ 0, then nil+1 would be
> defined for any given pointer type, and a compiler /could/ make a stab at
> compiling it -- but probably /should not/. Because what would "1 more than
> undefined" mean?
>
> FP
>
>
>
>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20090526/306d358b/attachment.html>
More information about the fpc-pascal
mailing list