2016-03-30 24 views
0

Bir an için bu işaretçiyi, referans alma ve hata mesajını anladığımı düşündüm, ama şimdi tekrar güvendim. Operatör önceliği nedeniyleBir bayt dizisindeki (referans olarak iletilen) öğelerin tamsayı değerleriyle karşılaştırılması

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

gerek yok? –

+0

@FiddlingBits Bunu düşünebilirsiniz, fakat hayır, http://stackoverflow.com/questions/30618860/pass-uint8-t-array-to-method adresine göre değil. –

+0

Değerlendirmeyi daha net hale getirmek için kodu düzenledim: bir diziye bir işaretçi bekler. Diziyi başvuruyla geçirebilirsiniz, ancak dizideki öğeler üzerinde karşılaştırma yapamazsınız. –

cevap

2

,

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

istediğini değil Yani

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

eşdeğerdir.

İhtiyacın olan: `(uint8_t **)` `(uint8_t *)` doğru, yeterli olurdu için

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

Ve operatör önceliği, şu anlama gelir: önce dereference ve sonra değeri al? Güzel. Bir başka şey de, üretim kodumda ikinci test şu şekilde başarısız oluyor: ("3") (3 ") 'e eşit değil, burada 3 bir NSInteger (32-bit). Herhangi bir fikir? –

+0

@ElisevanLooij, dizi operatörü '[]' işaretçi dereference operatöründen daha yüksek önceliğe sahiptir. Testin neden başarısız olduğunu açıklayamam. –

İlgili konular