>

저는 Java 개발자이지만 이제는 C ++ 라이브러리가 필요하며이 언어에 익숙하지 않습니다. 특히 포인터, 참조 및 메모리 할당에 대해 항상 혼란스러워합니다. 이것이 내가 개발중인 매트릭스 클래스에서 오류가 발생하는 이유라고 생각합니다.

기본 코드 :

#include "stdafx.h"
#include "matrix.cpp"
void matrixtest();
int main()
{
    matrixtest();
    system("pause");
    return 0;
}
void matrixtest()
{
    // let's try 3x3 matrices
    static const int arr1[] = {1, 2, 1, -1, 1, 2, 2, 3, -4};
    static const int arr2[] = {0, 2, 2, 1, -1, 0, 3, 2, -2};
    vector<int> values1(arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]));
    vector<int> values2(arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));
    matrix A(values1, 3);
    matrix B(values2, 3);
    matrix sum = A + B;
    sum.show();
    matrix diff = A - B;
    diff.show();
    matrix prod = A * B;
    prod.show();
}

matrix.cpp  흥미로운 코드 :

matrix::matrix(vector<int> v, int r) : values(v), rows(r) {
    values = v;
    rows = r;
}
// [...]
matrix& matrix::operator += (const matrix& rhs) {
    matrix result = (*this) + rhs;
    (*this) = result;
    return *this;
}
matrix matrix::operator + (const matrix& rhs) {
    if (rows != rhs.rows || values.size() != rhs.values.size()) {
        throw std::length_error("Matrices shapes mismatch");
    }
    matrix result(values, rows);
    for (auto& i : values) {
        result.values[i] = this->values[i] + rhs.values[i];
    }
    return result;
}
// [...]
void matrix::show() {
    string delimiter = "";
    for (auto& i : values) {
        delimiter = "";
        for (auto j = 0; j < values.size()/rows; j++) {
            cout << delimiter << values[i * values.size()/rows + j];  // this is the line giving the error
            delimiter = ",";
        }
        std::cout << std::endl;
    }
}

전체 matrix.hpp  파일 :

#ifndef matrix_hpp
#define matrix_hpp
class matrix {
    private:
        std::vector<int> values;        // size is found by values.size()
        int rows;                       // columns is values.size()/rows
    public:
        matrix(vector<int>, int); // base ctor.
        matrix(const matrix& rhs); // copy ctor.
        matrix& operator=(const matrix& rhs); // assign. ctor.
        ~matrix(); // dtor.
        int& operator () (int row, int column);
        const int& operator () (int row, int column) const;     
        matrix operator + (int scalar) const;
        matrix operator - (int scalar) const;
        matrix operator * (int scalar) const;
        matrix& operator += (int scalar);
        matrix& operator -= (int scalar);
        matrix& operator *= (int scalar);
        matrix operator + (const matrix&);
        matrix operator - (const matrix&);
        matrix operator * (const matrix&);
        matrix& operator += (const matrix&);
        matrix& operator *= (const matrix&);
        // should be private ??
        void reshape(int newRows, int newColumns);
        void show(); //used for dev. only
        void range(int start, int defaultStep = 1);
        void fill(int value);
        void randint(int lowerBound, int upperBound);
};
#endif /* CMatrix_hpp */

이 클래스는 행렬 예제 의 예제를 기반으로합니다.

오류에 '0xC0000005 : 액세스 위반 읽기 위치 0x5820A694'가 표시됩니다. 따라서 메모리 할당이 잘못되었거나 범위를 벗어난 배열이 있거나 '&'연산자를 엉망으로 생각합니다.

편집 : 나는 다음과 같은 흔적을 얻는다 :

  • 이 0x00dffe24 {values ​​= {size = 9} rows = 3} matrix *

매트릭스가 존재하지만 어떤 이유로 든 오류가 발생합니다.

  • 답변 # 1

    오류가 발생하기 전에 사용중인 for 루프

    for (auto& i : values)
    
    

    는 범위 기반 for 루프입니다. 이것으로 vector ( values )에 존재하는 값을 얻을 수 있습니다 ).

    그러나 여기에 원하는 것을 작성한 논리에 따라 작업중 인 행을 나타내는 인덱스가 있습니다. 일반적인 for 루프로 가야합니다.

    for(int i =0; i<rows; ++i)
    
    

관련 자료

  • 이전 php - 라 라벨 페이지 매김 페이지 번호 추가
  • 다음 java - ViewPager에서 조각 재로드