2014-10-15 2 views
4

Я работаю над программой для домашней работы и сталкивался с непонятной проблемой. При попытке получить размер 2D-вектора с помощью функции size() я получаю, казалось бы, случайные большие целые числа, которые останавливают выполнение моей программы. Мне нужен размер для доступа к элементам в векторе.Векторный размер() возвращающий, казалось бы, случайные большие целые числа

Мой заголовочный файл:

#ifndef _MATRIX_H 
#define _MATRIX_H 
#include <iostream> 
#include <vector> 

class Matrix { 

    private: 
     //int dimension; 

     std::vector< std::vector<int> > matrix; 

    public: 

     Matrix(); 

     Matrix(std::vector< std::vector<int> >); 

     void print(); 

     Matrix operator-(Matrix operand); 

}; 

#endif 

Мой файл реализации:

#include "Matrix.h" 
#include <iostream> 
#include <vector> 

// Default constructor 
Matrix::Matrix() { 

} 

// Parameterized constructor 
Matrix::Matrix(std::vector< std::vector<int> >) { 

} 

void Matrix::print() { 
    std::cout << "Size of matrix in print() " << matrix.size() << std::endl; 
    for (int i = 0; i < matrix.size(); i++) { 
     for (int j = 0; j < matrix.size(); j++) { 
       std::cout << matrix[i][j] << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

Matrix Matrix::operator-(Matrix operand) { 

    Matrix difference; 
    std::vector< std::vector<int> > diffMatrix; 

    diffMatrix.resize(matrix.size()); 

    for (int i = 0; i < matrix.size(); i++) { 
     diffMatrix[i].resize(matrix.size()); 
    } 

    difference.matrix = diffMatrix; 
    if (operand.matrix.size() == matrix.size()) { 

     for (int i = 0; i < operand.matrix.size(); i++) { 
      for (int j = 0; j < operand.matrix.size(); j++) { 
       difference.matrix[i][j] = matrix[i][j] - operand.matrix[i][j]; 
      } 
     } 
    } 
} 

и мой main.cpp файл:

#include "Matrix.h" 
#include <iostream> 
#include <vector> 
using namespace std; 

int main(int argc, char** argv) { 

    vector< vector<int> > testMatrixOne(4); 
    vector< vector<int> > testMatrixTwo(4); 

    // Creating a test matrix 
    testMatrixOne = {{1,2},{3,4}}; 
    testMatrixTwo = {{5,6},{7,8}}; 

    // Create Matrix object 
    Matrix matrixOne(testMatrixOne); 
    Matrix matrixTwo(testMatrixTwo); 

    // Create Matrix to store difference 
    Matrix diff; 
    diff = matrixOne - matrixTwo; 
    diff.print(); 


    return 0; 
} 

Я упростил свой код и зашиты в двух матрицах , При запуске программы size() вернет очень большое целое число. Я провел несколько часов в Интернете, но не мог понять, в чем причина этого. Почему функция size() делает это?

+2

Конструкторы 'Matrix' никогда не инициализируют' измерение' –

+0

Я не использую переменную размера в данный момент, функция size() - это то, с чем я столкнулся. – Skynet

+2

'Matrix :: Matrix (std :: vector >)' оставляет пустую матрицу, и это конструктор, который вы используете. –

ответ

4

Проблема, к сожалению, что:

Matrix Matrix::operator-(Matrix operand) { 

никогда не возвращает значение. Это вызывает неопределенное поведение, и симптомы, которые вы видели, были результатом появления -, возвращающего мусор.

В конце функции, вы имели в виду, чтобы иметь:

return difference; 
} 

стандарта C++ не требует компиляторов, чтобы предупредить об этом, но все равно приятно, если они предупреждают. Моя версия g ++ не работает (даже с -Wall), однако добавление флага -Wreturn-type вызывает предупреждение. IDK, почему это не является частью -Wall, по крайней мере, для простых случаев, подобных этому.

+0

Это исправлено! Я еще не знаком с C++, не могли бы вы объяснить, что такое -Wall? – Skynet

+0

-Wall - это переключатель компилятора для включения «всех» предупреждений (на самом деле: общий набор предупреждений). g ++ и clang используют один и тот же синтаксис для предупреждений компилятора. Подробнее о включении предупреждений см. В документации к компилятору. –

+0

[Подробнее о предупреждениях g ++] (http://stackoverflow.com/questions/3402178/omitting-return-statement-in-c) –