delphi 导致访问冲突的记录数组(基于TStringlist)

oaxa6hgo  于 2022-12-12  发布在  其他
关注(0)|答案(1)|浏览(166)

这是我第一次尝试使用记录。我有大约180个分隔文本文件,每个文件大约有250,000行。在每个文件中,最多有150个唯一的记录,文件的内容被分配给记录的匹配id。

type
    StringsRec = Record
      id : string[2];
      Content : TStringList;
   end;
….
var
  RecArray : array of StringsRec;
  RecLen : Integer;
  iList, sl : TstringList;
….

字符串列表iListsl在create和destroy表单上创建和销毁。在每个文件之后,iList被清除,并且RecArray的长度被设置为0。但是,我还没有了解到这一点。第一条记录的内容中添加了3行(Tstringlist)。第二个有8,第三个有12。到目前为止没有问题,但当第四个新记录创建时,我得到了访问冲突。
检查是否需要新记录的代码。Arec是源文件中一行中一列的前两个字母;检查其有效性并且两个字符都是字母。

procedure TForm1.MakeRec(Arec : string);
var
  x : Integer;
  isThere : Boolean;
begin
  isThere := False;
  if RecLen = 0 then isThere := False
  else
    begin
      for x := 0 to iList.Count-1 do
        begin
          if copy(iList[x],1,2) = Arec then
            begin
              isThere := True;
              Exit;
            end;
        end;
    end;
  if isThere = False then
    begin
      SetLength(RecArray,Length(RecArray)+1);
      RecLen := Length(RecArray);
      RecArray[RecLen].id := Arec;
      RecArray[RecLen].Content := TStringList.Create;
      iList.Add(Arec+'='+IntToStr(RecLen));
       ShowMessage(RecArray[reclen].id + ' ' +inttostr(iList.IndexOfName(arec)));
    end;
end;

对于第4条记录,显示的消息是空白的,但对话框展开,好像有一些文本x1c 0d1x,当我尝试添加内容时,我得到了违规。(s2是上面的Arec)

RecArray[iList.IndexOfName(s2)].Content.Add(sl[x]);

除非我的代码充满了错误,否则我怀疑这个问题是由于内存造成的,这也是我以前从未深入研究过的问题。
任何帮助将不胜感激。我正在使用 Delphi 7与Windows 11 64位

编辑

我已经尝试逐步执行我的代码中我认为发生错误的部分。

在所有四个记录创建中,将光标停留在第2、3和4行的id上显示正确的2个字母,但第四个记录步进到第5行,id变为#0000和各种其他字符的字符串。
我希望这能帮我缩小范围

mbyulnm0

mbyulnm01#

你很幸运,它没有得到一个违规更早。问题似乎在这里对我来说:

SetLength(RecArray,Length(RecArray)+1);  //if the length was 3, it's now 4.
RecLen := Length(RecArray);   //So you're setting RecLen to 4.
RecArray[RecLen].id := Arec;  //You then look at element 4.

但是数组是[0..3]!没有元素4。

相关问题