2016-03-30 15 views
0

私は実際に、この全体のポインタを参照して参照して参照解除することを理解していると思っていましたが、今は再び切り詰められます。バイト配列(参照渡し)のアイテムを整数値に比較する方法

typedef NS_ENUM (uint8_t, ControlCode) { 
    CC_NONE = 0x00, 
    CC_START = 0x01, 
    CC_END = 0x02, 
}; 

- (void)testReferencingAnArray 
{ 
    uint8_t msgBytes[3]; 
    msgBytes[0] = CC_START; 
    msgBytes[1] = 3; 
    msgBytes[2] = CC_END; 

    XCTAssertEqual(msgBytes[0], CC_START);//These three tests pass 
    XCTAssertEqual(msgBytes[1], 3); 
    XCTAssertEqual(msgBytes[2], CC_END); 

    uint8_t *msgBytes_pointer = msgBytes; 

    [self evaluate:&msgBytes_pointer]; 
} 

- (void)evaluate:(uint8_t **)msgBytes_pointer 
{ 
    XCTAssertEqual(*msgBytes_pointer[0], CC_START); //Test passes 
    XCTAssertEqual(*msgBytes_pointer[1], 3); 
     //Test fails with ("<11>") is not equal to ("3") 
    XCTAssertEqual(*msgBytes_pointer[2], CC_END); 
     //Test fails with ("<00>") is not equal to ("<02>") 
} 
+0

必要はありませんか? –

+0

@FiddlingBitsそうだと思いますが、いいえ、http://stackoverflow.com/questions/30618860/pass-uint8-t-array-to-methodによるとはありません。 –

+0

私は、evaluate:が配列へのポインタを期待することを明確にするためにコードを編集しました。参照で配列を渡すことはできますが、配列内の項目に対して比較を実行することはできません。 –

答えて

2

により演算子の優先順位に、

XCTAssertEqual(*msgBytes[0], CC_START); 
XCTAssertEqual(*msgBytes[1], 3); 
XCTAssertEqual(*msgBytes[2], CC_END); 

は、あなたが望むものではありません

XCTAssertEqual(*(msgBytes[0]), CC_START); 
XCTAssertEqual(*(msgBytes[1]), 3); 
XCTAssertEqual(*(msgBytes[2]), CC_END); 

に相当します。

何が必要ではありません: `(uint8_t **)` `(uint8_t *)`右、十分であろうため

XCTAssertEqual((*msgBytes)[0], CC_START); 
XCTAssertEqual((*msgBytes)[1], 3); 
XCTAssertEqual((*msgBytes)[2], CC_END); 
+0

演算子の優先順位は、まず逆参照してから値を取得することを意味しますか?クール。もう1つ、私のプロダクションコードで2番目のテストが失敗しました:( "3")が3に等しくなく、3がNSInteger(32ビット)です。何か案は? –

+0

@ElisevanLooij、配列演算子 '[]'はポインタ逆参照演算子よりも優先度が高い。なぜテストが失敗するのか説明できません。 –

関連する問題