[fpc-pascal] Code works on Linux x64 but not on Linux x86
Sven Barth
pascaldragon at googlemail.com
Tue Feb 7 19:48:53 CET 2012
On 07.02.2012 17:12, Reinier Olislagers wrote:
> I have the following code, adapted from pasbzip.pas (bzip2 example)
> uses ...bzip2..
>
> const
> BufferSize = 4096;
> var
> infile, outfile: Tbufstream;
> decoder: Tbzip2_decode_stream;
> a: array[1..BufferSize] of byte;
> readsize: cardinal;
> Status: boolean;
> begin
> Status := False;
> result:=false;
> ...
> try
> infile.init(SourceFile, stopenread, 4096);
> outfile.init(TargetFile, stcreate, 4096);
> decoder.init(@infile);
> if decoder.status<> stok then
> begin
> ...
> repeat
> readsize := BufferSize;
> decoder.Read(a, readsize);
> Dec(readsize, decoder.short);
> outfile.Write(a, readsize);
> until decoder.status<> 0;
> end;
> infile.done;
> outfile.done;
> ...
>
> Code bombs at decoder.Read(a, readsize). readsize=0 according to debugger.
> readsize=cardinal; according to help "an unsigned 32-bit integer".
> However,
> http://wiki.lazarus.freepascal.org/Multiplatform_Programming_Guide#32.2F64_bit
> seems to imply Cardinal can vary between 32 bit and 64 bit.
>
> Is that the culprit or am I doing anyth else wrong?
Does your stream contain at least 4096 bytes? According to the
documentation here
http://www.freepascal.org/docs-html/rtl/objects/tstream.read.html the
Read procedure does not perform any check.
Important note in case you're not aware of it: Tbzip2_decode_stream is
NOT a descendant of Classes.TStream, but of Objects.TStream, thus you
should look at the documentation of unit Objects (you can reach it from
the above mentioned link).
Also "Cardinal" is always 32-Bit wide. The only types that change
depending on bitness are "Pointer", "PtrUInt" and "PtrInt".
Regards,
Sven
More information about the fpc-pascal
mailing list