0

他の方法で機能させることができないように見えるため、コードにこの巨大なループがあります (選択によるものではありません)。+20回繰り返すのではなく、これを簡単にする方法があれば、それは素晴らしいことです。

for (NSUInteger i = 0; i < 20; i++) {
     if (a[0] == 0xFF || b[i] == a[0]) {
         c[0] = b[i];
         if (d[0] == 0xFF) {
             d[0] = c[0];
         }

         ... below repeats +18 more times with [i+2,3,4,etc] ...

         if (a[1] == 0xFF || b[i + 1] == a[1]) {
             c[1] = b[i + 1];
             if (d[1] == 0xFF) {
                 d[1] = c[1];
             }

           ... when it reaches the last one it calls a method ...

           [self doSomething];
           continue;
           i += 19;

          ... then } repeats +19 times (to close things)...
      }
   } 
}

これをより小さく効率的にするために、私が知っているほとんどすべての組み合わせを試しました。私のフローチャートを見てください。私は狂人ではありません、正直です。

流れるようなオールドスクール スタイル

4

2 に答える 2

3

私が間違いを犯していない場合:

for (NSUInteger i = 0; i < 20; i++) {
    BOOL canDoSomething = YES;

    for (NSUInteger j = 0; j < 20; j++) {
        if (a[j] == 0xFF || b[i+j] == a[j]) {
            c[j] = b[i+j];
            if (d[j] == 0xFF) {
                d[j] = c[j];
            }
        }
        else {
            canDoSomething = NO;
            break;
        }
    }

    if (canDoSomething) {
         [self doSomething];   
         break;     
         // according to your latest edit: continue; i+=19; 
         // continue does nothing as you use it, and i+=19 makes i >= 20
    }
} 

それはあなたのコードが行うことです。しかし、インデックスアウトバウンド例外が発生するようです。おそらく、ネストされたループの句は次のようになります

for (NSUInteger j = 0; i+j < 20; j++)
于 2012-06-06T10:21:05.057 に答える
0

再帰を使用したい。

別のメソッドを宣言します。

-(BOOL)doSthWithA:(int*)a B:(int*)b C:(int*)c D:(int*)d Integer:(int)j AnotherInteger:(int)i {

  // end of recursion 
  if(j == 20) {
    return YES;
  }

  if (a[j] == -0x1 || b[i+j] == a[j]) {
     c[j] = b[i+j];
     if (d[j] == -0x1) {
         d[j] = c[j];
     }
     return doSthWithA:a B:b C:c D:d Integer:j+1 AnotherInteger:i;
  }
  else return NO;
}

そしてあなたのコードで:

for (NSUInteger i = 0; i < 20; i++) {
  if(doSthWithA:a B:b C:c D:d Integer:0 AnotherInteger:i;) {
    [self doSomething];  
    i+=19;
  }
}

おそらくすべてを改善することができますが、それはコードをよりコンパクトな形式に変換します.

于 2012-06-06T10:31:12.187 に答える