2016-06-22 4 views
0

私はいくつかの配列を順番に整列させ、ある種の分類を実行しています。私は、実行したい操作を簡単にするために、他の配列を保持する配列を作成しました。ループ内の配列のサイズを取得する方法

悲しいことに、私のプログラムが実行されたときにクラッシュして、デバッグを続けてsizeofオペレータが私にポインタのサイズを与えてループ内の配列を与えていないことを実感しました。私は厄介な解決法と私のプログラム働いた。

どうすればこの厄介な方法を避けることができますか?私はループ内で計算したい!

#include <iostream> 
#include <string> 

#define ARRSIZE(X) sizeof(X)/sizeof(*X) 

int classify(const char *asset, const char ***T, size_t T_size, size_t *index); 

int main(void) 
{ 
    const char *names[] = { "book","resources","vehicles","buildings" }; 

    const char *books[] = { "A","B","C","D" }; 
    const char *resources[] = { "E","F","G" }; 
    const char *vehicles[] = { "H","I","J","K","L","M" }; 
    const char *buildings[] = { "N","O","P","Q","R","S","T","U","V" }; 

    const char **T[] = { books,resources,vehicles,buildings }; 

    size_t T_size = sizeof(T)/sizeof(*T); 
    size_t n, *index = new size_t[T_size]; 

    /* This will yeild the size of pointers not arrays... 
     for (n = 0; n < T_size; n++) { 
      index[n] = ARRSIZE(T[n]); 
     } 
    */ 

    /* Cumbersome solution */ 
    index[0] = ARRSIZE(books); 
    index[1] = ARRSIZE(resources); 
    index[2] = ARRSIZE(vehicles); 
    index[3] = ARRSIZE(buildings); 

    const char asset[] = "L"; 

    int i = classify(asset, T, T_size, index); 

    if (i < 0) { 
     printf("asset is alien !!!\n"); 
    } 
    else { 
     printf("asset ---> %s\n", names[i]); 
    } 

    delete index; 
    return 0; 
} 

int classify(const char *asset, const char ***T, size_t T_size, size_t *index) 
{ 
    size_t x, y; 

    for (x = 0; x < T_size; x++) { 
     for (y = 0; y < index[x]; y++) { 
      if (strcmp(asset, T[x][y]) == 0) { 
       return x; 
      } 
     } 
    } 
    return -1; 
} 
+6

'std :: vector >'を使うことをお勧めします。 – NathanOliver

+3

C++ヘッダー( 'iostream'、' string')とC関数( 'printf、strcmp')が混在しています。一つの言語を選んでください。 – Andrew

+0

両方の言語を混在させると何が問題になりますか?コンパイラは不平を言うことはありません。リスクはありますか?または1つの言語を持つだけでいいですか? C++はcにスーパーです。 cのすべてがC++になっています。 –

答えて

4

あなたは<string><iostream>を含めているとして、私は質問が単にコンテナを使用して、すべてのこの合併症を回避するためにC.約C++とではないことを前提としています。例:

#include <vector> 

std::vector<int> vect = std::vector<int>(3,0); 
std::cout << vect.size() << std::endl;   // prints 3 
2

一つの解決策あなたがCでコーディングされている場合は、特別なアイテムを使用して、アレイを終了することで、NULL

よう
const char *books[] = { "A","B","C","D", NULL }; 

size_t size(const char *arr[]) 
{ 
    const char **p = arr; 

    while (*p) 
    { 
     p++; 
    } 

    return p - arr; 
} 
0

あなたは配列サイズexplizit指定することができます。

size_t n, index[] = {ARRSIZE(books), ARRSIZE(resources), ARRSIZE(vehicles), ARRSIZE(vehicles)}; 

を入力するか、ダブルタイピングを避けたい場合はX-Macrosですべてを展開できます:

#define TBL  \ 
    X(books)  \ 
    X(resources) \ 
    X(vehicles) \ 
    X(buildings) 

    const char **T[] = { 
#define X(x) x, 
TBL 
    }; 
#undef X 

    size_t n, index[] = { 
#define X(x) ARRSIZE(x), 
TBL 
}; 

これを産生する。 Running Demoを参照してください。

関連する問題