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

问题描述

|| 我在将向量传递给函数时遇到一些问题。我关心的不是我自己的逻辑,好像我以后需要调整。我的程序要求指出,我必须具有构建矩阵,打印最终矩阵以及执行所需数学运算的独立函数。我不关心数学逻辑方面的帮助。 似乎我有“硬”的东西,例如,创建矢量的矢量,等等,但是我无法将矢量传递给函数等。
#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()
函数来解决此问题。
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;
注意: 考虑使用ѭ15来使代码看起来更好。 您不需要它们是全局变量。您使用的是
vector
,而您的
printMatrix
addMatrix
函数可以调用
vector::size()
来查找矩阵的大小。您应该重写这些函数以将矩阵作为参数(此处有很多好的建议),然后对其进行处理。     ,        当row和col为零时会创建矩阵,因此任何尝试访问其内容的尝试都会导致分段错误。您需要先阅读row和col,然后构建矩阵。这不包括使它们成为全局变量。     ,        您没有将向量/矩阵的大小调整为用户放入的尺寸-它们停留在row == 0,col == 0处,因为这是这两个变量的默认值。 您想要在用户输入后查看ѭ9来更新向量的尺寸。     ,        您永远不会将元素添加到矩阵中。调用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,vector<int> (col) );
这样就创建了向量,而
row
col
仍为零,很早就读取了值。     ,        您必须使用push_back初始化向量的元素,或者必须在使用[index] = form之前确定向量的大小。     ,        您的程序出现段错误,因为您创建的矩阵大小为(0,0)。 当您尝试设置元素时:segfault :) 意见建议: 使用矩阵库:) 如果您想学习:创建一个将以正确大小创建的Matrix对象 请避免全局变量! 将您的问题标记为作业;) 对于您的班级,请尝试实现以下内容:
class Matrix
{
    public:
    Matrix(unsigned rows,unsigned columns);
    void add(const Matrix&)
    void print();

    // etc.
};
my2c     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...