これは(理由を説明するコメント)私の作品:
#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);
}
そして、これの出力は次のとおりです。
Total of fields: 70
Number of rows: 10
Number of columns: 7
EDIT:
指されているように@AnorZakenによって配列にパラメータとして関数を渡し、sizeof
の結果を出力すると、別のtotal
が出力されます。これは、配列を引数として渡すと、Cはそれをコピーとして渡し、その間にCマジックを適用するので、あなたが思っている通りに全く同じものを渡すことはないからです。あなたが何をしているのかを確認し、余分なCPUの作業とメモリ消費を避けるために、ポインタとポインタを使って配列とオブジェクトを参照渡しする方が良いでしょう。だから、オリジナルと同じ結果が得られ、このようなものを使用することができます。
#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;
}
=はsizeof 'int型の列(結果[0])/ sizeof(結果[0] [0]); ' – BLUEPIXY
これらは静的なので、どうしてそれらを数えたいと思いますか? 「マジックナンバー」ではなく、行と列のサイズの定数を定義するだけです。 – Lundin