随便新开一个Project(我只在D7和D2005 for Win32里面试过),然后在Unit1里面加入以下代码:type
  TIPv4ItemText = array[1..3] of Char;
  TIPv4Item = record
    Cnt: Byte;
    Text: TIPv4ItemText;
  end;  TIPv4Addr = array[1..4] of TIPv4Item;
  PIPv4Addr = ^TIPv4Addr;function IsIPMatch(const aIPv4Addr, aPattern: TIPv4Addr): Boolean;
var
  I, J: Integer;
begin
  Result := False;  for I := 1 to 4 do
  begin
    if aPattern[I].Text[1] = '*' then
    begin
      Result := True;
      Exit;
    end;    if aIPv4Addr[I].Cnt <> aPattern[I].Cnt then
      Exit;    for J := 1 to aIPv4Addr[I].Cnt do
    begin
      if aIPv4Addr[I].Text[J] <> aPattern[I].Text[J] then
        Exit;
    end;
  end;  Result := True;
end;编译可以通过,但是如果要Build,你会看到:
D7:
[Fatal Error] Unit1.pas(XXX): Internal error: C1143D2005:
[Fatal Error] Unit1.pas(XXX): F2084 Internal Error: C1205
只有把
//      if aIPv4Addr[I].Text[J] <> aPattern[I].Text[J] then
//        Exit;
注释掉或者改成别的形式才可以通过链接只有Delphi 3是我的知音,以上代码能编译连结并正确执行
还有,象下面的这样的一个过程:
procedure P;
var
  I: Longword;
begin
  for I := Low(I)+1 to High(I)-1 do
  begin
    ....
  end;
end;
居然产生一个hint
[Hint] XXXXX.pas (XXX); FOR or WHILE loop executes zero times - deleted
循环内的代码被忽略,,,
Delphi 3里没有提示,也不会忽略循环内的代码,但是编译的结果不正确
还有一些package,D7里好好的,Delphi 2005硬是打不开,也不提示出错,不知道什么原因
无言,borland的chief scientist,一代不如一代啊

解决方案 »

  1.   

    是不是人家都不用ipv4,把它丢了?
      

  2.   

    主要是他们在for语句中对counter的类型要求有点不合理如果改成:function IsIPMatch(const aIPv4Addr, aPattern: TIPv4Addr): Boolean;
    var
      I: Integer;
      J: Byte; //<<<<<<<<<<
    begin
      Result := False;  for I := 1 to 4 do
      begin
        if aPattern[I].Text[1] = '*' then
        begin
          Result := True;
          Exit;
        end;    if aIPv4Addr[I].Cnt <> aPattern[I].Cnt then
          Exit;    for J := 1 to aIPv4Addr[I].Cnt do
        begin
          if aIPv4Addr[I].Text[J] <> aPattern[I].Text[J] then
            Exit;
        end;
      end;  Result := True;
    end;
    procedure P;
    var
      I: Integer;
    begin
      for I := Integer($80000000)+1 to MaxInt-1 do
      begin
        ....
      end;
    end;就ok
      

  3.   

    前面写的那个P有点多余:procedure P;
    var
      I: Integer; //<<<<<<
    begin
      for I := Low(I)+1 to High(I)-1 do
      begin
        ....
      end;
    end;这样就ok