2012-01-08 4 views
1

내 머리를 찢어 버린 후 며칠 만에 문제가 간단 해졌습니다 (중요한 비트 만 남겨 두었습니다. 내 많은 편집 내역을 참조하십시오). 그것은 :델파이에서 연속적이지 않은 범위 때문에 트리거하지 않는 FOR-IN 루프

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

이 항목은 내 프로그램에서 delphi로 무작위로 배치됩니다. 비 연속적인 for-in 루프 범위는 다른 곳에서 프로그램에서 작동한다는 점에 유의해야한다고 생각합니다. 합계로, 나는 같은 두 가지 비 연속적인 for-in loops을 가지고 있는데, 다른 하나는 잘 동작한다고 주석을 달았지만 둘 다 동시에 작동하는 상태라면 두 번째 제품 만 작동하고 첫 번째 제품은 작동합니다. 아래에 설명 된 것과 같습니다.

첫 번째 메시지 상자에는 초기화되지 않았기 때문에 "i = 임의 번호 :"이 포함되어 있으므로 필요하지 않습니다. 메시지 상자에 "1"이 표시되지 않습니다. 표시되는 두 번째 메시지 상자에는 "i = 14"가 표시되어 루프가 트리거했지만 아무것도하지 못했음을 의미합니까? 그건 말도 안돼, 만약 누군가가 내게 계몽 수 있다면 두 가지를 원한다 :

1) 왜 이런 일이 일어나는가?

2) 문제를 해결하고 나중에 피하는 방법은 무엇입니까?

+1

아마 당신의 상태가 "아닙니다 (somearr [1]은 Tcheckbox와 같습니다)."는 결코 사실로 평가되지 않습니다. 인덱스 1에있는 somearr에게 실제로 의도 한 것이 었는지 확인하십시오. –

+0

문제가 반복적이지 않아서 somearr에 기대하는 바가 있는지 확인해야합니다. – crefird

+0

외부의'case'가 필요 없다면, 테스트에서 제거하십시오.'for i : = 1 to 10 do' 대신에 루프를 제거하십시오. 문제를 나타내는 최소한이지만 완전한 * 예를 제공해주십시오. 일어날 것으로 예상되는 것을 표시하고 대신 일어날 것을 관찰하십시오. 메시지 박스를 간단한'WriteLn' 호출로 대체하면 예상되는 결과를 한꺼번에 쉽게 설명 할 수 있습니다. –

답변

-1

안녕하세요, Delphi 2006 및 Xe2에서 코드를 테스트했으며 두 경우 모두 정상적으로 작동합니다. 나에게는 메모리를 파기 ​​할 수있는 이전의 문제가있을 수 있으며 변수 또는 체크 박스 배열과 관련된 것일 수 있습니다.

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; 

나는 결코 그것을 고정 이유를 이해할 수 없었다 : 나는 (Delphi6 사용) 경우가 있었다 일단 내가 좋아하는 일을했다, 내가 루프 전에 J를 initializate을했다이었다. 디버깅을 통해 단계별로 수행하고 각 변수를 검사 할 수 있습니다.

더 많은 도움이 필요하시면 더 많은 코드를 게시하여 문제를 해결하는 데 도움을주십시오.

행운을 빈다! 당신이 그것을 초기화하지 않았기 때문에이 시점에서

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

i는 메모리의 랜덤 내용이 i에 대한 스토리지에 할당 된 위치에 될 일이 무엇이다.

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

코드에 다른 문제가 있습니다. 이것은 델파이 XE2에서 잘 작동합니다

Sample output from loop

편집 및 지금 무시하는 말을하고 남은 모든 소리에 너무 많은 혼란이있다 : 여기

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; 

만큼 얼마든지 다른 루프 1 (50)로부터 하방 i 카운트 값을보고하고,이 디버거에서 루프 카운터를보고 알려진 문제이고; 디버거의 평가자를 혼동시키는 코드 최적화와 관련이 있습니다. Delphi 1부터 잘 알려진 (그리고 종종 Borland/CodeGear/Embarcadero 뉴스 그룹에서 논의 된) 행동이었으며 디버거의 디스플레이에만 영향을 미쳤습니다. 코드의 실제 실행 결과에 영향을 미치지 않도록 보장됩니다.

+0

그것에 대해 마지막 비트를 주셔서 감사 드리며, 나는 그것을 알지 못했기 때문에 상대적으로 알고있다. 편집은 연대순으로 진행되며 이전 텍스트의 내용을 편집하지 않았습니다 (문법/서식과 같은 사소한 것이 아닌 한). 처음부터 끝까지, 내가 뭘 해왔 던지, 내가 가진 아이디어, 내가 뭘 테스트했는지, 생각의 전체적인 흔적을 보여 주지만, 이제는 내 문제가 Edit5에만 포함되어 있습니다. 이것이 핵심 이슈입니다. 혼란 스럽다면 사과드립니다. 나는 그것이 다른 곳에 배치되면 * 나를 위해 일한다고 강조했다. 지금 내가 가진 것은 두 개의 FOR-IN 루프 사이의 충돌 인 것처럼 보입니다. – Raith

+2

Raith,이 사이트는 위키와 비슷하기 때문에 모든 게시물의 * 편집 내역 *을 포함합니다. 질문의 이전 버전이 무엇인지 보려는 사람들은 그것을 볼 수 있습니다. 귀하의 질문에서 관련없는 정보를 삭제하십시오 *. 역사가들은 구식 버전에 관심이 있다면 편집 기록을 볼 수 있습니다. 우선,이 페이지를 * 나중에 방문 할 많은 사람들을 생각해보십시오. 원래의 혼란스러운 질문에는 신경 쓰지 않습니다. 그들은 곧바로 핵심에 도달하기를 원할 것입니다. 따라서 모든 편집 작업을 거치지 않도록하십시오. –

+0

좋은 점, 편집 내역을 알고있었습니다. 고맙습니다. – Raith