Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Sapendo
5 / 5 / 4
Регистрация: 13.05.2014
Сообщений: 130
#1

Класс "Матрица", ошибка при выводе результата

17.11.2014, 00:43. Просмотров 365. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток!
Нужно под main создать header и реализацию! Я застрял на operator- (а точнее при выводе на экран результата)! Выдает ошибку "Необработанное исключение по адресу 0x003D4452 в Lab_13_11_2014.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFEEEFEEE."
Помогите пожалуйста!
Вод код!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef MATRIX_H
#define MATRIX_H
 
class Matrix
{
    int height;
    int width;
    int** mas;
public:
    Matrix();
    Matrix( Matrix&);
    Matrix(int,int);
    ~Matrix();
    void SetMtrx();
    int GetH() {return height;}
    int GetW() {return width;}
    int** GetMtrx() {return mas;}
    void Show();
    Matrix operator+ (Matrix &);
    Matrix operator- (Matrix &);
 
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <ctime>
#include <clocale>
#include "MATRIX.h"
 
using namespace std;
 
Matrix::Matrix()
{
    height=0;
    width=0;
    mas=new int* [height];
    for (int i=0;i<height;i++)
    {
        mas[i]=new int [width];
        for (int j=0;j<width;j++)
        {
            mas[i][j]=0;
        }
    }
}
 
Matrix::Matrix(int H, int W)
{
    height=H;
    width=W;
    mas=new int* [height];
    for (int i=0;i<height;i++)
    {
        mas[i]=new int [width];
        for (int j=0;j<width;j++)
        {
            mas[i][j]=0;
        }
    }
 
}
Matrix::Matrix( Matrix& M)
{
    height=M.height;
    width=M.width;
    mas=new int* [height];
    for (int i=0;i<height;i++)
    {
        mas[i]=new int [width];
        for (int j=0;j<width;j++)
        {
            mas[i][j]=M.mas[i][j];
        }
    }
}
Matrix::~Matrix()
{
    for (int i=0;i<GetH();i++)
    {
        delete [] mas[i];
    }
    delete [] mas;
    mas=nullptr;
}
 
void Matrix::SetMtrx()
{
    cout<<"Введите значение:\n\n";
    mas=new int* [height];
    for (int i=0;i<height;i++)
    {
        mas[i]=new int [width];
        for (int j=0;j<width;j++)
        {
            //cout<<'['<<i<<']'<<'['<<j<<"] = ";
            /*cin>>*/mas[i][j]=rand()%5;
        }
    }
}
 
void Matrix::Show()
{
    for (int i=0;i<GetH();i++)
    {
        for (int j=0;j<GetW();j++)
        {
            cout<<mas[i][j];
            cout<<'\t';
        }
        cout<<endl;
    }
}
 
Matrix Matrix::operator+(Matrix & right)
{
    Matrix new_mas(height,width);
    for (int i=0;i<new_mas.height;i++)
    {
        for (int j=0;j<new_mas.width;j++)
        {
            new_mas.mas[i][j]=mas[i][j]+right.mas[i][j];
        }
    }
    return new_mas;
}
 
Matrix Matrix::operator-(Matrix & right)
{
    Matrix new_mas(height,width);
    for (int i=0;i<new_mas.height;i++)
    {
        for (int j=0;j<new_mas.width;j++)
        {
            new_mas.mas[i][j]=mas[i][j]-right.mas[i][j];
        }
    }
    return new_mas;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <ctime>
#include <clocale>
#include "MATRIX.h"
 
using namespace std;
 
int main ()
{
    srand ((unsigned)time (NULL));
    setlocale (LC_ALL,"RUS");
    Matrix m1(4,5);
    cout<<"m1"<<endl;
    m1.Show();
    cout<<"m1 height and width"<<endl;
    cout<<m1.GetH()<<endl;
    cout<<m1.GetW()<<endl<<endl;
    m1.SetMtrx();
    cout<<m1.GetMtrx()<<endl;
 
    Matrix m2=m1;
    cout<<"m2"<<endl;
    m2.Show();
 
    Matrix m5=m1+m2;
    cout<<"m1+m2"<<endl;
    m5.Show();
 
    m5=m1-m2;
    cout<<"m1-m2"<<endl;
    m5.Show();
 
    //m5=m1+5;
    //cout<<"m1+5"<<endl;
    //m5.Show();
 
    //m5=m1-5;
    //cout<<"m1-5"<<endl;
    //m5.Show();
 
    //cout<<"m[3][0]"<<endl;
    //cout<<m5[3][0]<<endl<<endl;
 
    //m1++;
    //cout<<"m1++"<<endl;
    //m1.Show();
 
    //++m1;
    //cout<<"++m1"<<endl;
    //m1.Show();
 
    //Matrix m7 (1,8);
    //cout<<"m7"<<endl;
    //m7.Show();
 
    //m5=m1+m7;
    //cout<<"m1+m7"<<endl;
    //m5.Show();
 
    //m5=m1-m7;
    //cout<<"m1-m7"<<endl;
    //m5.Show();
 
    //--m1;
    //cout<<"--m1"<<endl;
    //m1.Show();
 
    //m1--;
    //cout<<"m1--"<<endl;
    //m1.Show();
 
    //m2=-m1;
    //cout<<"-m1"<<endl;
    //m2.Show();
    //return 0;
}
Да и еще мне не ясен вот этот момент
C++
1
m5=m1+5;
это имеется ввиду что к каждому элементу нужно прибавить 5?
Заранее спасибо!

Добавлено через 43 минуты
С operator- разобрался!
Но остается вопрос что это значит
C++
1
m5=m1+5;

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2014, 00:43
Ответы с готовыми решениями:

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout
Добрый день! Переписал код из книг Лафоре, создание мультимножества из...

Определить базовый класс "Матрица" и класс-потомок "Треугольная матрица"
Нужно определить класс &quot;матрица&quot; с возможностью динамического выделения и...

Ошибка "Ascess violation" при выводе массива
В проекте есть две такие строчки: for(int L6x=0;L6x&lt;=argcnt;L6x++){for(int...

Создать базовый класс "Массив" и класс-наследник "Матрица"
Добрый день! такой вопрос, как задать двумерный массив и заполнить его...

Ошибка при выводе из "хранилища объектов"
Само хранилище это такая динамическая структура - стек в дереве. Выглядит так:...

7
notemac
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
17.11.2014, 00:58 #2
DELETE
0
Sapendo
5 / 5 / 4
Регистрация: 13.05.2014
Сообщений: 130
17.11.2014, 01:12  [ТС] #3
?????
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4388 / 2363 / 655
Регистрация: 18.10.2014
Сообщений: 4,008
17.11.2014, 01:21 #4
Цитата Сообщение от Sapendo Посмотреть сообщение
Выдает ошибку
Во-первых, оператор присваивания где? См. Распространенные ошибки

Во-вторых, код некомпилируем в стандартном С++ из за того, что конструктор копирования принимает неконстантную ссылку. Исправить на константную немедленно. Программирования на С++ без активного правильного использования спецификатора 'const' невозможно.
0
Sapendo
5 / 5 / 4
Регистрация: 13.05.2014
Сообщений: 130
17.11.2014, 01:30  [ТС] #5
TheCalligrapher,
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во-первых, оператор присваивания где? См. Распространенные ошибки
именно так я ошибку и исправил))) За const прошу прощения!
А как на счет
C++
1
2
1
m5=m1+5;
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4388 / 2363 / 655
Регистрация: 18.10.2014
Сообщений: 4,008
17.11.2014, 01:35 #6
Цитата Сообщение от Sapendo Посмотреть сообщение
А как на счет
C++
1
m5=m1+5;
Ну откуда же нам знать, что имелось в виду под этим? Оператора у вас такого нет. Чтобы его написать, надо знать что он должен делать. Я не ясновидящь, я не знаю, что имелось в виду. Спрашивайте у постановщика задачи.
0
Sapendo
5 / 5 / 4
Регистрация: 13.05.2014
Сообщений: 130
17.11.2014, 01:51  [ТС] #7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну откуда же нам знать, что имелось в виду под этим? Оператора у вас такого нет. Чтобы его написать, надо знать что он должен делать. Я не ясновидящь, я не знаю, что имелось в виду. Спрашивайте у постановщика задачи.
Это я понимаю, я думал вы по практике поймете что тут требуется т.к. товарищ преподаватель ответил в main все написано)))
Ну я так понимаю что тут надо прибавить каждому элементу 5! Для этого нужно преобразование типов, только я не могу понять как это для матрицы сделать! Намекните пожалуйста!
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4388 / 2363 / 655
Регистрация: 18.10.2014
Сообщений: 4,008
17.11.2014, 03:43 #8
Цитата Сообщение от Sapendo Посмотреть сообщение
Для этого нужно преобразование типов,
Я не вижу, при чем тут "преобразование типов". Тут нужен просто еще один оператор, а лучше два или три (чтобы еще и 'm5 = m1 - 5' сразу покрыть, и 'm5 = 5 + m1'). Однако выбранный изначально подход - с определением операторов, как членов класса - не позволяет единоообразным образом перегрузить операторы для выражений типа '5 + m1'. Для таких выражений операторы придется определять снаружи класса

