Am 10.09.2012 08:36, schrieb Dave Coventry:
Hi,

I have an array of Byte which I have loaded from a file.

I want to process a 100 byte section of the array which starts at
offset 32 in my array.

My function (or procedure) is as follows:

procedure decompress_r(cbuf: array of byte);
var
   len,i: integer;
begin
   i:=1;
   if (cbuf[0]and $F0)=$20 then
   begin
     Inc(i,2);
     len:=cbuf[i]and $7;
   end;
   ...
end;

I call my procedure by

decompress_r(&buf[32]);

Did you really write "&"? The address operator is "@", but this won't make your code work anyway. If you did indeed write "&" (which is for escaping keywords) you do indeed only pass the 32nd element to your function.


It seems to work. the first element in the array is 0x20, but the rest
of the array is garbage.

The array sent is:
buf[32]=32
buf[33]=0
buf[34]=0
buf[35]=7
buf[36]=0

The array received is
cbuf[0]=32
cbuf[1]=27
cbuf[2]=255
cbuf[3]=247
cbuf[4]=255

Can anyone tell me the correct way to pass the portion of the array to
the function?

Dynamic arrays are internally pointers to an array (more or less). So if you would use "@buf[32]" you would be passing the address of one element to a function that takes an array. If you know the amount of bytes you want to copy then you should use "Copy(buf, 32, count)" as argument for decompress_r or if you don't know the amount you should change your function from "array of Byte" to "PByte" and pass the address of the 32nd byte using "@buf[32]". The remaining part of the function can stay the same.

Regards,
Sven

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to