动态数组的问题; ( 积分: 50 )

  • 主题发起人 主题发起人 hawii
  • 开始时间 开始时间
H

hawii

Unregistered / Unconfirmed
GUEST, unregistred user!
buf:array [0..31] of byte;

buf:array of byte;
setlength(buf,32);
有什么不一样?
为什么Res.ReadBuffer(buf,32);(其中Res是TMemoryStream)用后者buf就出错呢?
 
程序如下,是读取资源的一个函数
function MyResTxt(const ResName:string): string;
var
Res: TResourceStream;
buf:array of byte;
i:Integer;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar('TXT'));
try
SetLength(buf, Res.Size);
{这里都没问题,也能得出size是32了,buf也初始化32个了}
Res.Seek(0,0);
Res.ReadBuffer(buf,Length(buf));{这里好像就坏了,buf就坏了}
for i:=0 to Length(buf)-1do
{这里就出错了!}
Result :=Result+char(buf);
buf:=nil;
finally
Res.Free;
end;
except
Result := '';
end;
end;

搞不懂什么原因,高手看一下!谢谢!!
 
function MyResTxt(const ResName:string): string;
var
Res: TResourceStream;
buf:PChar;
i:Integer;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar('TXT'));
try
// SetLength(buf, Res.Size);
{这里都没问题,也能得出size是32了,buf也初始化32个了}
GetMem(Buf,Res.Size)
Res.Seek(0,0);
//Res.ReadBuffer(buf,Length(buf));{这里好像就坏了,buf就坏了}
Res.ReadBuffer(buf^,Res.Size);
// for i:=0 to Length(Res.Size)-1do
{这里就出错了!}
// Result :=Result+char(buf);
// buf:=nil;
Result:=buf;

FreeMem(Buf,Res.Size);
finally
Res.Free;
end;
except
Result := '';
end;
end;
 
谢谢hellbeast,这种方法能读出来,但是为什么多一个字节呢?郁闷,明明Size是32的,读出来的却有33个
'0123456789abcdef0123456789abcdefv'后面多了个v不知道哪来的。
 
PChar类型最后加了一个NULL
 
我再加SetLength(Result,Res.size);可以解决问题了,
但是我还是想知道为什么用动态数组不行?先放这,看看。
 
多人接受答案了。
 

Similar threads

后退
顶部