如何获得传递给函数的C ++数组的大小?
在以下代码中,sizeof(p_vertData)
未返回正确的数组大小。
float verts[] = {
-1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,-1.0,1.0,
-1.0,-1.0,1.0,
-1.0,1.0,-1.0,
1.0,1.0,-1.0,
1.0,-1.0,-1.0,
-1.0,-1.0,-1.0
};
void makeVectorData(float p_vertData[]) {
int num = (sizeof(p_vertData)/sizeof(int));
cout << "output: " << num << endl;
};
我做错了什么?
答案 0 :(得分:13)
你不能 - 当作为函数参数传递时,数组会衰减为指针,因此sizeof
不会对你有所帮助。
答案 1 :(得分:7)
如果您不介意模板,可以执行以下操作。请注意,只有在编译时已知数组大小时才能使用它。
template <int N>
void makeVectorData(float (&p_vertData)[N]) {
int num = (sizeof(p_vertData)/sizeof(p_verData[0]));
cout << "output: " << num << endl;
};
还要注意你应该将sizeof(数组)除以数组元素大小。在您的示例中,您将浮点数组的大小除以整数的大小。
答案 2 :(得分:3)
在您的示例中,它实际上是将指针传递给方法;没有尺寸信息。有必要从调用方法传递大小。
答案 3 :(得分:1)
如果在编译时未生成数组,则不能除以sizeof(float)。但是,在这种情况下,它是,所以编译器知道数组的大小。要记住的事情。
答案 4 :(得分:1)
您不能将矢量作为参数传递给函数。
实际上,你可以,但无论你是写(float *data
)还是(float data[]
),函数总是接受它作为指针(对第一个元素)。
使用sizeof(verts)/sizeof(verts[0])
将大小作为单独的参数传递。
答案 5 :(得分:1)
使用模板:
// old function, the type is the same as Type pointer[]
// you need extra size parameter
void do_something( Type* pointer, size_t size ){ };
//this template will catch reference to array, rather then just bar pointer:
template < int size > // size must be compile time expression
inline void do_something( Type (&array) [ size ] ) // this is tricky, this & is needed
{
do_something( array, size ); // array is implicitly cast to pointer
}
//now you can use it:
Type data[10];
do_something(data);
//but when using dynamic arrays, you need to add size parameter:
int some_size = getSomeSize();
Type *pointer_to_data= new Type[some_size];
do_something(pointer_to_data,some_size);
delete[] pointer_to_data; //newer forget to delete, or use smart pointers.
你需要这个技巧,以防止数组被隐式转换为指针。额外模板是为了防止在仅更改大小时多次编译原始函数。
答案 6 :(得分:1)
同意马克和保罗。您必须传递数组的大小以及数组函数参数本身。
作为旁注,在声明静态常量数组时,我倾向于将定义和另一个“size”值组合在一起。例如,假设我将float数组定义为静态常量全局(例如,作用域为.cpp文件),那么我将按如下方式定义相应的“size”值:
static const float VERTS[] = {
-1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
1.0,-1.0, 1.0,
1.0,-1.0, 1.0,
-1.0, 1.0,-1.0,
1.0, 1.0,-1.0,
1.0,-1.0,-1.0,
-1.0,-1.0,-1.0
};
static const unsigned int VERTS_SIZE = sizeof(VERTS) / sizeof(VERTS[0]);
这将允许我轻松迭代顶点的内容,而无需每次都确定大小。
for (unsigned int i = 0; i < VERTS_SIZE; i++)
float fValue = VERTS[i];