帮忙看一下这段代码错误在哪里?pchar类型的变量总是出错
procedure TForm1.Button3Click(Sender: TObject);
var
instream:pchar;
outstream:pchar;
rle_code:Word;
ptr_instream:Word;
ptr_outstream:Word;
i,loopcnt:Word;
s:string;
begin
s:= ' ';
try
instream:=allocmem(p.picsize);
getmem(outstream,sizeof(outstream));
if ifopen = false then
begin
pics:=tfilestream.Create( 'GraphicEx_4.bin ',fmopenreadwrite);
ifopen:=true;
end;
pics.Position:=p.picadd+16;
pics.ReadBuffer(instream^,p.picsize);
//showmessage(inttostr(length(buf)));
{ for i:=0 to p.picsize-1 do
begin
s:=s+inttohex(word(buf[i]),2);
end;
memo2.Lines.Add(s);
//memo2.Lines.Add(string(buf)) ; }
//获取解码数据的代码开始
ptr_instream:=0;
ptr_outstream:=0;
i:=0;
loopcnt:=0;
while ptr_instream < p.picsize do
begin
//c:=instream[ptr_instream];
rle_code := Word(instream[ptr_instream]);
//rle_code:=Integer(c);
Inc(ptr_instream);
case rle_code and $f0 of
$00:
begin
loopcnt := rle_code;
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := instream[ptr_instream];
Inc(ptr_instream);
Inc(ptr_outstream);
end;
end;
$10:
begin
loopcnt:= (rle_code and $0f)*$100+Word(instream[ptr_instream]);
Inc(ptr_instream);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := instream[ptr_instream];
Inc(ptr_instream);
Inc(ptr_outstream);
end;
end;
$20:
begin
loopcnt := (rle_code and $0f) * $10000 + Word(instream[ptr_instream]) * $100 + Word(instream[ptr_instream+1]);
Inc(ptr_instream,2);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := instream[ptr_instream];
Inc(ptr_instream);
Inc(ptr_outstream);
end;
end;
$80:
begin
loopcnt := rle_code and $0f;
rle_code := Word(instream[ptr_instream]);
Inc(ptr_instream);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := Char(rle_code);
Inc(ptr_outstream);
end;
end;
$90:
begin
loopcnt := (rle_code and $0f) * $100 + Word(instream[ptr_instream + 1]);
rle_code := Word(instream[ptr_instream]);
Inc(ptr_instream,2);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := Char(rle_code);
Inc(ptr_outstream);
end;
end; //end $90
$a0:
begin
loopcnt := (rle_code and $0f) * $10000 + Word(instream[ptr_instream + 1]) * $100 + Word(instream[ptr_instream + 2]);
rle_code := Word(instream[ptr_instream]);
Inc(ptr_instream,3);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := Char(rle_code);
Inc(ptr_outstream);
end;
end; //end $a0
$c0:
begin
loopcnt := rle_code and $0f;
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := #$ff;
Inc(ptr_outstream);
end;
end;
$d0:
begin
loopcnt := (rle_code and $0f) * $100 + Word(instream[ptr_instream]);
Inc(ptr_instream);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := #$ff;
Inc(ptr_outstream);
end;
end;
$e0:
begin
loopcnt := (rle_code and $0f) * $10000 + Word(instream[ptr_instream]) * $100 + Word(instream[ptr_instream+1]);
Inc(ptr_instream,2);
for i := 0 to loopcnt - 1 do
begin
outstream[ptr_outstream] := #$ff;
Inc(ptr_outstream);
end;
end;
end; //end case
Inc(ptr_instream);
end; //end while
finally
freemem(instream);
freemem(outstream);
end;
end;
——————————————————————
这段代码是用来解码RLE压缩算法的
编译通过,但是程序运行一旦触发这个过程就自动关闭。
instream变量用来接收从二进制文件中读取出来的数据,outstream用来存放解码后的数据
我知道pchar类型使用之前必须申请内存。
但是在解码之前我不知道到底这个pchar类型需要多大的内存……
getmem(outstream,sizeof(outstream));
我用这一句是否会错误?我只能这样……
或者问题并不是出在这句代码上?高手给我个解答吧,或者一起讨论讨论也很感激。~谢谢
[解决办法]
getmem(outstream,sizeof(outstream));
这句肯定是不对的.
outstream都还没有申请内存,何来的大小?
既然你知道了instream的大小,为何不根据RLE压缩算法预估一下outstream的大小?
不行的话,就用string,不过对速度会有相当的影响.
如果无法预估大小,那么可以先申请一块内存,大小为instream的大小,然后记录下来,currsize.
每当为outstream添加数据的时候,计数器count+1,当内存不够用的时候, remalloc,容量为currsize加上增量,当时更新currsize的值罗.
呵呵