::求助:: for i:=0 to StrList_Tmp.Count - 1 do 过界问题(100分)

  • 主题发起人 主题发起人 wino
  • 开始时间 开始时间
W

wino

Unregistered / Unconfirmed
GUEST, unregistred user!
begin
FS_Tmp := TMemoryStream.Create ; // 以 MemoryStream 方式读取文件中的字符串

for i := 0 to StrList_Tmp.Count - 1 do // StrList_Tmp 为TStringList
begin
FS_Tmp.Clear;
Str_VN_Tmp := StrList_Tmp.Strings;
AssignFile(F, Str_VN_Tmp); // F为 File of Byte
Reset(F);
if FileSize(F) < 1000 then // 如果文件大小 < 1000 则 continue
begin
CloseFile(F);
Continue;
end;
CloseFile(F);
FS_Tmp.SetSize(256);
FS_Tmp.LoadFromFile(StrList_Tmp.Strings);
FS_Tmp.Seek(20, soFromBeginning); //设置路径字符串的起始点
FS_Tmp.ReadBuffer(Buf, 256); // 从文件开始部分读 256个字节
SetLength(Str_Ansi, 256);
CopyMemory(@Str_Ansi[1],@Buf, 256); //将Buf中的字符拷贝给 Str_Ansi
Str_Temp := ExtractFileName(Trim(Str_Ansi));

FS_Tmp.Seek(596, soFromBeginning); //设置文件中字符串的起始点
FS_Tmp.ReadBuffer(Buf, 32);
SetLength(Str_Ansi, 32); //将Buf中的字符拷贝给 Str_Ansi

CopyMemory(@Str_Ansi[1],@Buf, 32);

Str_Temp := Str_Temp + ',' + Trim(Str_Ansi);


end;

FS_Tmp.Free;
end;

以上代码我单步跟踪时,发现 for 循环中的 i 会出现大于 StrList_Tmp.Count - 1 的情况,如果注释掉和 FS_Tmp (一个TMemoryStream变量)相关的语句,就没出现上述的过界问题,不知道这问题是如何引起的,请高手指点一下,tks
 
应该和你的CopyMemory操作有关,你只注释掉这两个调用的语句,再运行看看。CopyMemory可能因为缓冲区溢出,把本来属于I的地址给复写了。
 
To zqw0117:

对,我也发现跟内存操作这块儿有关系,CopyMemory如果不用的话,这块儿的功能无法实现,所以现在的问题是不知道如何避免这种情况的出现

有朋友遇到类似情况吗?
 
刚才我把 两个CopyMemory注释后,问题依旧[?]
 
再顶一下!
 
用这个办法吧,把你在for里面的操作全部放到一个函数中,在for里面只包含简单的这样的语句,这样应该可以避免这个问题(怀疑是编译器优化的bug)
for i := 0 to StrList_Tmp.Count - 1 do // StrList_Tmp 为TStringList
begin
DoSomeFunction(StrList_Tmp.Strings, FS_Tmp);//这样,把需要的东西用参数传进去,在里面单独处理,这样应该能避免这个错误。
end;
 
好,我试试~~
 
To zqw0117:

你说的方法有效,的确不会出现之前的越界问题,3Q

接分哈~~
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
745
import
I
后退
顶部