2015-12-07 32 views
6

Ich brauche Hilfe beim Zählen der Zeilen und Spalten eines zweidimensionalen Arrays. Es scheint, dass ich keine Spalten zählen kann?C: Größe des zweidimensionalen Arrays

#include <stdio.h> 

int main() { 

char result[10][7] = { 

    {'1','X','2','X','2','1','1'}, 
    {'X','1','1','2','2','1','1'}, 
    {'X','1','1','2','2','1','1'}, 
    {'1','X','2','X','2','2','2'}, 
    {'1','X','1','X','1','X','2'}, 
    {'1','X','2','X','2','1','1'}, 
    {'1','X','2','2','1','X','1'}, 
    {'1','X','2','X','2','1','X'}, 
    {'1','1','1','X','2','2','1'}, 
    {'1','X','2','X','2','1','1'} 

}; 

int row = sizeof(result)/sizeof(result[0]); 
int column = sizeof(result[0])/row; 

printf("Number of rows: %d\n", row); 
printf("Number of columns: %d\n", column); 

} 

Ausgang:
Reihenanzahl: 10
Anzahl der Spalten: 0

+3

'int column = sizeof (result [0])/sizeof (result [0] [0]); ' – BLUEPIXY

+1

Da sie statisch sind, warum sollten Sie sie trotzdem zählen wollen? Definieren Sie einfach Konstanten für die Zeilen- und Spaltengröße, anstatt "magische Zahlen" zu verwenden. – Lundin

Antwort

4

Das ist ein Problem der Integer-Division ist!

int column = sizeof(result[0])/row; 

sollte

int column = 7/10; 

und in Ganzzahl-Division, 7/10==0 sein.

Was möchten Sie tun, ist die Länge einer Zeile teilen, z. sizeof(result[0]) um die Größe eines Elements dieser Zeile, z. sizeof(result[0][0]):

int column = sizeof(result[0])/sizeof(result[0][0]); 
+1

Das ist falsch. Hier teilen Sie 7 (Anzahl der Elemente in der ersten Zeile) durch 1 (Anzahl der Zeichen in 'result [0] [0]'). – emi

5

Dies funktioniert für mich (kommentiert erklärt warum):

#include <stdio.h> 

int main() { 

    char result[10][7] = { 

     {'1','X','2','X','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'1','X','2','X','2','2','2'}, 
     {'1','X','1','X','1','X','2'}, 
     {'1','X','2','X','2','1','1'}, 
     {'1','X','2','2','1','X','1'}, 
     {'1','X','2','X','2','1','X'}, 
     {'1','1','1','X','2','2','1'}, 
     {'1','X','2','X','2','1','1'} 

    }; 

    // 'total' will be 70 = 10 * 7 
    int total = sizeof(result); 

    // 'column' will be 7 = size of first row 
    int column = sizeof(result[0]); 

    // 'row' will be 10 = 70/7 
    int row = total/column; 

    printf("Total fields: %d\n", total); 
    printf("Number of rows: %d\n", row); 
    printf("Number of columns: %d\n", column); 

} 

Und die Ausgabe dieser ist:

Total of fields: 70 
Number of rows: 10 
Number of columns: 7 

EDIT:

Wie gezeigt durch @AnorZaken, übergibt das Array an eine Funktion als Parameter und das Ergebnis von sizeof darauf drucken, wird eine andere total ausgeben. Das liegt daran, dass Sie, wenn Sie ein Array als Argument übergeben (nicht als Zeiger darauf), C als Kopie übergeben und etwas C-Magie dazwischen anwenden, so dass Sie nicht genau das Gleiche passieren, wie Sie es für richtig halten. Um sicher zu sein, was Sie tun, und um einige zusätzliche CPU-Arbeit und Speicherverbrauch zu vermeiden, ist es besser, Arrays und Objekte als Referenz (mit Zeigern) zu übergeben. So können Sie so etwas wie diese, mit gleichen Ergebnissen wie Original verwenden:

#include <stdio.h> 

void foo(char (*result)[10][7]) 
{ 
    // 'total' will be 70 = 10 * 7 
    int total = sizeof(*result); 

    // 'column' will be 7 = size of first row 
    int column = sizeof((*result)[0]); 

    // 'row' will be 10 = 70/7 
    int row = total/column; 

    printf("Total fields: %d\n", total); 
    printf("Number of rows: %d\n", row); 
    printf("Number of columns: %d\n", column); 

} 

int main(void) { 

    char result[10][7] = { 

     {'1','X','2','X','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'X','1','1','2','2','1','1'}, 
     {'1','X','2','X','2','2','2'}, 
     {'1','X','1','X','1','X','2'}, 
     {'1','X','2','X','2','1','1'}, 
     {'1','X','2','2','1','X','1'}, 
     {'1','X','2','X','2','1','X'}, 
     {'1','1','1','X','2','2','1'}, 
     {'1','X','2','X','2','1','1'} 

    }; 

    foo(&result); 

    return 0; 
} 
+2

Code-Only-Antworten ohne Erklärung sind oft sehr hilfreich für zukünftige Besucher. Überlegen Sie, Ihre Antwort zu bearbeiten, um weitere Informationen zu Ihrem Lösungsprozess zu erhalten. – Magisch

+4

Code ist für mich autoexperimentell, aber Sie verstehen. Bearbeiten Sie jetzt die Antwort. – emi

+0

Wenn Sie darauf hinweisen, dass dies nicht für Arrays funktioniert, die als Funktionsargumente empfangen werden, insbesondere "total = sizeof result;", funktioniert das nicht: Es wird eine Warnung generiert und die Größe eines einzelnen Elements anstelle der Größe des ganzes Array. Also ist entweder VLA erforderlich (und Sie übergeben Zeilen- und Spaltenargument) oder Sie müssen entweder die Zeilen- oder Gesamtanzahl als Argument übergeben (die Spalte kann immer noch mit sizeof bestimmt werden). – AnorZaken

6

Es ist viel bequemer (und weniger fehleranfällig) ein Array Länge Makro zu verwenden:

#include <stdio.h> 

#define LEN(arr) ((int) (sizeof (arr)/sizeof (arr)[0])) 

int main(void) 
{ 
    char result[10][7]; 

    printf("Number of rows: %d\n", LEN(result)); 
    printf("Number of columns: %d\n", LEN(result[0])); 
    return 0; 
} 
+0

Warum wird die Ganzzahl auf das 'LEN'-Makro angewendet? Sind Arrays keine homogenen Datenstrukturen, d. H. Der Nenner wird immer ein Vielfaches des Nenners sein? Sollte die Division nicht auch eine 'vorzeichenlose Ganzzahl 'oder' size_t' zurückgeben, die bereits ein ganzzahliger Typ ist? – Rafa

+1

@Rafa Wir können auf die Besetzung verzichten, wenn wir den Formatbezeichner '% d' in'% lu' ändern. Wenn * LEN * in einem 'for'-Loop-Guard verwendet wird, müssen wir einen Cast verwenden oder die Indexvariablen mit dem Typ * size_t * deklarieren. –

Verwandte Themen