![](/img/trans.png)
[英]c++ recursion causing segmentation faults (AND and OR queries with words)
[英]Matrix Arithmetic using Vectors in C++ causing segmentation faults
我在將向量傳遞給函數時遇到了一些問題。 我關心的不是我的邏輯本身,好像我以后需要調整一樣。 我的程序要求 state 我必須有單獨的函數來構建矩陣、打印最終矩陣以及執行所需數學運算的函數。 我不關心數學邏輯的幫助。
似乎我有“硬”的東西,例如,創建一個向量的向量等,但我無法將向量傳遞給函數等。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
using std::vector;
void build();
void printMatrix(vector<vector<int> > );
int row=0, col=0;
vector<vector<int> > matrix(row, vector<int> (col) );
vector<vector<int> > matrix2(row, vector<int> (col) );
vector<vector<int> > matrix3(row, vector<int> (col) );
int main(){
build();
addMatrix();
printMatrix(matrix3);
return 0;
}
//====================================================
void build(){
//currently intended just to build 2x matrices of different increasing data
int k=0, l=5;
cout<<"Enter the number of rows for each Matrix: "<<endl;
cin>>row;
cout<<"Enter the number of columns for each Matrix: "<<endl;
cin>>col;
for( int i = 0; i < row; i++ ) {
for ( int j = 0; j < col; j++ ){
matrix[i][j] = k++;
matrix2[i][j] = l++;
}
}
我正在使用全局變量,因為我希望行和列保持不變,並且在程序中,我一次只能調用其中一個數學函數。
void printMatrix(vector<vector<int> > newMatrix3){
for ( int i = 0; i < row; i++ ) {
for ( int j = 0; j < col; j++ )
cout<< setw ( 3 ) << newMatrix3[i][j] <<' ';
cout<<'\n';
}
}
//=========================================
void addMatrix(){
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++)
matrix3[i][j]=(matrix[i][j]+matrix2[i][j]);
}
}
這個程序可以 100% 編譯,所以如果你看到語法錯誤,那是因為我的復制 + 粘貼搞砸了。 一旦我輸入矩陣的維度,程序就會因分段錯誤而崩潰。 我對 C++很陌生,所以這非常令人沮喪。 我也很樂意聽取有關風格/最佳實踐的建議。 我覺得我對全局變量的使用並不理想……但我正在接受指示,以使算術函數盡可能地可重用。 另外,我認為我沒有充分利用功能。
謝謝你。
您對row
、 col
、 matrix
的全局定義......是問題所在。
int row=0, col=0;
vector<vector<int> > matrix(row, vector<int> (col) );
vector<vector<int> > matrix2(row, vector<int> (col) );
vector<vector<int> > matrix3(row, vector<int> (col) );
這里發生的情況如下: row
和col
現在是0
,因此您的所有矩陣現在都有 0 行和列。
在從用戶那里獲得row
和col
后,您可以使用vector::resize()
function 來解決這個問題。
cout<<"Enter the number of rows for each Matrix: "<<endl;
cin>>row;
cout<<"Enter the number of columns for each Matrix: "<<endl;
cin>>col;
// Resize "matrix"
matrix.resize(row);
for(int i = 0; i < row; ++i) matrix[i].resize(col);
// Repeat for "matrix2" and "matrix3"
此外,這意味着您不必“初始化”您的matrix
對象。 所以現在你可以將它們定義為:
vector<vector<int> > matrix;
vector<vector<int> > matrix2;
vector<vector<int> > matrix3;
當 row 和 col 為零時創建矩陣,因此任何訪問其內容的嘗試都會導致分段錯誤。 您需要先讀取行和列,然后構建矩陣。 這不包括使它們成為全局變量。
您沒有將向量/矩陣的大小調整為用戶輸入的尺寸 - 它們停留在 row == 0, col == 0 因為這是兩個變量的默認值。
您需要查看vector::resize()
以在用戶輸入后更新向量的尺寸。
您永遠不會將元素添加到矩陣中,即。 調用 build 時, matrix
和matrix2
為空。 您需要在收到用戶輸入后調整矩陣的大小。
void build(){
//currently intended just to build 2x matrices of different increasing data
int k=0, l=5;
cout<<"Enter the number of rows for each Matrix: "<<endl;
cin>>row;
cout<<"Enter the number of columns for each Matrix: "<<endl;
cin>>col;
matrix.resize(row);
matrix2.resize(row);
for( int i = 0; i < row; i++ ) {
matrix[i].resize(col, 0);
matrix2[i].resize(col, 0);
for ( int j = 0; j < col; j++ ){
matrix[i][j] = k++;
matrix2[i][j] = l++;
}
}
int row=0, col=0;
vector<vector<int> > matrix(row, vector<int> (col) );
vector<vector<int> > matrix2(row, vector<int> (col) );
vector<vector<int> > matrix3(row, vector<int> (col) );
這將創建向量,而row
和col
仍然為零,早在您讀取值之前。
您的程序段錯誤,因為您創建了大小為 (0,0) 的矩陣。 當您嘗試設置元素時:segfault :)
建議:
對於您的 class 嘗試實現類似的東西:
class Matrix
{
public:
Matrix(unsigned rows, unsigned columns);
void add(const Matrix&)
void print();
// etc.
};
my2c
您必須使用 push_back 來初始化向量的元素,或者您必須在使用 [index]= 形式之前調整向量的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.