[fpc-devel] bug: Inc(v,i)/Dec(v,i)

Gerhard Scholz gs at g--s.de
Fri Jul 8 12:49:30 CEST 2005


----- Original Message -----
From: "Marco van de Voort" <marcov at stack.nl>
To: "FPC developers' list" <fpc-devel at lists.freepascal.org>
Sent: Friday, July 08, 2005 11:52 AM
Subject: Re: [fpc-devel] bug: Inc(v,i)/Dec(v,i)


> > Solution 1 of course would be:
> >
> >     if delta < 0
> >         then dec ( v, -delta )
> >         else inc ( v, delta ) ;
>
> inc(longint(v),delta);

Interesting, I didn't know typecasts on the left side of assignment yet.
Doesn't look very portable.

Beside, v is word or byte, depending on a compiler-$if elsewhere, so I would
have to write:

inc ( {$ifdef big} smallint {$else} shortint {$endif }v, delta ) ;

Not very clear readable.

...
> This doesn't fix the problem that you are mixing types. v:=v+d is flawed
from
> that perspective too, the compiler even complains
>
> smbg.pp(9,7) Warning: Mixing signed expressions and longwords gives a
64bit result
>
> on a line like
>
>   v:=v+-5;

I'm sorry, v IS unsigned, delta IS signed, and the computation has to be
done. Besides, v and d are 8-bit or 16-bit, and the result WILL fit in v
(that is checked before for other reasons).

Of course, I could convert both v and d to some signed int first, do the
computation, and store it back to v, but that just elongates the code and
should produce the same result.

And I prefer to develop programs with $r+,q+,etc.-checks on and with ranges
(I seldom declare "v : integer"; more often I declare "v : 0..99" or
similar) [this was one of the major benefits of Pascal against other
languages when it was invented] and this saves a good part of testing time.
And while testing I do not mind speed as a major factor, but stability.

Gerhard





More information about the fpc-devel mailing list