首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

帮忙看一下这段代码异常在哪里?pchar类型的变量总是出错

2012-03-03 
帮忙看一下这段代码错误在哪里?pchar类型的变量总是出错procedureTForm1.Button3Click(Sender:TObject)va

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

呵呵

热点排行