请问关于静态数组和动态数组在下面这种情况下的不同?高分求助!!!!!(200分)

  • 主题发起人 主题发起人 灯泡
  • 开始时间 开始时间

灯泡

Unregistered / Unconfirmed
GUEST, unregistred user!
看下面代码:
procedure TForm1.Button1Click(Sender: TObject);
var
fs:Tfilestream;
i:integer;
buff:array [0..1023] of char;
begin
for i:=1 to 1024 do
buff[i-1]:=char(i);
fs:=TFilestream.Create('d:/test.dat',fmCreate);
fs.Write(buff,1024);
fs.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
fs:Tfilestream;
i:integer;
buff:array of char;
begin
setlength(buff,1024);
for i:=1 to 1024 do
buff[i-1]:=char(i);
fs:=TFilestream.Create('d:/test.dat',fmCreate);
fs.Write(buff,1024);
fs.Free;
end;
为什么这两段程序生成的文件内容是不一样的呢??
不同的仅仅是前者使用的静态数组,而后者用了动态数组,由与特殊原因
我需要把一个动态数组中的数据写到一个文件中,但总是不能成功
不知道哪位高手能给我解释一下??或者给些建议和启发,谢谢~~~~



 
动态数组实际存储的是数据占用内存的情况(如地址),你写入文件的是这部分内容,
而不是数据
 
那怎么做才能达到和静态数组一样的效果,把内容保存到文件里呢?
 
你把第二段程序的
fs.Write(buff,1024);
改为
fs.Write(buff[0],1024);
或者
fs.Write(Pointer(buff)^,1024);
就对了。

因为根据我跟踪的结果来看,第一段程序的buff实际上就是缓冲区的首地址。
而第二段程序的buff是缓冲区首地址的地址,所以改成上面两种写法之一就可以了。


 
谢谢远帆的回答,我理解这两个BUFF都是指针,只不过一个是指向实际区域,
一个是指向首地址的指针,是这么回事吧!

 
我认真仔细地研究了这种情况,还是不行。
可能与动态数组的内存分配机制有关,但即使改紧缩
数组也不行。直接操作文件流吧。
Char(255)=char(0) ??????

procedure TForm1.Button2Click(Sender: TObject);
var
fs:Tfilestream;
i:integer;
//buff:packed array[0..1023] of char;也不行。
//即使这样,从buff[1]写及也不行,buff[0]应该是放长度?
begin
fs:=TFilestream.Create('d:/test.dat',fmCreate);
for i:=1 to 1024 do
fs.Write(char(i),1)
//char(i) 改为 i 也可以。
fs.Free;
end;
//建议:跳过动态数组,直接操作文件流。
//直接操作文件流也很方便!
 

Similar threads

后退
顶部