首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi 6中的For循环初始化错误

Delphi 6中的For循环初始化错误
EN

Stack Overflow用户
提问于 2018-03-19 12:47:50
回答 1查看 357关注 0票数 1

我在Delphi6过程中有这个for循环对:

代码语言:javascript
复制
procedure TNumbers.CleanTable(Sender: TObject);
var
  Index: integer;
  JIndex: integer;
  IEND, JEND: integer;
  Obj: TObject;
begin
  IEND := length(Correspondence);
  JEND := length(Correspondence[0]);
  for Index := 1 to IEND-1 do
  begin
    for JIndex := 1 to JEND -1 do
    begin
      obj := SearchForTagID(Correspondence[Index,JIndex], Sender);
      if obj = nil then continue;
      if obj is TComponent then
      begin
        if TComponent(Obj).Tag = Correspondence[Index, JIndex] then 
        // make sure search was successful
        begin
          VoidCaption(obj);
        end;
      end;
    end;
  end;
end;

我添加了IENDJEnd变量,而不是直接调用length,这样我就可以关注结果了。

现在问题的症结是循环的控制变量没有正确初始化。indexJIndex都应该从1开始(跳过数组的前缘,它包含标题,而不是数据)。然而,我得到的是IndexJindexIENDJEND从一开始。

我尝试注释掉整个块,只保留循环;我甚至注释掉了obj声明,以防这可能会影响循环。什么都没变。我仍然有错误的循环初始化。

以前有没有人见过这个?在我40年的编程生涯中,这是我第一次看到这样的事情,我也遇到过for循环错误!

由于缺乏解决方案,我用下面的代码替换了for循环,它是有效的:

代码语言:javascript
复制
procedure TNumbers.CleanTable(Sender:TObject);
var
  Index: integer;
  JIndex: integer;
  IEND, JEND: integer;
  Obj: TObject;
begin
  IEND := length(Correspondence);
  JEND := length(Correspondence[0]);
  Index := 1;
  while Index < IEND do
  begin
    JIndex := 1;
    while JIndex < JEND do
    begin
      obj := SearchForTagID(Correspondence[Index,JIndex], Sender);
      if obj = nil then continue;
      if obj is TComponent then
      begin
        if TComponent(Obj).Tag = Correspondence[Index,JIndex] then 
        // make sure search was successful
        begin
          VoidCaption(obj);
        end;
      end;
      inc(JIndex);
    end; // JIndex while end
    inc(Index);
  end; // IIndex while end
end;

如果我不能相信编译器有这么简单的循环系统,我就麻烦大了。

对于原因有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2018-03-19 18:50:20

你确实把你的索引搞糊涂了。由于对于Index=0迭代只计算一次,因此JIndex显然是不正确的。

不要使用while,而是使用两个嵌套的for循环:

代码语言:javascript
复制
procedure TNumbers.CleanTable(Sender:TObject);
var
  i, j: integer;
  obj: TObject;
begin
  for i := 0 to high(Correspondence) do
    for j := 0 to high(Correspondence[i]) do begin
      obj := SearchForTagID(Correspondence[i,j], Sender);
      if (obj <> nil) and (obj is TComponent) then
        if TComponent(Obj).Tag = Correspondence[i,j] then
          // make sure search was successful
          VoidCaption(obj);
    end;
end;

现在代码的可读性更强了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49355952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档