C++
1
2
3
4
5
6
7
8
9
class Matrix
{
  ...
  Matrix operator +(int) const;
  Matrix operator -(int) const;
  ...
};
 
Matrix operator +(int, const Matrix &);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Matrix Matrix::operator +(int right) const
{
    Matrix new_mas(height, width);
    for (int i = 0; i < new_mas.height; i++)
    {
        for (int j = 0; j < new_mas.width; j++)
        {
            new_mas.mas[i][j] = mas[i][j] + right;
        }
    }
    return new_mas;
}
 
Matrix Matrix::operator -(int right) const
{
    return operator +(-right);
}
 
Matrix operator +(int left, const Matrix &right)
{
    return right + left;
}
Разумнее было с самого начала определять операторы, как самостоятельные функции, а не как члены класса. Но это уже вашему преподавателю виднее...

Можно еще добавить операторы для 'm5 = 5 - m1' и просто 'm5 = -m1' - но это вы уже сами смотрите, нужно это вам или нет.
1
17.11.2014, 03:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 03:43

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура -...

Класс "Матрица". Перегрузка оператора "минус"
Помогите дописать программу или исправить ее. Нужно было написать программу,...

Ошибка Необработанное исключение в "0x001d18f8" в "lr7v2.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde9"
class Hdd { public: char Hdd_name; int total_space; int free_space;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru