1

私の問題は、髪を引き裂いて数日後に単純化されました(重要な部分だけを残しました。歴史については私の多くの編集を参照してください)、ここにあります:

showmessage('i='+inttostr(i));
for i in [2..5,8,11..13] do
showmessage('1');
showmessage('i='+inttostr(i));

これは、デルファイをランダムにいじる私のプログラムのユニットに配置されます。非連続のfor-inループ範囲は、他の場所(別のユニット)のプログラムで機能することに注意する必要があると思います。合計で、同じ手順でこのような非連続性が2つfor-in loopsあります。一方をコメントアウトすると、もう一方は正常に機能しますが、両方が同時に動作状態にある場合は、2番目の方だけが機能し、最初の方は次のように動作します。以下で説明します。

最初のメッセージボックスには、初期化されていないため「i =乱数」が含まれていますが、初期化されている必要はありません。「1」が含まれるメッセージボックスは表示されません。表示される2番目のメッセージボックスには「i=14」があります。これは、ループがトリガーされたが何もしなかったことを意味しますか?それはばかげています、そうでなければ、誰かが私を啓発することができれば、私は2つのことを望んでいます:

1)なぜこれが起こっているのですか?

2)それを修正し、将来的に回避する方法は?

4

2 に答える 2

2
showmessage('i='+inttostr(i));

iiこの時点でのメモリのランダムな内容は、初期化していないため、のストレージに割り当てられた場所にあるものです。

for i in [2..5,8,11..13] do
  showmessage('1');
showmessage('i='+inttostr(i));

コードで何か他のことが起こっています。これは、Delphi XE2 で正常に動作します。

procedure TForm2.FormCreate(Sender: TObject);
var
  j: Integer;
begin
  Memo1.Clear;
  for j in [2..5,8,11..13] do
    Memo1.Lines.Add(Format('j = %d', [j]));
end;

からの出力は次のMemo1とおりです。

ループからのサンプル出力

すべての編集と残りのノイズが非常に混乱しているため、無視するように言っているため、問題が何であるかを確認するのは困難です。切り取られたコード、アクセスしている宣言されていない変数、および(とにかく、あなたが含めたものから)私にとって意味のある奇妙なロジックがあります。

ただし、非常に単純な書き直しが問題の解決に役立つ場合は、これに多くの時間を費やしていると思います(IMOは将来的に読みやすく保守しやすくなりますが、これも単なるIMOです):

for i := 2 to 13 do
  case i of
    2..5, 8, 11..13:
      ShowMessage(Format('Got i value of %d', [i]));
    else:
      ShowMessage(Format('Got other value of %d', [i]));
  end;

i他のループで count の値が 50 から 1 に下がっているのを見る限り、これはデバッガーでループ カウンターを表示する際の既知の問題です。これは、デバッガーのエバリュエーターを混乱させるコードの最適化に関係しています。これは、Delphi 1 以降、よく知られた (Borland/CodeGear/Embarcadero ニュースグループでよく議論されている) 動作であり、デバッガの表示にのみ影響します。コードの実際の実行結果の動作に影響しないことが保証されています。

于 2012-01-09T23:02:47.227 に答える
-1

こんにちは、Delphi 2006 と Xe2 でコードをテストしましたが、どちらの場合も問題なく動作しています。変数またはチェックボックス配列に関連する何か、おそらくメモリを破壊する可能性のある以前の問題があるように見えます。(Delphi6 を使用して) ループの前に J を初期化する必要があった場合、次のようにしました。

procedure MyTestFunc();
var
i, j: integer;
begin
  memo1.lines.clear;
  for i:= 1 to 50 do
  Begin
    case i of
      1..10:
        if NOT (somearr[1] as Tcheckbox).checked then
        Begin
            j:=0;
            for j in [2..5,7,11..13] do
            begin
                memo1.Lines.Add('j= '+inttostr(j));
                (somearr[j] as Tcheckbox).Checked := false;
            end
        end
        else memo1.Lines.Add('false');
      11..20:BEgin
           End;
    End;
  End;
end;

なぜそれが修正されたのか理解できませんでした。いつでもデバッグを実行して、各変数を調べることができます。

さらに支援が必要な場合は、さらに多くのコードを投稿して、この問題により適切に対処できるよう支援できます。

幸運を!

于 2012-01-08T03:12:50.240 に答える