2014-11-03 72 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