动态数组出错,哪个大虾给我一个原因 (50分)

J

Jebit

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我运行时都会出错呢?
procedure TForm1.Button1Click(Sender: TObject);
var existedFile:string;
var tes:array of char;
var reg:TRegistry;
var newfile:TFileStream;
begin
existedFile:='d:/1.txt';
newfile:=TFileStream.Create(existedFile,fmOpenRead);
reg:=TRegistry.Create;
try
if reg.OpenKey('Software/J-Studio',true)
then
begin
setlength(tes,newfile.size);
newfile.Read(tes,newfile.size);
reg.WriteBinaryData('test',tes,newfile.size);
end;
finally
reg.Destroy;
newfile.free;
end;
newfile.Free;
end;

end.
 
reg:=tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('SOFTWARE/J-Studio',true);
这样用一下试试
 
发错了,应该是
procedure TForm1.Button1Click(Sender: TObject);
var existedFile:string;
var tes:array of char;
var reg:TRegistry;
var newfile:TFileStream;
begin
existedFile:='d:/1.txt';
newfile:=TFileStream.Create(existedFile,fmOpenRead);
reg:=TRegistry.Create;
try
if reg.OpenKey('Software/J-Studio',true)
then
begin
setlength(tes,newfile.size);
newfile.Read(tes,newfile.size);
reg.WriteBinaryData('test',tes,newfile.size);
end;
finally
reg.Destroy;
newfile.free;
end;
// newfile.Free;
end;

end.

to HouBy,
是在newfile.free的时候出错的。why?"

 
你干嘛要Free两次?
 
to 晓鹤,
我只free了一次呀。
 
procedure TForm1.Button1Click(Sender: TObject);
var existedFile:string;
tes:array of char;
reg:TRegistry;
newfile:TFileStream;//哪里要那么多的Var,有一个足矣
begin
existedFile:='d:/1.txt';
newfile:=TFileStream.Create(existedFile,fmOpenRead);
reg:=TRegistry.Create;
//虽然不是必须,但还是推荐用:reg.rootkey:=XXX_XXX_XXX;
try
if reg.OpenKey('Software/J-Studio',true) then
begin
setlength(tes,newfile.size);
//这里再加上:newfile.seek(0,0);定位
newfile.Read(tes,newfile.size);
reg.WriteBinaryData('test',tes,newfile.size);
//reg.closekey;
end;
finally
reg.Destroy;//这个不要
newfile.free;
end;
// newfile.close;
// newfile.Free;
end;

end.
没有验证,不知是否恰当,你自己试试吧
 
reg.WriteBinaryData 传动态数组参数有问题
将tes改成静态数组
 
reg的RootKey没有写
 
to 晶晶,
我按你的改了,还是一样,
都 是在newfile.free上出问题,
显示
EAccessViolation with message 'Access violation at address 00404B6C in module 'launcher.exe'.Write of address 00CB7359'
 
to [Zero_Zone],
rootkey有默认值,不用的。
我想应该是tfilestream的问题
不是tregistry的问题,
 
将test设定大小如:test:array[0..256]of char然后用一个循环一段一段读试试!
 
to晶晶,
改成静态数组没有问题,但是为什么动态的会有问题呢?
你能告诉我吗?
 
这个不是Free出的错,出错在这 newfile.Read(tes,newfile.size);
Read(var Buffer;Count:integer) 这里需要传递数组存放的首地址
若过地址 Addr1存放tes的内容,对tes分配内存后, Addr1的内容是Addr2, 而Addr2是实际数组的首地址。
所以在传递时,需要给Read传递Addr2而不是Addr1
newfile.Read(tes,newfile.size); 传递的是Addr1不对
改成 newfile.Read(tes[0],newfile.size); 传递的是Addr2就没问题了

若静态数组 test:array[0..xxx]of xxx; 则test和test[0]都代表数组的首地址,所以不会出错
 
to Avenir
按你的还是出错。
to
[Zero_Zone] ,Avenir ,codesmall ,HouBy ,晶晶 ,晓鹤
都谢谢你们:)
不过我的分数不多
 
多人接受答案了。
 
reg.WriteBinaryData('test',tes,newfile.size);还有一个
也改成tes[0]
 
顶部