传递给C ++函数的数组大小?

时间:2010-06-17 13:28:38

标签: c++ arrays

  

可能重复:
  determine size of array if passed to function

如何获得传递给函数的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;
}; 

我做错了什么?

7 个答案:

答案 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];