В каких других версиях Delphi цикл for с кардиналами не работает? - PullRequest
2 голосов
/ 17 января 2011

Помогите мне регрессионным тестом и определите, в каких версиях Delphi код, приведенный ниже, не работает.

Редактировать: Я знаю, что для этого есть подсказка компилятора; это было на самом деле найдено в проекте, который я унаследовал, так как каким-то образом были отключены подсказки компилятора (что, как я вижу, многие люди делают, так как считают, что подсказки компилятора всегда безвредны, в данном случае это не так). Еще я хочу знать, в каких версиях Delphi эта аномалия компилятора присутствует в целях документации.

[DCC Hint] QC90921_SO4717399TestCase.pas(47): H2135 FOR or WHILE loop executes zero times - deleted

В Delphi XE, 2009, 2007 и 5 происходит сбой при выводе ниже.
У меня еще не было времени исследовать другие версии Delphi.
Пожалуйста, помогите мне с этим, и ответьте, с какими другими версиями Delphi он тоже не работает.

Low/High const fail: 0
Low/High hex literal fail: 0
Low/High decimal literal fail: 0

Этот код также является частью QC 90921 :

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  CardinalIndex: Cardinal;
  CardinalFirst: Cardinal;
  CardinalLast: Cardinal;
  Count: Int64;
  Target: Int64;
begin
  try
    Target := High(Cardinal);
    Inc(Target);

    Count := 0;
    for CardinalIndex := Low(CardinalIndex) to High(CardinalIndex) do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High const fail: ', Count);

    Count := 0;
    for CardinalIndex := 0 to $FFFFFFFF do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High hex literal fail: ', Count);

    Count := 0;
    for CardinalIndex := 0 to 4294967295 do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High decimal literal fail: ', Count);

    Count := 0;
    CardinalFirst := Low(Cardinal);
    CardinalLast := High(Cardinal);
    for CardinalIndex := CardinalFirst to CardinalLast do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High variable fail: ', Count);

    Count := 0;
    CardinalFirst := 0;
    CardinalLast := $FFFFFFFF;
    for CardinalIndex := CardinalFirst to CardinalLast do
      Inc(Count);
    if Target <> Count then
      Writeln('hex literal Variable fail: ', Count);

    Count := 0;
    CardinalFirst := 0;
    CardinalLast := 4294967295;
    for CardinalIndex := CardinalFirst to CardinalLast do
      Inc(Count);
    if Target <> Count then
      Writeln('decimal literal Variable fail: ', Count);

    Write('Press <Enter>');
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Редактировать: Сводка ответов; это терпит неудачу в этих версиях Delphi:

  • 5
  • 6
  • 7
  • 2006
  • 2007
  • 2009
  • 2010
  • Х

- Йерун

Ответы [ 4 ]

4 голосов
/ 18 января 2011

Полагаю, поскольку это задокументированный дефект, все версии, где High(Cardinal)> High(Longint) (Delphi 4 и выше) будут демонстрировать поведение.

С " H2135: FOR или WHILEцикл выполняется ноль раз - удалено (Delphi)":

Это предупреждение может появиться, если цикл FOR увеличивает свою управляющую переменную со значения в диапазоне Longint до значения вне диапазона Longint.Например: <pre>var I: Cardinal; begin For I := 0 to $FFFFFFFF do ... Это связано с ограничением в компиляторе, которое можно обойти, заменив цикл FOR на цикл WHILE.
1 голос
/ 18 января 2011

Delphi 2006:

[Pascal Hint] Project1.dpr(20): H2135 FOR or WHILE loop executes zero times - deleted
[Pascal Hint] Project1.dpr(26): H2135 FOR or WHILE loop executes zero times - deleted
[Pascal Hint] Project1.dpr(32): H2135 FOR or WHILE loop executes zero times - deleted

Вывод:

Low/High const fail: 0
Low/High hex literal fail: 0
Low/High decimal literal fail: 0
1 голос
/ 18 января 2011

То же, что и в Delphi 7, первые два цикла удаляются (цикл FOR или WHILE выполняется ноль раз - удаляется). См. Ответ Сертака Акьюза.

Edit:

То же самое с Turbo Delphi 2006, первые три цикла удаляются с одинаковой подсказкой.

1 голос
/ 17 января 2011

Я не уверен, что это реальный вопрос, который Джефф одобрил бы, но вот результат D2010:

Low/High const fail: 0
Low/High literal fail: 0
Press <Enter>

Delphi 6 выдает тот же результат.

...