これは、CおよびC++の両方をマークし、あなたは根本的に取得するつもりされます異なる答え。
あなたは四つのパラメータを期待している場合は、この操作を行うことができます。
void foo(float f[])
{
float f0 = f[0];
float f1 = f[1];
float f2 = f[2];
float f3 = f[3];
}
int main(void)
{
float f[] = {1, 2, 3, 4};
foo(f);
}
しかし、あなたが事故でこれを行う可能性があるので、それは、かなり安全ではありません:
void foo(float f[])
{
float f0 = f[0];
float f1 = f[1];
float f2 = f[2];
float f3 = f[3];
}
int main(void)
{
float f[] = {1, 2}; // uh-oh
foo(f);
}
それは残すことが最善でありますそれらを個別のパラメータとして使用します。
#include <cassert>
#include <vector>
void foo(std::vector<float> f)
{
assert(f.size() == 4);
float f0 = f[0];
float f1 = f[1];
float f2 = f[2];
float f3 = f[3];
}
int main(void)
{
float f[] = {1, 2, 3, 4};
foo(std::vector<float>(f, f + 4)); // be explicit about size
// assert says you cannot do this:
foo(std::vector<float>(f, f + 2));
}
改善が、しかし、1つのあまりありません:あなたはとにかく生の配列を使用してはならないので、あなたはこれを行うことができます。あなたはboost::array
を使用することができますが、むしろ不一致サイズのエラーよりも、それらは0に初期化されています
#include <boost/array.hpp>
void foo(boost::array<float, 4> f)
{
float f0 = f[0];
float f1 = f[1];
float f2 = f[2];
float f3 = f[3];
}
int main(void)
{
boost::array<float, 4> f = {1, 2, 3, 4};
foo(f);
boost::array<float, 4> f2 = {1, 2}; // same as = {1, 2, 0, 0}
foo(f2);
}
これは、すべての初期化子リストのコンストラクタが追加されたC++ 0xの、中に固定されます。
#include <cassert>
#include <vector>
void foo(std::vector<float> f)
{
assert(f.size() == 4);
float f0 = f[0];
float f1 = f[1];
float f2 = f[2];
float f3 = f[3];
}
int main(void)
{
foo({1, 2, 3, 4}); // yay, construct vector from this
// assert says you cannot do this:
foo({1, 2});
}
おそらくboost::array
同様:
#include <boost/array.hpp>
void foo(boost::array<float, 4> f)
{
float f0 = f[0];
float f1 = f[1];
float f2 = f[2];
float f3 = f[3];
}
int main(void)
{
foo({1, 2, 3, 4});
foo({1, 2}); // same as = {1, 2, 0, 0} ..? I'm not sure,
// I don't know if they will do the check, if possible.
}
アドバイスありがとうございます。私は迅速かつ汚れた質問のために迅速かつ汚れた回答を期待していたと思いますが、あなたの回答は私が考えていなかったいくつかの代替スタイルを模索しました。とても有難い! – sinoth