[fpc-pascal] Setting bit in array of byte
Michalis Kamburelis
michalis at camelot.homedns.org
Sat Oct 1 17:40:07 CEST 2005
Koenraad Lelong wrote:
> Hi,
> I have following code (almost literally translated from C) :
> //--------------------------------------------------------------------------
>
> // Bit utility to read and write a bit in the buffer 'buf'.
> //
> // 'op' - operation (1) to set and (0) to read
> // 'state' - set (1) or clear (0) if operation is write (1)
> // 'loc' - bit number location to read or write
> // 'buf' - pointer to array of bytes that contains the bit
> // to read or write
> //
> // Returns: 1 if operation is set (1)
> // 0/1 state of bit number 'loc' if operation is reading
> //
> type
> PByteArray = ^array of byte;
>
"array of byte" is a dynamic array. It's a pointer, to data and to some
internal fields. "^array of byte" is a pointer to a pointer to data. You
don't want this.
What you probably want is something like
type
TByteArray = array[0..MaxInt - 1] of Byte;
PByteArray = ^TByteArray;
Actually this should be already defined somewhere in the RTL (SysUtils
unit, or maybe even in System) so you should just omit declaring
PByteArray type yourself and all should be OK.
> function bitacc(op, state, loc : byte; buf : PByteArray) : byte;
> {C-code : static SMALLINT bitacc(SMALLINT op, SMALLINT state, SMALLINT
> loc, uchar *buf)}
>
> var
> nbyt,
> nbit : byte;
>
> begin
>
> nbyt := loc div 8;
> nbit := loc mod 8;
> if (op = WRITE_FUNCTION) then
> begin
> if state=1 then
> buf^[nbyt] := buf^[nbyt] or ($01 << nbit)
> else
> buf^[nbyt] := buf^[nbyt] and not ($01 << nbit);
> result:=1;
> end
> else
> result:=(buf^[nbyt] >> nbit) and $01;
> end;
>
> It's called with this code :
>
> bitacc(WRITE_FUNCTION, bitacc(READ_FUNCTION,0,i, at SerialNum[portnum][0]),
> (i * 2 + 1), @sendpacket[pos])
> {C-code :
> bitacc(WRITE_FUNCTION, bitacc(READ_FUNCTION,0,i,&SerialNum[portnum][0]),
> (short)(i * 2 + 1), &sendpacket[pos]);}
>
> Executing the code gives an an access violation exception. What am I
> doing wrong ?
> I included some debugging code and it seems accessing buf^[nbyt] is the
> problem.
>
> TIA
> Koenraad Lelong.
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list