在C++中使用矢量的矩阵算术导致分割错误
Matrix Arithmetic using Vectors in C++ causing segmentation faults
我在向函数传递向量时遇到了一些问题。我关心的不是我的逻辑本身,好像我以后需要调整,我会的。我的程序要求指出,我必须有单独的函数来构建矩阵、打印最终矩阵,以及执行所需数学运算的函数。我不关心数学逻辑方面的帮助。
我似乎有一些"困难"的东西,例如,创建一个向量的向量等,但我在将向量传递给函数等时遇到了问题。
#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&列保持不变,在程序中,我一次只能调用其中一个数学函数。
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行和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;
注:
- 考虑使用
typedef
来使代码看起来更好 - 你不需要它们是全局变量。您使用的是
vector
,printMatrix
和addMatrix
函数可以调用vector::size()
来找出矩阵的大小。你应该重写这些函数,把你的矩阵作为一个参数(这里有很多很好的建议),然后处理它们
矩阵是在行和列为零时创建的,因此任何访问其内容的尝试都会导致分割错误。您需要首先读取行和列,然后构建矩阵。这不包括使它们成为全局变量。
您没有根据用户输入的维度调整向量/矩阵的大小-它们被困在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
仍然为零的情况下创建矢量,而此时距离读取值还有很长一段时间。
您必须使用push_back初始化向量的元素,或者在使用[index]=form之前必须调整向量的大小。
您的程序出错,因为您创建了大小为(0,0)的矩阵。当您尝试设置元素时:segfault:)
建议:
- 使用矩阵库:)
- 如果你想学习:创建一个矩阵对象,你将用正确的大小创建它
- 请避开全球化
- 将你的问题标记为家庭作业;)
对于您的类,尝试实现以下内容:
class Matrix
{
public:
Matrix(unsigned rows, unsigned columns);
void add(const Matrix&)
void print();
// etc.
};
my2c
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- G :内部编译器错误:分割故障(程序CC1PLUS) - 我在哪里开始
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 在给出正确的输出后,给出错误分割错误(核心转储)
- 得到错误分割错误(核心转储)进程返回139 (0x8B)
- 内部编译错误:分割错误在gcc.发送可变模板到struct时