문제

편집] 코드에 실수가 있었으며 이제 질문에 대한 모든 응답은 비즈웨어처럼 보이지만 기본적으로 루프는 (i = 0; i <15; i ++)였습니다. 나는 또한 질문을 더 명확하게하기 위해 편집했다. [/edit

16 개의 요소 배열을 확인하는 루프를 만들려고 노력하고 있으므로 0에서 15로 고리됩니다. 그런 다음 나중에 i 변수를 사용하지만 때로는 i == 16을 사용하여 경계를 벗어나 문제를 일으 킵니다.

나는 해결책이 있지만 우아하게 보이지 않기 때문에 내가 뭔가 빠진 것 같아요. 나는 루프를 시도했지만, 0에서 15까지의 루프를 얻을 수 없으며, 15보다 큰 값으로 끝나지 않을 것입니다.

루프가 끝날 때 15를 넘지 않는 반면 루프를 가서 배열의 16 가지 요소를 모두 점검 할 수있는 방법이 있습니까?

int i;

for(i=0; i<16; i++)
{
    someClass.someMethod(i);

    if(someClass.Test())
    {
        break;
    }
}



if (i == 16)
{
    i = 15;
}
도움이 되었습니까?

해결책

다른 변수를 사용하는 것이 좋습니다 i 루프가 완료된 후. while 루프 대신 루프를 사용하는 기준은 루프의 A가 실행되는지 정확히 미리 알고 있다는 것입니다. 이미 이것을 알고 있다면 다른 변수를 루프의 결말 값으로 설정하고 제공하는 대신 사용하십시오. i 이중 목적.

int j = 15;

for(int i=0; i <= j; i++)
{
    someClass.array[i];
}

// continue on using j, which value hasn't changed

다른 팁

우선, 샘플 코드는 0에서 14 사이의 루프입니다. 그러나 0에서 15로 루프되면 당연히 16 명이어야합니다. ~ 전에 루프가 끝날 수 있습니다. 무슨 일이 일어나는지는 16이된다. 그러면 루프는 그것이 경계를 벗어나고 헤어진다는 것을 알아 차렸다. 당신이 15시에 끝나기를 원한다면, 솔직히 가장 쉬운 일은 루프 종료 직후에 줄어드는 것입니다.

나는 마지막 수표에서 16 세로 증가했는데, 이는 15 세 이상이므로 루프는 16 세가되었다.

어쩌면 다음을 아는 것이 유용 할 수 있습니다.

for (before; check; after) { body } 

그것은 다음과 같습니다.

before 
while(check) { 
  body 
  after 
} 

당신이 그 용어로 당신의 루프를 생각한다면, 아마도 출구에서 내가 16 인 이유를 쉽게 알게 될 것입니다.

접근 방식에는 근본적인 결함이있는 것 같습니다.

  1. 루프 범위 외부에서 실제로 인덱스 변수를 사용해서는 안됩니다.
  2. 루프의 한계를 결정하려면 변수 또는 함수를 사용해야합니다.
  3. 숫자 인덱스 대신 반복자를 사용하는 것이 좋습니다.
  4. 일반 알고리즘은 루프의 필요성을 제거 할 수 있습니다.

내 $ 0.02.

따라서 - 16 개의 요소 배열을 확인하는 경우 일반적으로 다음을 수행합니다.

for(i=0; i<16; i++)

작품을위한 방법은 세 가지의 첫 번째 진술로 시작합니까?

i=0

그런 다음 두 번째 진술에서 확인합니다.

i < 16 // True here, since 0 < 16

그것은 당신의 루프 전에 발생합니다. 그런 다음 해당 세트로 루프 블록을 실행합니다.

someClass.array[i]; //0

마지막으로 최종 진술을합니다.

i++

그런 다음 두 번째 및 세 번째 문장을 순서대로 반복합니다.

마지막 달리기 전에 i == 14, I ++를 수행하고 I를 15로 설정하고 블록을 실행합니다. 마지막으로 I ++, 설정을 수행합니다.

i==16

이 시점에서 조건은 더 이상 사실이 아닙니다.

i < 16 // False, since i==16

이 시점에서 블록은 실행되지 않지만 여전히 16으로 설정되어 있습니다.

당신은 뭔가를 놓쳤을 것입니다.

이 루프에서는 15 명에 도달하지 못할 것입니다. I = 14가 한 번 실행되고 보석금이 나 자마자 I <= 15라고 말해야합니다.

그만큼 for 루프는 다음과 같습니다 while 고리:

i = 0;
while(i < 16) {
    someClass.array[i];

    i++;
} // while

i 루프에서 올바르게 벗어나려면 16에 도달해야합니다.

기술적으로 i 루프를 종료 할 때 15이지만, 당신은 그것들을하지 않아야합니다.

int i = 0;
while (1) {
    someclass.someMethod(i);
    if (i < 15) {
        i++;
    } else {
        break;
    }
}

예, 그것은 당신이 요구하는 일을합니다. 그러나 흐름은 끔찍합니다.

내장 루프 구조로는이를 달성 할 수 없으며 Lizard가 말했듯이 아마도 For-Loop 변수를 재사용하고 싶지 않을 것입니다.

그러나, 당신이 정말로 원한다면, 여기에 그것을 할 수있는 방법이 있습니다. 트릭은 루프 조건을 루프 중간에 두는 것입니다.

int i = 0;
while (true)
{
    someclass.array[i];
    if (i == 15)
        break;
    ++i;
}

여기서 이해해야 할 주요 문제는 "테스트가 성공하게하는 I의 어떤 가치가 무엇입니까?"라는 질문에 17 가지 답변이 있다는 것입니다. {0, 1, ..., 15}에있을 수 있거나 i의 값이 없으면 테스트가 성공하지 않으며,이 경우 i == 16으로 표시됩니다. 따라서 16 값으로 제한되면 질문에 답할 수 없습니다.

마지막으로 유효한 가치를 넘어 가고 싶지 않은 합법적 인 사례가 있습니다. 예를 들어, 256 개의 값이 있고 어떤 이유로 든 계산할 바이트 만 있습니다. 또는 최근에 나에게 일어난 것처럼 배열의 모든 ITH 요소 만 검사하고 싶습니다. 반복자에 마지막 추가는 배열 끝을 훨씬 뛰어 넘습니다. 이 경우 루프 unprolling 필수적이다.

그러나이 문제의 경우 깃발을 사용하는 것이 더 깨끗합니다.

bool flag = false;
for (int i = 0; i < 15; ++i) 
{
    someClass.someMethod(i);

    if (someClass.Test())
    {
        flag = true;
        break;
    }
}

그런 다음 테스트가 성공했는지 여부는 분명합니다.

루프가 휴식을 취하는 대신 Natuarally를 종료하면 i ~ 할 것이다 16 세가 되십시오. 이것을 피할 방법이 없습니다. 내가 원하는 것이 내가 15 이하로 끝나는 것이라면 코드가 완벽하게 허용됩니다.

int i;
for (i=0; i<16; i++) {
    someClass.someMethod(i);
    if (someClass.Test())
        break;
}
if (i == 16)
    i = 15;

변화하는 모든 것 i 루프 바디가 다음과 같은 일 이후 16 ~ 15입니다.

if (i == 16) i = 15;
i = (i == 16) ? 15 : i;
i = MAX (15,i); /* where MAX is defined :-) */

등등.

그러나 그것은 그것을 가정합니다 i 해당 루프와 관련하여 조건 이후로 의미있는 일에 사용될 것입니다. 나는 그것이 사실이 거의 없다는 것을 알게되며, 사람들은 재사용하기 전에 그것을 다시 시작하는 경향이 있습니다 (예 : 루프의 다른 것).

또한, 당신이하고있는 일은 끊임없는 후, 당신의 루프가 정상적으로 종결 된 것 또는 그것이 조기에 종결되었는지 여부를 조기에 종료하는 것이 매우 어렵습니다 (불가능한). someClass.Test() 진실로 돌아 왔습니다 i == 15. 이것은 I를 사용하여 추가 결정을 내리는 것이 위험에 처해 있음을 의미합니다.

내 질문은 다음과 같습니다. 떠나야한다고 생각하십니까? i 15 세 이하?

16 개의 요소 배열을 확인하는 루프를 만들려고 노력하고 있으므로 0에서 15로 고리됩니다. 그런 다음 나중에 i 변수를 사용하지만 때로는 i == 16을 사용하여 경계를 벗어나 문제를 일으 킵니다.

이 정보는 I와 함께하고 싶은 모든 것이 유효한지 여부를 결정하기 때문에 루프가 깨지지 않은 경우를 확인해야합니다.

이 작업을 수행하는 몇 가지 방법이 있습니다. 하나는 "FoundClass"또는 "TestSuceeded"와 같은 부울에서 그것을 추적하는 것입니다. 기본값으로 거짓으로 한 다음 휴식 시간에 true로 설정하십시오. "if (foundClass) {}"블록에서 함수에서 나중에 I의 사용을 동봉하십시오.

다른 하나는 당신이 한 일을하는 것입니다. 당신의 폴백은 전혀 옳지 않지만. 내가 15 세로 설정하는 경우, 코드에 거짓말을하고 someclass.test ()가 i == 15에 성공했다고 말하고 있습니다. 나중에 코드가 오류가되지 않도록 값을 잘못된 것으로 설정하지 마십시오. 코드에서 나중에 I의 실제 사용법에 대한 경계 검사를 입력하는 것이 훨씬 낫습니다.

for(int i=0; i<17; i++)
{    
  if(i<16)
  {
     someClass.someMethod(i); 
     if(someClass.Test())   
     {        
       break;    
     }
  }
  else if(i==16)
  {
     i=15;
  }
}

16 개의 요소가있는 배열이 있다고 말하면 배열을 사용하여 해당 정보를 얻을 필요가 없습니다 (정보를 복제하지 않음).

나중에 마지막 인덱스를 다시 얻으려면 배열을 사용하여 해당 정보를 얻으십시오.

for(int i = 0; i < myArray.length; ++i){
       myArray[i].somemethod();
}
// lastindex = myArray.length-1;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top