2011-07-11 19 views
0

NSUIntegerには何かがありますか?もともと私の.mファイルでこれをやりたかったのです。 (私はNSEnumeratorの使用についていくつかのコードを見ましたが、私はそれを十分に理解していないので、私は自分のニーズを考えていました。目的関数-cの配列の要素を逆にする

だから私はこれをやってみたかった:

- (NSArray *)reverseArray:(NSMutableArray *)array { 
    NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:[array count]]; 
    for (NSUInteger i = [array count] - 1; i >= 0 ; i--) { 
     [anArray addObject:[array objectAtIndex:i]]; 
    } 
    return anArray; 
} 

これは私に私> = 0がNSUIntegerを行うか、これらの線に沿って何かするように設計されたものであるコンパイラの警告を与えます。私はプログラムを実行すると、それはまたクラッシュし、いくつかの超巨大な数にアクセスします。なぜ私はそれほど確かではありません。私はどこでも1によりオフセットiとこれを行うには、この作品ができます。

- (NSArray *)reverseArray:(NSMutableArray *)array { 
    NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:[array count]]; 
    for (NSUInteger i = [array count]; (i) ; i--) { 
     [anArray addObject:[array objectAtIndex:i - 1]]; 
    } 
    return anArray; 
} 

第1の方法は動作しませんなぜ私は理解していませんでした。どんな助けもありがとう。ありがとう!

答えて

5

NSUIntegerは、unsignedの整数である。したがって、NSUInteger u=0と計算した場合、u-1を計算すると、-1にはなりません。代わりに、それはアンダーフローし、それは非常に巨大な数になります。

for (NSInteger i = [array count] - 1; i >= 0 ; i--) { 

にコードを変更すると、問題を解決する必要があります。

実際に配列を逆にする必要はありません。 forループ

for(a in array){ 
    ... do something with a ... 
} 

は正順の要素を列挙し、そして

for(a in [array reverseObjectEnumerator]){ 
    ... do something with a ... 
} 

は逆の順序で要素を列挙する。

+0

+1は問題を説明し、より良い解決策です。 –

1

符号なし整数は常に0以上です。したがって、最初のループは決して終了しません。その結果、実際には非常に大きな正のインデックスであるobjectAtIndex:(NSUInteger)-1にアクセスしようとします。

幸いにも、問題を既に解決する方法を見つけたようです。よくできました。

Objective-Cに固有のことは何もありません。プログラマは、基本的にすべての適切な低レベル言語において、通常、符号なし整数で同じ誤りを犯します。

0

NSUIntegerは「符号なし」です。つまり、負の数を示す記号は使用できません。あなたのコードで ...最終的に等しい-1、したがって、エラー意志

NSUInteger i = [array count] - 1; i >= 0 ; i-- 

。 =このようなものを削除してみてください。

NSUInteger i = [array count] - 1; i > 0 ; i-- 
関連する問題