2014-11-03 109 views
0

这个函数在这里被问了几次,但我对某个特定的情况感兴趣。是否有可能让数组的大小通过额外的参数定义?通过参数确定的C++传递动态数组

举个例子,假设我想要一个打印二维数组的函数。但是,我阵列可能每次都没有相同的尺寸。如果我可以有额外的参数来定义数组的大小,那将是理想的。我知道我可以根据需要轻松地将n换成一个数字,但如果我使用单独的头文件具有更复杂的功能,每次出现不同大小的数组时都会去编辑头文件,这似乎很愚蠢。我知道error: use of parameter 'n' outside function body...的结果如下,但希望找到一些解决方法。我也试过g++ -std=c++11但仍然是一样的错误。

#include <iostream> 
using namespace std; 

void printArray(int n, int A[][n], int m) { 
    for(int i=0; i < m; i++){ 
     for(int j=0; j<n; j++) { 
      cout << A[i][j] << " "; 
     } 
     cout << endl; 
    } 
} 

int main() { 

    int A[][3] = { 
     {1,2,3}, 
     {4,5,6}, 
     {7,8,9}, 
     {10,11,12} 
    }; 

    printArray(3, A, 4); 

    return 0; 
} 

据说,这可以用C99完成,并且在this question也提到,但我无法弄清楚如何与C++。

+1

这在标准C++中是不可能的。 VLA是C-only特性,或者是非标准的编译器扩展。 [链接到相关的问题](http://stackoverflow.com/questions/22013444/are-variable-length-arrays-there-in-c) – 2014-11-03 21:51:19

回答

3

这工作:

template<size_t N, size_t M> 
void printArray(int(&arr)[M][N]) { 
    for(int i=0; i < M; i++){ 
    for(int j=0; j < N; j++) { 
     std::cout << A[i][j] << " "; 
    } 
    std::cout << std::endl; 
    } 
} 

,如果你愿意把代码中的头文件。作为奖励,它会为您推导出NM

+0

这在主文件中很棒,但当我遇到麻烦时把它放在标题中。它在抱怨'M'和'N'没有被宣布。我错过了什么吗? – cdeterman 2014-11-03 21:37:09

+0

@cdeterman函数的主体必须位于头文件中。如果大小为2^32的数组足够大,则可能必须'#include '来获得'size_t',或者用'unsigned'替换'size_t'。 – Yakk 2014-11-03 21:38:19

+0

这样做,谢谢。 – cdeterman 2014-11-04 14:08:41