读书人

帮忙看一下这段代码异常在哪里?pchar

发布时间: 2012-03-03 15:33:02 作者: rapoo

帮忙看一下这段代码错误在哪里?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的值罗.

呵呵

读书人网 >.NET

热点推荐