Матричная арифметика с использованием Векторов в C ++, вызывающая ошибки сегментации - PullRequest
2 голосов
/ 14 июня 2011

У меня проблемы с передачей векторов функциям. Мое беспокойство связано не с самой моей логикой, как если бы мне нужно было настроить позже. В моих требованиях к программе указано, что у меня должны быть отдельные функции, которые строят матрицы, печатают итоговую матрицу и выполняют необходимые математические операции. Меня не интересует помощь по математической логике.

Кажется, у меня есть "сложные" вещи, например, создание вектора вектора и т. Д., Но у меня возникают проблемы при передаче векторов в функции и т. Д.

#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 ++, так что это очень расстраивает. У меня также есть все уши, чтобы принять предложения по стилю / лучшей практике. У меня такое ощущение, что мое использование глобальных переменных не является идеальным ... но я нахожусь под инструкциями, чтобы сделать арифметические функции максимально пригодными для повторного использования. Кроме того, я не думаю, что использую функции наилучшим образом.

Спасибо.

Ответы [ 7 ]

2 голосов
/ 14 июня 2011

Ваши глобальные определения 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 строк и столбцов.

Вы можете это исправитьиспользуя функцию 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. Вам не нужно, чтобы они были глобальными переменными.Вы используете vector, и ваши функции printMatrix и addMatrix могут вызвать vector::size(), чтобы узнать размер вашей матрицы.Вам следует переписать эти функции, чтобы взять матрицу в качестве аргумента (много полезных советов здесь по этому вопросу), а затем поработать с ними.
1 голос
/ 14 июня 2011

Вы должны использовать push_back для инициализации элементов вектора, или вы должны изменить размеры векторов перед использованием [index] = form.

1 голос
/ 14 июня 2011

Ваша программа segfault, потому что вы создаете матрицу с размером (0,0). При попытке установить элементы: segfault:)

Предложения:

  • использовать матричную библиотеку:)
  • если вы хотите научиться: создайте объект Matrix, который вы создадите с правильным размером
  • пожалуйста, избегайте глобалов!
  • пометить ваш вопрос как домашнее задание;)

Для вашего класса попробуйте реализовать что-то вроде:

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

    // etc.
};

my2c

1 голос
/ 14 июня 2011
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 по-прежнему равны нулю, задолго до того, как вы прочитаете значения.

1 голос
/ 14 июня 2011

Вы никогда не добавляете элементы в матрицы, т.е. matrix и matrix2 пусты при вызове 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++;
    }
}
1 голос
/ 14 июня 2011

Вы не изменяете размеры векторов / матриц в соответствии с размерами, которые вставил пользователь - они застряли в строке == 0, col == 0, потому что это то, что две переменные по умолчанию.

Вы хотите посмотреть на vector::resize(), чтобы обновить размеры вектора после ввода пользователем.

1 голос
/ 14 июня 2011

Матрицы создаются, когда строки и столбцы равны нулю, поэтому любая попытка доступа к их содержимому приводит к ошибке сегментации. Вам нужно сначала прочитать строки и столбцы, а затем построить матрицы. Это исключает превращение их в глобальные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...