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;
}
'int column = sizeof (result [0])/sizeof (result [0] [0]); ' – BLUEPIXY
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