2016-03-30 2 views
0

Für einen Moment dachte ich tatsächlich, dass ich diesen ganzen Zeiger, Referenzierung und Dereferenzierung Sache verstanden habe, aber jetzt bin ich wieder ratlos.Wie Elemente in einem Bytearray (übergeben durch Verweis) mit ganzzahligen Werten verglichen werden

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

Keine Notwendigkeit für '(uint8_t **)' ', wenn (uint8_t *)' würde genügen, nicht wahr? –

+0

@FiddlingBits Sie würden denken, aber nein, nicht nach http://stackoverflow.com/questions/30618860/pass-uint8-t-array-to-method. –

+0

Ich habe den Code bearbeitet, um es klarer zu machen, dass evaluate: erwartet einen Zeiger auf ein Array. Sie können das Array als Referenz übergeben, aber Sie können dann keine Vergleiche für die Elemente im Array durchführen. –

Antwort

2

Aufgrund Operatorpräzedenz,

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

entspricht

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

Das ist nicht das, was Sie wollen.

Was Sie brauchen, ist:

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

Und Operatorenpräzedenz bedeutet: erste Dereferenzierung und dann den Wert erhalten? Cool. Eine weitere Sache, in meinem Produktionscode schlägt der zweite Test jetzt mit: ("3") ist nicht gleich ("3"), wobei 3 ein NSInteger (32-Bit) ist. Irgendwelche Ideen? –

+0

@ElisevanLooij hat der Array-Operator '[]' eine höhere Priorität als der Zeiger-Dereferenzierungsoperator. Ich kann nicht erklären, warum der Test fehlschlägt. –

Verwandte Themen