簡體   English   中英

在 C++ 中使用向量的矩陣算術導致分段錯誤

[英]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++陌生,所以這非常令人沮喪。 我也很樂意聽取有關風格/最佳實踐的建議。 我覺得我對全局變量的使用並不理想……但我正在接受指示,以使算術函數盡可能地可重用。 另外,我認為我沒有充分利用功能。

謝謝你。

您對rowcolmatrix的全局定義......是問題所在。

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) );

這里發生的情況如下: rowcol現在是0 ,因此您的所有矩陣現在都有 0 行和列。

在從用戶那里獲得rowcol后,您可以使用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;

筆記:

  1. 考慮使用typedef使您的代碼看起來更好。
  2. 您不需要它們是全局變量。 您正在使用vector ,您的printMatrixaddMatrix函數可以調用vector::size()來找出矩陣的大小。 您應該重寫這些函數以將您的矩陣作為參數( 這里有很多好的建議),然后對它們進行處理。

當 row 和 col 為零時創建矩陣,因此任何訪問其內容的嘗試都會導致分段錯誤。 您需要先讀取行和列,然后構建矩陣。 這不包括使它們成為全局變量。

您沒有將向量/矩陣的大小調整為用戶輸入的尺寸 - 它們停留在 row == 0, col == 0 因為這是兩個變量的默認值。

您需要查看vector::resize()以在用戶輸入后更新向量的尺寸。

您永遠不會將元素添加到矩陣中,即。 調用 build 時, matrixmatrix2為空。 您需要在收到用戶輸入后調整矩陣的大小。

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) );

這將創建向量,而rowcol仍然為零,早在您讀取值之前。

您的程序段錯誤,因為您創建了大小為 (0,0) 的矩陣。 當您嘗試設置元素時:segfault :)

建議:

  • 使用矩陣庫:)
  • 如果您想學習:創建一個矩陣 object,您將使用正確的大小創建該矩陣
  • 請避免使用全局變量!
  • 將您的問題標記為作業;)

對於您的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM