Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;数组和函数_C++_Arrays - Fatal编程技术网

C++ C++;数组和函数

C++ C++;数组和函数,c++,arrays,C++,Arrays,如何生成一个接收数组作为参数的正确函数?在下面的代码中,结果应该是36,但在我的函数中只显示了4。它似乎只通过第一个元素 void test(float v[]){ printf("size: %d\n", sizeof(v)); //RESULT: 4 } int main(){ GLfloat vv[] = { 0, 0, 0, 1, 1, 0, 1, 0, 0 }; printf("size: %d\n",

如何生成一个接收数组作为参数的正确函数?在下面的代码中,结果应该是36,但在我的函数中只显示了4。它似乎只通过第一个元素

void test(float v[]){
    printf("size: %d\n", sizeof(v)); //RESULT: 4
}

int main(){
    GLfloat vv[] = {
        0, 0, 0,
        1, 1, 0,
        1, 0, 0
    };
    printf("size: %d\n", sizeof(vv));  //RESULT: 36
    test(vv);
    return 0;
}

当您将数组作为参数传递时,它将作为指向第一个元素的指针衰减。
sizeof
提供指针的大小,而不是数组的大小

最简单的解决方案是将大小作为单独的参数传递给函数

void myFunction(float[] array, size_t size);
如何生成一个接收数组作为参数的正确函数

如果数组的大小在编译时已知(如示例中所示),则可以使用模板函数。此示例按常量引用获取数组元素:

template< class T, size_t N >
void foo( const T (&data)[N] )
{
  // length of array is N, can access elements as data[i]
}

int main(){
  GLfloat vv[] = {
    0, 0, 0,
    1, 1, 0,
    1, 0, 0
  };

  foo(vv);
}    

+ 1注释:在C++中,如果您致力于使用固定数组,则可以使用引用参数,如<代码>模板FO(浮点(& AR)[n])< /> >,也将用“代码> sisiof(AR)报告正确的大小。:@ WoZoCiGig:是的,1。我早期对Q运动吊装C和C++标签的怀疑是,这纯粹是一个C问题。从广义的解决方案的角度来看,在大多数情况下,通过迭代器来“开始”和“结束”不是更好吗?然后,该函数可以应用于数组,或者同样适用于
std::vector
template <size_t N>
void foo(const std::array<GLfloat, N>& data)
{
   // data looks like a C array, but has size() and many other methods
}

int main(){
  std::array<GLfloat, 9>{
      { 0, 0, 0,
        1, 1, 0,
        1, 0, 0 }
  };

  foo(vv);
}