有这样一段程序:
procedure TForm1.Button1Click(Sender: TObject);
var
    Stream : TFileStream;
    i      : Integer;
    Buffer : array[0..1023] of byte;
    S      : String;
    fp     : String;
begin
    RichEdit1.Lines.Clear;
    S :='';    if Form1.OpenDialog1.Execute then
        fp := OpenDialog1.FileName;    Stream := TFileStream.Create(fp, fmOpenRead);
    Try
        Stream.Position := 0;
        Stream.Read(Buffer,1024);
        for i := 1 to 1024 do
            begin
              S := S + IntToHex(buffer[i-1],2) + ' ';
              if (i Mod 16)=0 then
                begin
                    Form1.RichEdit1.Lines.Append(s);
                    S := '';
                end;
            end;    Finally
        Stream.Free;
    End;
end;
如果把Buffer这样定义Buffer : array of byte;在程序里在重新设置它的大小:procedure TForm1.Button1Click(Sender: TObject);
var
    Stream : TFileStream;
    i      : Integer;
    Buffer : array of byte;
    S      : String;
    fp     : String;
begin
    RichEdit1.Lines.Clear;
    S :='';    if Form1.OpenDialog1.Execute then
        fp := OpenDialog1.FileName;    Stream := TFileStream.Create(fp, fmOpenRead);
    Try
        SetLength(Buffer,1024);
        Stream.Position := 0;
        Stream.Read(Buffer,1024);
        for i := 1 to 1024 do
            begin
              S := S + IntToHex(Buffer[i-1],2) + ' ';
              if (i Mod 16) = 0 then
                begin
                    Form1.RichEdit1.Lines.Append(S);
                    S := '';
                end;
            end;    Finally
        Stream.Free;
    End;
end;
这样程序就会出错,为什么?

解决方案 »

  1.   

    将:
    Stream.Read(Buffer,1024);
    改为:
    Stream.Read(Buffer[0],1024);—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   

    试一下把
    Stream.Read(Buffer,1024);
    改成
    Stream.Read(Buffer[0], 1024);
    看看行不行
      

  3.   

    这个怎么说呢?
    第一个,Buffer表示一个数组变量
    第二个,Buffer表示指向数组的指针虽然它们事实上都是指针,但是作为引用传递(var)的实际参数的时候会引起Delphi的不同的
    解释。对于ReadBuffer方法,第一个Buffer作为参数时,Delphi会直接把Buffer本身的地址值传递给ReadBuffer,但是对于第二个Buffer,则会传递该Buffer指针的地址给ReadBuffer,结果第二个Buffer的ReadBuffer调用产生异常。对于Buffer的第二种声明,Buffer: array of Byte;
    如果这样调用ReadBuffer,
    Stream.ReadBuffer(Buffer[0], 1024);
    则Delphi将Buffer的第0个元素的地址传递给Stream.ReadBuffer,故能正确执行。
      

  4.   

    在每一次S := S + IntToHex(Buffer[i-1],2) + ' '必须得从新指定一下数组大小吧
      

  5.   

    非常感谢: lxpbuaa(桂枝香在故国晚秋) : alphax(多喝了三五杯) 的答复,结单了。