2015-12-07 36 views
6

2次元配列の行と列を数え上げる助けが必要です。私は列を数えることができないようですね?C:2次元配列のサイズ

#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); 

} 

出力:行の
数:列の10
数:0

+3

=はsizeof 'int型の列(結果[0])/ sizeof(結果[0] [0]); ' – BLUEPIXY

+1

これらは静的なので、どうしてそれらを数えたいと思いますか? 「マジックナンバー」ではなく、行と列のサイズの定数を定義するだけです。 – Lundin

答えて

4

整数の除算の問題です!

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

int column = 7/10; 

と整数除算、7/10==0であるべきです。

あなたがしたいのは、1つの行の長さを分割することです。 sizeof(result[0])で、その行の1要素のサイズで指定します。 sizeof(result[0][0])

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

これは間違っています。ここでは、7(1行目の要素数)を1( 'result [0] [0]'の文字数)で割ります。 – emi

5

これは(理由を説明するコメント)私の作品:

#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; 
} 
+2

説明なしのコードのみの回答は、将来の訪問者にはあまり役に立たないことがよくあります。答えを編集して、あなたの解決プロセスに関する詳細な情報や洞察を提供することを検討してください。 – Magisch

+4

コードは私には自動記述されていますが、理解しています。今答えを編集する。 – emi

+0

これは、関数の引数として受け取った配列では機能しません。具体的には 'total = sizeof result;'は動作しません。警告が生成され、要素のサイズではなく単一要素のサイズに評価されます。アレイ全体。だから、VLAが必要です(そして、u行と列の引数を渡す)か、引数として行数または合計数を渡す必要があります(columnはsizeofで決定できます)。 – AnorZaken

6

をそれは、配列の長さのマクロを使用するためにはるかに便利(とエラーが発生しにくい)です:

#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

整数が 'LEN'マクロにキャストされるのはなぜですか?配列が均質なデータ構造ではない、すなわち、指名子は常に分母の倍数ですか?また、除算が 'unsigned integer'を返すべきではないか、すでに整数型である' size_t'を返すべきではありませんか? – Rafa

+1

@Rafaフォーマット指定子 '%d'を'%lu'に変更すると、キャストなしで実行できます。 * LEN *が 'for'ループガードで使用されるときは、キャストを使うか、* size_t *型のインデックス変数を宣言する必要があります。 –