有这样一段程序:
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;
这样程序就会出错,为什么?
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;
这样程序就会出错,为什么?
解决方案 »
- 为什么这段代码生成的数据,不能修改,报键列信息不足或不正确的错误
- 如何模拟DBGrid的点击事件
- 关于类成员变量感知数据的问题 急!急!急!!!!
- 还是关于DLL的问题,分说好商量!!!
- 求教:如何将大段文本插入数据库(不使用insert语句)
- 毕业又失业! 极度郁闷!
- 一个注册热键的问题?
- 第三次提出这个问题,请高手回答??? 等待中............................
- Delphi里怎样调C++写的DLL函数?具体请进...
- mediaplayer控件播放网络视频
- 关于消息一问
- 我的maskedit格式设为00000000\-99;1;_ , 当我离开此控件的时候,我可能只输了前面8位数,怎么样让后两位数自动补零啊?
Stream.Read(Buffer,1024);
改为:
Stream.Read(Buffer[0],1024);—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
Stream.Read(Buffer,1024);
改成
Stream.Read(Buffer[0], 1024);
看看行不行
第一个,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,故能正确执行。