5


1

配列の計算長

以下のように宣言されたC配列があります。

CString carray[] =
{
        "A",
        "B",
        "C",
        "D",
        "E"
}

実行時に `+ carray +`の長さを決定したい。 私がやっている:

int iLength = sizeof(carray)/sizeof(CString);

これは正しいです?

10 Answer


24


以下の機能テンプレートを使用することができます。 Boostを使用している場合は、http://www.boost.org/doc/libs/1_39_0/libs/range/doc/boost_range.html [`+ boost

size +`]を呼び出すことができます。

template
std::size_t size(T (&)[N])
{
    return N;
}

int iLength = size(carray);
ただし、他の人がすでに述べているように、Cスタイルの配列よりも `+ std

vector +`を好むはずです。


17


はい。 宣言された要素型が変わった場合は、次のように書くこともできます。

int iLength = sizeof(carray)/ sizeof(carray [0]);


6


このようにメタプログラミングを使用しているので、これは正しいです。

テンプレートインラインstd :: size_t array_size(T(

これは、コンパイラが配列定義を見ているときには機能することを知っておく必要がありますが、それが関数に渡された後(ポインタに崩壊するとき)には機能しません。

void f(int array []){// std :: cout << array_size(array)<< std :: endl; //この時点では配列はポインタであるstd :: cout << sizeof(array)/ sizeof(array [0])<< std :: endl; sizeof(int *)/ sizeof(int)} int main(){int array [] = {1、2、3、4、5}; //失敗します。 f(配列); std :: cout << array_size(array)<< std :: endl; // 5 std :: cout << sizeof(array)/ sizeof(array [0])<< std :: endl; // 5}


5


このコードは正しいですが、ほとんどの場合Cで配列を処理するためのより良い方法があります。 特にこの方法は動的サイズの配列では動作しません。

そのような場合、動的サイズの配列を表す標準ライブラリクラス `+ std

vector +`を使用します(つまり、 エントリを挿入および削除できます。


1


はい、これは正しいやり方ですが、これはarrayのサイズがコンパイル時にわかっていて `sizeof(array)`ステートメントのサイトで見られるような状況でのみ機能します。 動的サイズの配列では動作しません - それらのためには、stl

vectorのようなコンテナを使う、あるいは要素の数を別々のパラメータとして渡す/保存するといった他の方法が必要になります。


0


これは実行時ではなく、コンパイル時です。 使い方は正しいです。 Visual Studioは、同じことを行う `+ _countof +`関数を定義していることに注意してください。

実行時には長さを決定できません。 自分で長さを維持するか、 `+ std

vector +`を使用します


0


動的配列がある場合は、おそらくSTLベクトルのようなものを使うべきです。 http://www.cppreference.com/wiki/stl/vector/start

Cの通常の配列は固定サイズであり、動的なものを拡張するために手動でメモリを割り当てる必要があります。

コンパイル時の配列サイズがわかっている場合は、計算ではなく定数を使用してください。


0


Ivan J.による この記事を読んでください。 Johnson in * Dr。 ドブス*ジャーナル。 私はそれがここに提示された解決策の大部分をカバーすると思います。 また、各アプローチの長所と短所についても非常によく説明しています。


0


Windows SDK(例: windows.h header)は、この機能を安全な方法で実装するマクロARRAYSIZEを提供しています。 非静的配列では動作しません)


0


最善の方法は、マクロを使用し、サイズを指定したいところでそれを使用することです。

#define MAX_ROWS 1048 int配列[MAX_ROWS];

これにより、配列が引数として渡される関数でもMAX_ROWSを使用できます。