2011-07-20 4 views
2

私はnamesという2次元配列の変数を持っています。 以下のように宣言し、最大5つの名前があり、各名前は256文字で構成されます。2次元配列のC++での参照渡しに問題がある

int main(){ 
    char names[5][256]; 
    strcpy(names[0],"John"); 
    strcpy(names[1],"Matt"); 
    printf("%d\n",sizeof(names)/256);  //this prints out 5 which is correct 
    passit(names);    
} 

void passit(char names[][256]){ 
    printf("%d\n",sizeof(names)/256);  //this prints out 8 which seems to be a size of pointer 
} 

passit機能では、要素の数が正しく印刷されるようにどのように私はこれを変更する必要がありますか?

+0

CまたはC++?一つを選ぶ。 –

+0

これはC++用です – user482594

+0

参照渡しはどこですか? –

答えて

7

あなたのコードはCスタイルです。あなたは本当にC++を書いているなら、私はstd::coutstd::vectorstd::stringを使用することをお勧め:

void passit(std::vector<std::string> const& names) { 
    std::cout << names.size(); 
} 

int main() { 
    std::vector<std::string> names(5); 
    names[0] = "John"; 
    names[1] = "Matt"; 

    std::cout << names.size(); 
    passit(names);    
} 

そうでない場合は、既存のコードに中間修正を行うことができます。

値を指定して配列を渡そうとすると、実際にはポインタ(この場合はchar(*)[256])に減衰し、最初の次元のサイズに関するすべての情報が失われます。

参照を渡すことで配列を渡すことはできませんが、すべての配列の次元を含む完全な配列型を指定する必要があります。テンプレート引数の差し引きにより、自動的にこれが行われます。

template <size_t N> 
void passit(char (&names)[N][256]) { 
    printf("%d\n", N); 
} 
+0

関数宣言を変更せずにこの問題を解決できる方法は他にありませんか? – user482594

+2

@ user482594:いいえ。値で配列を渡そうとすると、実際にはポインタ(この場合は 'char(*)[256]')に崩壊し、最初の次元のサイズに関するすべての情報が失われます。参照渡しは、完全な配列型を指定する必要がある場合を除いて、これを避けます。テンプレート引数の控除によってこれが自動的に行われます。 –