8

配列の値をランダムに取得しようとしていますが、エラーが発生しています。これまでのコードは次のとおりです。

NSMutableArray *validMoves = [[NSMutableArray alloc] init];

for (int i = 0; i < 100; i++){
    [validMoves removeAllObjects];

    for (TileClass *t in tiles ) {
        if ([self blankTile:t] != 0) {
            [validMoves addObject:t];
        }
    }

    NSInteger pick = arc4random() % validMoves.count;

    [self movePiece:(TileClass *)[validMoves objectAtIndex:pick] withAnimation:NO];
}
4

1 に答える 1

11

発生するエラー(算術例外)は、validMovesが空であり、モジュラス演算を実行するとゼロ除算につながるためです。

空のvalidMoves配列の場合を明示的にチェックする必要があります。またarc4random_uniform、モジュロバイアスを回避するために使用する必要があります。

if (validMoves.count > 0) {
    NSInteger pick = arc4random_uniform(validMoves.count);
    [self movePiece:(TileClass *)[validMoves objectAtIndex:pick] withAnimation:NO];
} else {
   // no valid moves, do something reasonable here...
}

最後の注意として、それarc4random_uniform(0)は戻りません0。したがって、そのような場合は避ける必要があります。そうしないと、空の配列の最初の要素にアクセスしようとします。もちろん、アプリケーションがクラッシュします。

于 2012-12-11T01:55:29.920 に答える