【问题标题】:Matrix Arithmetic using Vectors in C++ causing segmentation faults在 C++ 中使用向量的矩阵算术导致分段错误
【发布时间】:2011-09-14 21:33:40
【问题描述】:

我在将向量传递给函数时遇到了一些问题。我关心的不是我的逻辑本身,好像我以后需要调整一样。我的程序要求规定我必须有单独的函数来构建矩阵、打印最终矩阵以及执行所需数学运算的函数。我不关心数学逻辑的帮助。

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

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

谢谢。

【问题讨论】:

  • 看起来像家庭作业,不;)
  • 这是家庭作业,直到我发表第一篇文章后,我才知道“家庭作业”标签。我在向量初始化方面遇到了一个真正的问题,但这不是我的家庭作业的一部分。

标签: c++ vector matrix


【解决方案1】:

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

这里发生的情况如下:rowcol 现在是 0,因此您的所有矩阵现在都有 0 行和列。

您可以在从用户那里获得rowcol 后使用vector::resize() 函数来解决此问题。

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() 来找出矩阵的大小。您应该重写这些函数以将您的矩阵作为参数(很多好的建议here),然后处理它们。

【讨论】:

  • 谢谢,这对我很有帮助。向量对我的解释非常很糟糕。我的印象是它们是魔法数组,它们是否以零/空开始并不重要,并且可以随心所欲地进行操作,而无需使用向量库/类本身的任何函数。我现在知道它们比以前想象的更严格......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    您需要查看vector::resize() 以在用户输入后更新向量的维度。

    【讨论】:

      【解决方案4】:

      您永远不会将元素添加到矩阵中,即。 matrixmatrix2 在调用 build 时为空。您需要在收到用户输入后调整矩阵大小。

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

      【讨论】:

        【解决方案5】:
        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 仍然为零时创建向量,早在您读入值之前。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            建议:

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

            为你的班级尝试实现类似的东西:

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

            my2c

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-27
              • 1970-01-01
              • 1970-01-01
              • 2019-01-07
              • 1970-01-01
              相关资源
              最近更新 更多