配列に対していくつかの計算を行う関数がありますが、配列のサイズを知る必要があります。私の関数がサイズなしで配列自体しか持っていない場合、どうすればそれを得ることができますか?
多次元配列でそれを行うことは可能ですか?
配列に対していくつかの計算を行う関数がありますが、配列のサイズを知る必要があります。私の関数がサイズなしで配列自体しか持っていない場合、どうすればそれを得ることができますか?
多次元配列でそれを行うことは可能ですか?
あなたの質問は「C++」とタグ付けされているため、最初のルールは次のとおりです。
配列は悪です!可能であれば、配列を使用しないでください。std::vector
代わりに (または別のコンテナー)を使用
void Foo(const std::vector<int>& v)
{
size_t size = v.size();
}
ただし、配列を使用する必要がある場合は、次のようにします。
配列がスタックに割り当てられ、配列変数として渡された場合: テンプレート トリックを使用できます。
template<typename T, size_t size>
size_t GetSize(T (&arr)[size])
{
return size;
}
しかし、これは非常にやり過ぎです。異なる配列サイズでこのような関数を頻繁に呼び出すと、コードが膨大になります。
配列がポインターとして渡され、文書化された「配列の終わり」フラグがない場合: 不可能
配列に「配列の終わり」フラグがある場合: このフラグまでのすべての要素を数えます。Null で終わる C 文字列は良い例です。
size_t strlen(const char *str)
{
size_t size = 0;
while(*str++)
++size;
return size;
}
「本当に配列を使用する必要があります」とは、たとえば、C インターフェイスである種のライブラリを使用する場合を意味します。そのようなライブラリのほとんどは、配列データへのポインターとともに配列サイズを提供するか、そのような配列の終わりを見つける方法について明示的に文書化された規則を持っています(C文字列を除く。誰もが知っている、それらはで終わる\0
)。この方法はどれも本当に安全ではありません。
ところで、私はすでに配列が悪だと言いましたか? =)
また、C では非常に一般的です。配列のサイズを引数として関数に渡します。
例: ベクトルにスカラーを掛ける
void scalar_mutliply ( double* vector, double scalar, unsigned size ) {
for ( unsigned i = 0; i < size; ++i ){
vector[i] *= scalar;
}
}
そしてそれをテストするには:
using namespace std;
int main ( ) {
double vector [] = { 1, 2, 3, 4 ,5 };
scalar_mutliply( vector, 2, sizeof(vector)/sizeof(vector[0]) );
for (int i = 0; i < sizeof(vector)/ sizeof(vector[0]); ++i ){
cout << vector[i] << endl;
}
return 0;
}
この出力は次のようになります。
2
4
6
8
10