2010-12-28 5 views
2

Ich gehe davon aus, dass diese Warnung meine App abstürzt. Ich verwende objective-c für eine iOS App. Xcode gibt keine Stack-Trace oder irgendetwas. Nicht hilfreich.Initialisierung von inkompatiblen Zeigertyp Warnung. Ich kann das Problem nicht finden

Ich habe diese Aufgabe als eine globale Variable:

int search_positions[4][6][2] = {{{0,-2},{0,1},{1,-1},{-1,-1},{1,0},{-1,0}}, //UP 
    {{-2,0},{1,0},{-1,1},{-1,-1},{0,1},{0,-1}}, //LEFT 
    {{0,2},{0,-1},{1,1},{-1,1},{1,0},{-1,0}}, //DOWN 
    {{2,0},{-1,0},{1,1},{1,-1},{0,1},{0,-1}} //RIGHT 
}; 

Würde nicht search_positions daher ein Zeiger auf einen Zeiger auf einen Integer-Zeiger sein?

Warum gibt dies "Initialisierung von inkompatiblem Zeiger"?

int ** these_search_positions = search_positions[current_orientation]; 

Sicherlich braucht dies nur einen Zeiger auf einen ganzzahligen Zeiger aus dem Array, offseted durch current_orientation?

Was fehlt mir hier? Ich dachte, ich wüsste jetzt schon Hinweise. :(

Danke

Antwort

4

search_positions[current_orientation] ist nicht vom Typ int**;. Es ist vom Typ int[6][2]search_positions ist kein Zeiger;. Es ist ein Array

Ein Zeiger auf search_positions[current_orientation] vom Typ wäre. int(*)[6][2] wenn Sie die Adresse des Arrays nehmen:

int (*these_search_positions)[6][2] = &search_positions[current_orientation]; 

oder vom Typ int(*)[2], wenn Sie nehmen Sie nicht die Adresse des Arrays und stattdessen le t die Matrix-zu-Zeigerumwandlungs zu:

int (*these_search_positions)[2] = search_positions[current_orientation]; 
+0

Okay, danke erklären könnte. Ich denke, ich erinnere mich jetzt ... Es wäre einfacher, wenn Arrays nur Zeiger wären. Sie können Arrays durch Zeiger machen (Denken Sie nur an malloc), warum kann es nicht umgekehrt sein? –

+0

@Matthew Mitchell: Arrays _aren'_ nur Zeiger. Das ist eine fundamentale Tatsache von C. Wenn du willst, dass sie gleich sind, würde es bedeuten, den einen oder anderen aufzugeben. Was würden Sie bevorzugen: keine Zeiger oder keine Arrays? Ich denke, dass das Fehlen von beiden zu einer stark verkrüppelten Sprache führen würde. –

+0

Nun, Sie können einen Zeiger auf ein Array (nicht ein Array offenbar. Vielleicht eine Menge?) Von weiteren Zeigern oder Daten haben. Sie können dies mit malloc tun. Sie können auf Daten in diesen Pointer-Arrays oder auf andere Weise mit der gleichen quadratischen Brake-Syntax zugreifen. Es macht es für mich verwirrender. –

1

Pointers nicht-Arrays sind Anordnungen keine Zeiger

search_positions als ‚Array von 4-Arrays von 6-Arrays von 2 definiert ist int s '. Dies macht search_positions[current_orientation] ein 'Array von 6 Arrays von 2 int s'.
Dieses Array kann implizit in einen Zeiger konvertiert werden, aber das würde Ihnen nur einen Zeiger auf ein Array von 2 int s (int (*)[2]) geben. Dies ist ein anderer Typ als der Zeiger auf den Zeiger auf int, den Sie verwendet haben, und es gibt keine geeignete Konvertierung zwischen den beiden.

das Problem zu überwinden, Sie these_search_positions als

int (*these_search_positions)[2] = search_positions[current_orientation]; 
+0

Okay danke. Also kann ich die erste Ebene des Arrays in einen Zeiger von Integer-Arrays konvertieren? Ich werde versuchen, mich daran zu erinnern und die Syntax, die Sie gepostet haben, für die ich keinen Sinn habe. –

Verwandte Themen