C++ 传递给C+的数组大小+;功能?

C++ 传递给C+的数组大小+;功能?,c++,arrays,C++,Arrays,可能重复: 如何获得传递给函数的C++数组的大小?< /P> 在下面的代码中,sizeof(p\u 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_vert

可能重复:

如何获得传递给函数的C++数组的大小?< /P> 在下面的代码中,

sizeof(p\u 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;
}; 
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不能除以sizeof(float)如果数组不是在编译时生成的。但是,在这种情况下,它是生成的,因此编译器知道数组的大小。需要记住的是。

您不能-数组在作为函数参数传递时会衰减为指针,因此
sizeof
对您没有帮助。

在您的示例中,它实际上是在传递指向方法;没有大小信息。需要从调用方法传递大小。

不能将向量作为参数传递给函数

实际上,您可以,但函数始终接受它作为指针(指向第一个元素),无论您是编写(
float*data
)还是(
float data[]


使用
sizeof(verts)/sizeof(verts[0])
将大小作为单独的参数传递。如果不介意使用模板,可以执行以下操作。请注意,只有在编译时已知数组大小时,此操作才有效

template <int N>
void makeVectorData(float (&p_vertData)[N]) {   
 int num = (sizeof(p_vertData)/sizeof(p_verData[0])); 
 cout << "output: " << num << endl;
};
模板
void makeVectorData(float(&p_vertData)[N]){
int num=(sizeof(p_vertData)/sizeof(p_verData[0]);
使用模板可以:

// 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. 
//旧函数,类型与类型指针[]相同
//您需要额外的大小参数
void do__something(Type*指针,size_t size){};
//此模板将捕获对数组的引用,而不仅仅是条指针:
模板//大小必须是编译时表达式
内联void dou_something(Type(&array)[size])//这很棘手,这是必需的
{
do_something(数组,大小);//数组隐式转换为指针
}
//现在您可以使用它:
类型数据[10];
做某事(数据);
//但在使用动态数组时,需要添加大小参数:
int some_size=getSomeSize();
类型*指向数据的指针=新类型[某些大小];
做一些事情(指向数据的指针,一些大小);
delete[]指针指向数据;//忘记删除,或使用智能指针。

您需要使用此技巧来防止数组隐式转换为指针。额外的模板用于防止在只有大小更改时多次编译原始函数。

同意Mark和Paul的观点。您必须传递数组的大小以及数组函数参数本身

作为旁注,在声明静态常量数组时,我倾向于将定义和另一个“大小”值组合在一起。例如,如果我将您的浮点数组定义为静态常量全局(例如,作用域为本地.cpp文件),那么我将定义相应的“大小”值,如下所示:


静态常量浮点顶点[]={
-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
};
静态常量unsigned int VERTS_SIZE=sizeof(VERTS)/sizeof(VERTS[0]);
这将允许我轻松地迭代顶点的内容,而无需每次都确定大小。

for (unsigned int i = 0; i < VERTS_SIZE; i++)
     float fValue = VERTS[i];

for(无符号整数i=0;i

许多以前的副本,例如,使用新的指南支持库,您现在可以安全地将数组指针传递给可以检测大小的函数-例如,请参阅《为什么不简单使用N参数》中的
array\u view
?我可以,我应该使用。但是在本例中,我更喜欢显示尽可能接近于N参数的代码示例这个问题。谢谢,这个解决方案对我帮助很大。这是真的,但请参阅我上面关于GSL的
array\u view
的评论,它可以用来安全地防止这种衰退

for (unsigned int i = 0; i < VERTS_SIZE; i++)
     float fValue = VERTS[i];