2016-05-13 7 views
0

Im Beispiel unten Ich versteht nicht, warum ich diese Fehlermeldung erhalten:Unvollständige Typ Element in lang foo [2] []

test.c:3:6: error: array type has incomplete element type 

Hier wird der Compiler einen vollständigen Typen dh[2][3] in Betracht ziehen sollte, weil Jedes Unterelement hat eine Größe von 3. Also, wo ist das Problem?

long foo[2][] = { 
    {2,3,4}, 
    {5,6,7} 
}; 

Wenn ich die Art vervollständigen foo[2][3] mit werde ich diese Fehlermeldung erhalten:

test.c:9:5: note: expected ‘long int *’ but argument is of type ‘long int (*)[3]’ 
int bar(long* list, size_t size) 

Mit diesem Beispiel:

int bar(long* list, size_t size); 

int main() {  
    bar(&foo[0], sizeof(foo[0])); 
    return 0; 
}  

Wie kann ich es beheben?

+0

Mögliche Duplikate von [Übergabe eines 2D-Arrays von Strukturen] (http://StackOverflow.com/Questions/35614862/Passing-A-2D-Array-of-Structs) – Olaf

+1

'bar (foo [0] , sizeof foo [0]/sizeof foo [0] [0]) ' –

Antwort

2

Here, the compiler should consider a complete type i.e. [2][3] because each sub-element has a size of 3. So, where is the problem?

Wenn Sie hat es mögen:

long foo[2][] = { 
    {2,3,4}, 
    {5,7} 
}; 

Was sollte der Compiler in diesem Fall tun? Ist es [2][2] oder [2][3]?

In C ist es nur möglich, die linke Dimension eines Arrays wegzulassen.So können Sie tun:

long foo[][3] = { 
    {2,3,4}, 
    {5,6,7} 
}; 

Relevante Beitrag: why c/c++ allows omission of leftmost index of a multidimensional array in a function call?

note: expected ‘long int ’ but argument is of type ‘long int ()[3]’ int bar(long* list, size_t size)

Dies liegt daran, die Art Sie passieren und bar erwarten nicht übereinstimmen. Meine persönliche Wahl ist zu verwenden:

int bar(long (*list)[3], size_t size) { 

} 

und rufen:

bar(foo, sizeof foo/sizeof foo[0]); 

Aber es gibt auch andere Möglichkeiten. Siehe: How to pass 2D array (matrix) in a function in C?

0

Ja unten Code wird nicht kompiliert wie:

long foo[2][] = { 
    {2,3,4}, 
    {5,6,7} 
}; 

Erklärung 'foo' als mehrdimensionale Array-Grenzen für alle Dimensionen mit Ausnahme der ersten lang foo haben muss [2] [] = {

Sie können den folgenden Code erfolgreich kompilieren:

long foo[][3] = { 
    {2,3,4}, 
    {5,6,7} 
}; 

ich bin in der Lage, erfolgreich den folgenden Code zu kompilieren:

long foo[2][3] = { 
     {2,3,4}, 
     {5,6,7} 
    }; 


^
+0

Sie haben den zweiten Fehler nicht behandelt:' test.c: 9: 5: hinweis: erwartet 'long int *' aber Argument ist vom Typ ' long int (*) [3] '' –

3

Sie können nur auf der linken Seite, um die Dimension auslassen, das heißt Sie

long foo[][3] = { { 2, 3, 4 }, { 5, 6 ,7 } }; 

tun können, aber nicht umgekehrt, wie Sie versucht. Es wird einfach nicht unterstützt, vielleicht, weil die Überprüfung, ob die Länge aller Sub-Arrays gleich ist, als zu teuer angesehen wurde oder was auch immer.

Für das zweite Problem die Tatsache, dass Sie eine * in den Fehler erhalten sollten Sie dazu führen, die & in den Anruf zu entfernen. Sie möchten das Sub-Array, das zu einem Zeiger auf das erste Element wird, und keinen Zeiger auf ein Array.

Denken Sie auch daran, dass sizeof die Größe der Zahl der char s zurückkehrt, so für einen Array müssen Sie verkleinern:

bar(foo[0], sizeof foo[0]/sizeof foo[0][0]); 
+0

In meinem Beispiel bekomme ich immer noch den Fehler' note: expected 'long int *', aber das Argument ist vom Typ 'long int (*) [3]'' – nowox

Verwandte Themen