在C ++中使用向量的矩阵算法导致分段错误

时间:2011-06-14 17:12:12

标签: c++ vector matrix

我有一些问题将向量传递给函数。我关心的不是我的逻辑本身,就好像我需要稍后调整一样。我的程序要求声明我必须具有构建矩阵的单独函数,打印最终矩阵,以及执行所需数学运算的函数。我并不关心数学逻辑方面的帮助。

似乎我有“硬”的东西,例如,创建一个矢量的矢量等,但我无法将矢量传递给函数等。

#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++;
    }
}

我正在使用全局变量,因为我想要Rows&amp;列保持不变并且在程序中,我只能在时间调用其中一个数学函数。

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 ++的新手,所以这非常令人沮丧。我也很乐意接受关于风格/最佳实践的建议。我觉得我对全局变量的使用并不理想......但是我的指令是让算术函数尽可能重用。另外,我认为我没有充分利用功能。

谢谢。

7 个答案:

答案 0 :(得分:2)

您对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行和列。

您可以在用户获得vector::resize()row后使用col功能解决此问题。

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. 您不需要它们是全局变量。您使用vectorprintMatrixaddMatrix函数可以调用vector::size()来查找矩阵的大小。你应该重写那些函数,把你的矩阵作为一个参数(很多好的建议here),然后对它们进行处理。

答案 1 :(得分:1)

当row和col为零时创建矩阵,因此任何访问其内容的尝试都会导致分段错误。您需要先读取row和col,然后构建矩阵。这不包括使它们成为全局变量。

答案 2 :(得分:1)

您没有将矢量/矩阵的大小调整为用户输入的维度 - 它们位于行== 0,col == 0,因为这是两个变量的默认值。

您需要查看vector::resize()以在用户输入后更新矢量的尺寸。

答案 3 :(得分:1)

您永远不会将元素添加到矩阵中,即。当你调用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++;
    }
}

答案 4 :(得分:1)

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在读入值之前很久仍为零。

答案 5 :(得分:1)

您的程序段错误,因为您创建了大小为(0,0)的矩阵。 当您尝试设置元素时:segfault:)

建议:

  • 使用矩阵库:)
  • 如果您想学习:创建一个将使用正确大小创建的Matrix对象
  • 请避免全局!
  • 将您的问题标记为作业;)

对于您的班级,请尝试实施以下内容:

class Matrix
{
    public:
    Matrix(unsigned rows, unsigned columns);
    void add(const Matrix&)
    void print();

    // etc.
};

MY2C

答案 6 :(得分:1)

必须使用push_back来初始化向量的元素,或者必须在使用[index] = form之前调整向量的大小。