Incompatible pointer type
Habe ich die Funktion mit folgender Signatur:
void box_sort(int**, int, int)
und Variablen der folgenden Art:
int boxes[MAX_BOXES][MAX_DIMENSIONALITY+1]
Wenn ich den Aufruf der Funktion
box_sort(boxes, a, b)
GCC gibt mir zwei Warnungen:
103.c:79: warning: passing argument 1 of ‘box_sort’ from incompatible pointer type (string where i am calling the function)
103.c:42: note: expected ‘int **’ but argument is of type ‘int (*)[11] (string where the function is defined)
Die Frage ist warum? Ob int x[][] und int** x (und eigentlich int* x[]) sind nicht die gleichen Typen in C?
- Was sind
MAX_BOXES
undMAX_DIMENSIONALITY
? Sind Sie Makros, Konstanten, ... ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß, es war eine Frage fast genau so vor ein paar Tagen... kann ihn nicht finden, jetzt aber.
Die Antwort ist, dass
int[size][]
(siehe Hinweis unten) undint**
sind definitiv nicht das gleiche geben. Sie könnenint[]
undint*
austauschbar in vielen Fällen, insbesondere in Fällen wie diesem, da das array zerfällt zu einem Zeiger auf das erste element, wenn Sie an eine Funktion zu übergeben. Aber für ein zwei-dimensionales array, das sind sehr unterschiedliche Methoden zum speichern.Hier ist, was Sie Aussehen würde wie in der Erinnerung für eine 2x2-array:
Könnte man konstruieren, der zweite wie diese:
Hinweis: Wie andere haben darauf hingewiesen,
int[][]
ist nicht ein echter Typ, von denen nur eine die Größen nicht angegeben. Aber der Kern der Frage ist hier, ob ein zwei-dimensionales array und ein double-Zeiger sind die gleiche Sache.Du niemals konstruiert ein array von Zeigern, da die Unterschrift benötigt.
Gibt es zwei Wege, um 2D-arrays in C. In einem Fall, Sie einfach nur eine Menge von etwas, und der compiler wird gesagt, was sind die Abmessungen. Es berechnet den Anfang der Zeile durch Multiplikation der Zeilen-index durch die Anzahl der Spalten und dann fügt er die Spalte index zu finden das element in dieser Zeile.
Die andere Möglichkeit ist, mit einem Vektor von Zeigern, wo der compiler einfach dereferenziert den Vektor zu finden, der Anfang der Zeile, aber der compiler nicht machen diese für Sie automatisch, Sie müssen es selbst tun.
Ihre tatsächliche Objekt ist ein Objekt der ersten Art, aber Ihre Funktion Prototyp ist gefragt für die zweite Art.
So sollten Sie entweder ändern Sie den Prototyp zu entsprechen, das Objekt oder konstruieren Sie einen Vektor, der die Zeile Zeiger an die Funktion zu übergebende.
Gibt es keine solche geben, die in C als
int[][]
nur der erste Teil eines mehrdimensionalen Arrays nicht spezifiziert. Soint[][5]
ist okay.Zusätzlich zu den anderen Antworten hier gepostet, wenn du C99 verwenden, können Sie Variablen-arrays zu erreichen, was Sie wollen:
Dies funktioniert auf den meisten Plattformen außer Microsoft Visual C++.
Wenn ein array-Ausdruck erscheint in den meisten Kontexten, sein Typ ist implizit vom "N-element-array von T" zu "Zeiger auf T", und dessen Wert auf die Adresse des ersten Elements im array. Die Ausnahmen zu dieser Regel sind, wenn der array-Ausdruck ist operand des
sizeof
oder Adresse von (&
) Betreiber, oder, wenn das array-Ausdruck ist ein string-literal verwendet wird, zu initialisieren ein array in einer Erklärung.Was bedeutet dies im Kontext des Codes ist, dass Sie in Ihrem Aufruf
box_sort
, der Typ des Ausdrucksboxes
implizit umgewandelt vonM-element array of N-element array of int
zupointer to N-element array of int
oderint (*)[MAX_DIMENSIONALITY+1]
, so dass deine Funktion erwartet parameter-Typen wie:Seit
int *a
undint a[]
sind Synonym in einer Funktion parameter-Deklaration folgt, dassint (*a)[N]
ist gleichbedeutend mitint a[][N]
, so könnten Sie schreiben, die oben alsobwohl ich persönlich bevorzuge die Zeiger-notation, wie es genauer reflektiert, was Los ist. Beachten Sie, dass in Ihrer Funktion, Sie würde Tiefgestellt
arr
normal:da die expression
arr[x]
entspricht*(arr + x)
, der pointer wird implizit dereferenziert.Wenn Sie möchten, box_sort arbeiten auf beliebig dimensionierte arrays (d.h., arrays, wo die zweite dimension ist nicht unbedingt MAX_DIMENSIONALITY+1), dann ein Ansatz ist Folgendes zu tun:
Im Grunde hast du die Behandlung
boxes
als 1-d array von int und der Berechnung der offsets manuell.