2011-12-07 63 views
1

我正在嘗試編寫一個將2D矢量作爲參數的函數。這編譯得很好,但我在執行時遇到了分段錯誤。將2D矢量作爲參數傳遞給C++函數的正確方法

//http://www.codechef.com/problems/SUMTRIAN 
#include<iostream> 
#include<algorithm> 
#include<vector> 

using namespace std; 

int max_sum_path(int maximum_rows,vector<vector<int> >& matrix,int row_index,int colm_index); 

int main() 
{ 
    vector<vector<int> > Triangle; 
    int num_test_cases; 
    cin>>num_test_cases; 
    //to iterate over the test cases 
    for(int i=0;i<num_test_cases;++i) 
    { 
    int max_rows; 
    cin>>max_rows; 
    //to build the 2d vector 
    Triangle.resize(max_rows); 
    for(int j=0;j<max_rows;++j) 
    { 
     Triangle[j].resize(j+1); 
    } 
    //get the input 
    for(int j=0;j<max_rows;++j) 
    { 
     for(int k=0;k<=j;++k) 
     { 
     cin>>Triangle[j][k]; 
     } 
    } 
    cout<<max_sum_path(max_rows,Triangle,0,0)<<endl; 
    Triangle.clear(); 
    } 
    return 0; 
} 

int max_sum_path(int maximum_rows,vector<vector<int> >& matrix,int row_index,int colm_index) 
{ 
    if(row_index >= maximum_rows || colm_index > row_index) 
    { 
    //we have reached a cell outside the Triangular Matrix 
    return 0; 
    } 
    else 
    { 
    return matrix[row_index][colm_index] + max(max_sum_path(maximum_rows,matrix,row_index+1,colm_index), max_sum_path(maximum_rows,matrix,row_index+1,colm_index+1)); 
    } 
} 

這是我運行它時出現的錯誤。

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400e21 in max_sum_path (maximum_rows=3, matrix=..., row_index=3, colm_index=3) at sums_triangle.cpp:49 
49   return matrix[row_index][colm_index] + max(max_sum_path(maximum_rows,matrix,row_index+1,colm_index), max_sum_path(maximum_rows,matrix,row_index+1,colm_index+1)); 

作爲一個側面說明,當我嘗試使用二維數組而不是矢量時,我得到了編譯時錯誤。

g++ -Wall sums_triangle.cpp -o sums_triangle 
sums_triangle.cpp: In function ‘int main()’: 
sums_triangle.cpp:28:46: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)max_rows) + -0x00000000000000001)) + 1)][(((long unsigned int)(((long int)max_rows) + -0x00000000000000001)) + 1)]’ to ‘int**’ for argument ‘2’ to ‘int max_sum_path(int, int**, int, int)’ 

將多維向量作爲參數傳遞給函數的正確方法是什麼?

+2

的代碼是完美的。錯誤在別的地方。 –

+2

也是SIGSEGV顯然來自std :: cin,不適用於向量 – stijn

回答

1

您正在錯誤地調整矢量大小。例如:

for(int j=0;j<max_rows;++j) 
{ 
    Triangle[i].resize(j+1); 
} 

您在這裏調整三角[I]多次。也許你的意思是說

for(int j=0;j<max_rows;++j) 
{ 
    Triangle[j].resize(j+1); 
} 
+0

修正了這個問題, 還是有段錯誤。我會嘗試調試它並回發。 – nikhil

+0

謝謝,這是錯誤的原因。現在修復它。 – nikhil

+0

我找到了。 'if(row_index> maximum_rows || colm_index> row_index)'太寬鬆了,應該是'row_index> = maximum_rows' – 01d55

1

變化

Triangle[i].resize(j+1); 

Triangle[j].resize(j+1); 
+0

謝謝,這是問題的根源。 – nikhil

相關問題