2012-07-29 2 views
-4

이 코드가 실행되지 않는 이유는 무엇입니까? 그런데루프 및 논리 AND + OR

for(int i=0;i<11;i++){ 
    for(int j=0;j<11;j++){ 

     if(i>0){ 
      if((staticWallLoc[i--][j]&4)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|1;} 
     } 
     if(j<10){ 
      if((staticWallLoc[i][j++]&8)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|2;} 
     } 
     if(i<10){ 
      if((staticWallLoc[i++][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;} 
     } 
     if(j>0){ 
      if((staticWallLoc[i][j--]&2)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|8;} 
     } 

     System.out.println(i+" "+j); 
    } 
} 

는 staticWallLoc [11] [11] 각 차원 (0-10) 11 개 인덱스가 이차원 배열이다.

왜 내 프로그램이 문자 그대로이 코드를 전달할 수 없는지 궁금합니다.

+5

매번 조작 할 수있는 아주 좋은 생각이 아니다. 디버거를 사용해 보셨습니까 ?? –

+2

루프 인덱스의 증가 및 감소 게시물은 끔찍합니다! i-1과 i + 1 등을 색인으로 사용하십시오. – John3136

+0

@ John3136 난 그냥 질문에 대답했다고 생각;) – MadProgrammer

답변

1

istaticWallLoc[i--]에 의해 감소된다. 이를 staticWallLoc[i-1]으로 변경하고 j에 대해서도 동일하게 변경하십시오.

if(i>0){ 
    // Try something like this instead 
    if((staticWallLoc[i-1][j]&4)>0){ 
     staticWallLoc[i][j]=staticWallLoc[i][j]|1; 
    } 
} 

는 또한 [i++][i+1]에 변경하는 것이 좋습니다.

+0

고마워, 나는 정말 어리석은 실수를했다. 나는 처음 프로그래머가 된 ++에 익숙해 졌기 때문에 어리석은 실수는 거의 없다. XD 감사합니다! –

+0

문제 없습니다. 이러한 실수는 가치있는 경험을 제공합니다. 이제 이론적 인 책을 읽을 때 다양한 프로그래밍 관행 등의 추론을 더 잘 이해할 수있는이 기억에 남을만한 기회를 가질 수있는 이점이 있습니다. –

2

Dude - 왜 루프 카운터를 제어하는 ​​데 사용하는 변수와 동일한 변수를 루프 본문에서 감소시키고 있습니까?

"한 걸음 앞으로, 두 걸음 뒤로"와 같은 소리가 나지 않습니까;)?

SUGGESTION :

실행 디버거, 몇 반복을 통해 한 단계, 조심스럽게 진행될 상황에 "I"와 "J".

얼마나 빨리 또는 둘 다 "11"에 도달 할 것이라고 생각하십니까?

+0

+1, 이것은 엉망인 코드입니다. –

0

루프에서 if (i>0) {staticWallLoc[i--][j]...과 같은 문구가 있습니다. 이것은 루프 인덱스를 직접 변경합니다. 따라서 i1 일 때 0으로 다시 변경됩니다. 루프가 증가하면 1으로 다시 이동하고 다시 0으로 이동하여 무한 루프가 생성됩니다.

아마도 staticWallLoc[i - 1][j]... 등을 사용하고 싶습니까? 이것은 루프 인덱스를 변경하지 않고 원하는 인덱스를 얻습니다.

0

코드에서 i ++ i-- 등을 사용하는 대신 오프셋 i-1 또는 i + 1을 사용하십시오.

일반 규칙 : for 루프에서는 본문 내의 for 루프 변수를 혼동하지 마십시오.

는 (규칙에 예외가 있습니다, 그러나 이것은 예외적 인 경우처럼 보이지 않는) 도대체 배열의 내용은 말할 어렵다 무엇인지 모른 채

0

. --++을 사용하여 i와 j의 값을 즉시 수정하기 때문일 수 있습니다. 당신이 일정하게 그 값을 유지하고 같은 일을 할 의미합니까 : 당신의 if(i > 0) 내부

if((staticWallLoc[i+1][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;} // changed i++ to i+1 
0

j가 10에 도달하면 "if (j < 10)"섹션에서 증가하지 않지만 "if (j> 0)"섹션에서 감소하므로 j는 9에서 루프를 종료합니다 , 그리고 나서 루프 관리에 의해 10으로 다시 증가합니다. 그래서 당신은 i = -1/0 (루프에서 감소하고 증가하기 때문에)와 j = 9/10 (같은 이유로)과 함께 무한 루프를 갖게 될 것입니다.

0

j> = 10이면 마지막에 j--를합니다. 루프가 j == 10에서 멈 춥니 다.

그것은 루프 변수 : 나는이 같은 질문에 나는 당황 해요 참조