Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
1

В чем заключаются ошибки в работе программы.Ошибка "вызвал срабатывание точки останова."

27.09.2018, 09:17. Показов 476. Ответов 19
Метки нет (Все метки)

Matrix.h
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
#ifndef MATRIX_H
#define MATRIX_H
#include <ostream>
 
class Matrix
{
private:
    int **ptr; // указатель на матрицу
    int n;// размер матрицы
public:
    Matrix(); // конструктор по умолчанию
    Matrix(int n); // конструктор с параметрами (только размер матрицы)
    Matrix(int n, int **mas); // конструктор с параметрами (размер матрицы + матрица)
    Matrix(const Matrix&c); // конструктор копирования
    ~Matrix(); // десструктор класса Matrix
 
    Matrix& operator *= (Matrix&c); // операция домножения
    int nornamatrix(); // вычисление нормы матрицы
    void umn(int num); // умножение миноров на константу
    int* operator[] (int i) { return(ptr[i]); } // функция-оператор, которая достаёт член строки матрицы (перегруженная операция взятия индекса)
    Matrix& operator = (Matrix&c); // оператор присваивания
    Matrix operator + (const Matrix&c); // оператор сложения
    Matrix operator - (const Matrix&c); // оператор вычитания
    Matrix operator * (const Matrix&c); // оператор произведения
    Matrix& operator += (Matrix&c);  // оператор дополнения
    friend std::ostream& operator<< (std::ostream &, const Matrix&); // перегруженный оператор вывода
    friend std::istream& operator>> (std::istream &, Matrix&); // перегруженный оператор ввода
};
#endif // MATRIX_H
Matrix.cpp
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include "Matrix.h"
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <string>
 
Matrix::Matrix() // конструктор по умолчанию
{
    n = 3; // по умолчанию размер матрицы = 3
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // рандомим матрицу (заполняем разными значениями)
        for (int jx = 0; jx < 10; jx++)
            ptr[ix][jx] = rand() % 10 - 5;
}
 
Matrix::Matrix(int k)
{
    n = k; // размер матрицы
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // рандомим матрицу (заполняем разными значениями)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = rand() % 10 - 5;
}
Matrix::Matrix(int k, int **mas)
{
    n = k; // размер матрицы
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // копируем матрицу
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = mas[ix][jx];
}
Matrix::Matrix(const Matrix &c)   // конструктор копирования
{
    
    ptr = new int*[n];
    for (int i = 0; i < c.n; i++)
        ptr[i] = new int[c.n];
 
    
    for (int ix = 0; ix < c.n; ix++)
        for (int jx = 0; jx < c.n; jx++)
            ptr[ix][jx] = c.ptr[ix][jx];// заполняем матрицу значениями матрицы c
}
// деструктор
Matrix::~Matrix()
{
    for (int i = 0; i < n; i++) delete[] ptr[i]; 
    delete[] ptr;
}
// остальные функции
// умножение  на константу
void Matrix::umn(int num)
{
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = ptr[ix][jx] * num;
}
 
// норма матрицы
int Matrix::nornamatrix()
{
    int norm_m = 0;
    for (int i = 0; i < n; i++)
    {
        int temp = 0;
        for (int j = 0; j < n; j++)
            temp += (int)fabs(ptr[i][j]);
        if (temp > norm_m)
            norm_m = temp;
    }
    return norm_m;
}
// операция домножения
Matrix& Matrix::operator *=(Matrix &c)
{
    int **tmp = new int *[n];
    for (int i = 0; i < n; i++)
    {
        tmp[i] = new int[n];
        for (int j = 0; j < n; j++)
            tmp[i][j] = 0;
    };
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int k = 0; k < n; k++)
                tmp[i][j] += ptr[i][k] * c.ptr[k][j];
    ptr = tmp;
    n = c.n;
    return *this;
}
 
// оператор присваивания
Matrix& Matrix::operator = (Matrix &c)
{
    for (int i = 0; i < n; i++) delete[] ptr[i];
    delete[] ptr;
    n = c.n;
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
 
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = c.ptr[ix][jx];// заполняем матрицу значениями матрицы c
    return *this;
}
 
// оператор +=
Matrix& Matrix::operator += (Matrix &c)
{
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = ptr[ix][jx] + c.ptr[ix][jx];
 
    return *this;
}
// оператор сложения
Matrix Matrix::operator + (const Matrix&c)
{
    Matrix result(n);
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            result.ptr[ix][jx] = ptr[ix][jx] + c.ptr[ix][jx];
 
    return result;
}
 
// оператор вычитания
Matrix Matrix::operator - (const Matrix &c)
{
    
    Matrix result(n);
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            result.ptr[ix][jx] = ptr[ix][jx] - c.ptr[ix][jx];
    return result;
}
 
 
// оператор умножения
Matrix Matrix::operator * (const Matrix &c)
{
    Matrix result(c.n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < c.n; j++)
        {
            result[i][j] = 0;
            for (int v = 0; v < c.n; v++)
            {
                result[i][j] += ptr[i][v] * c.ptr[v][j];
            }
        }
    }
    return result;
}
 
// перегрузка оператора <<
std::ostream& operator<< (std::ostream &out, const Matrix &c)
{
    for (int ix = 0; ix < c.n; ix++)
    {
        for (int jx = 0; jx < c.n; jx++)
        {
            out << c.ptr[ix][jx] << "\t";
        }
        std::cout << std::endl;
    }
    out << std::endl; // перенос маркера на новую строку
    return out; // позволяет множественный вывод, типа cout << x << y << z << ...
}
// перегрузка оператора >>
std::istream& operator>> (std::istream &in, Matrix &c)
{
    std::cout << "ВВОД МАТРИЦЫ" << std::endl;
    for (int ix = 0; ix < c.n; ix++)
    {
        std::cout << "ВВОД " << ix + 1 << " СТРОКИ" << std::endl;
        for (int jx = 0; jx < c.n; jx++)
        {
            std::cout << "Ввод " << jx + 1 << " члена = ";
            in >> c.ptr[ix][jx]; // заполняем матрицу
        }
        std::cout << std::endl;
    }
    return in;
}
Main.cpp
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
#include <iostream>
#include "Matrix.h"
using namespace std;
 
/* Определить класс «Квадратная матрица» – Matrix. Класс должен содержать несколько конструкторов,
в том числе конструктор копирования. Реализовать методы для сложения, вычитания, умножения матриц;
вычисления нормы матрицы. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса.
Создать массив объектов класса Matrix и передать его в функцию, которая изменяет  i-ю матрицу путем возведения ее
в квадрат. В головной программе вывести результат.
*/
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    cout << "Введите размерность = "; cin >> n;
    Matrix m1(n);
    cout << "Ввод матрицы" << endl;
    cin >> m1;
    cout << "Вывод матрицы" << endl;
    cout << m1;
    cout << "Создаём новую (вторую) матрицу" << endl;
    Matrix m2(n);
    cout << "Выводим вторую матрицу" << endl;
    cout << m2;
    cout << "Норма первой матрицы = " << m1.nornamatrix() << endl;
    cout << "Норма второй матрицы = " << m2.nornamatrix() << endl;
 
    cout << endl << "Складываем первую и вторую матрицу" << endl;
 
    Matrix m3 = m2 + m1;
    cout << m3;
    cout << "Вычитаем из первой вторую матрицу" << endl;
    Matrix m4 = m2 - m1;
    cout << m4;
    cout << "Умножаем первую матрицу на вторую" << endl;
    Matrix m5 = m1 * m2;
    cout << m5;
    cout << "Прибавляем к первой матрицу вторую" << endl;
    m1 += m2;
    cout << m1;
 
    cout << "Создаём массив объектов класса, который будет состять из 2 матриц" << endl;
    Matrix mas[1];
    mas[0] = m1;
    mas[1] = m2;
    cout << "Возводим обе в квадрат" << endl;
    for (int i = 0; i < 2; i++)
    {
        mas[i] *= mas[i];
    }
    cout << endl << "Выводим полученные матрицы" << endl;
    for (int i = 0; i < 2; i++)
    {
        cout << "Матрицы " << i + 1 << endl;
        cout << mas[i];
        cout << endl;
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2018, 09:17
Ответы с готовыми решениями:

"Куча была повреждена" и "<Имя проекта> вызвал срабатывание точки останова" в самых разных местах программы
Причем точки останова в этом месте нет. Исходный код очень длинный. Кто знает, как это исправить?

Ошибка "*.exe вызвал срабатывание точки останова" и "HEAP CORRUPTION" при вызове деструктора программой
Здравствуйте! Сделал простенькое упражнение на указатели, но программа выдает названные ошибки. ...

Почему вылетает ошибка "файл вызвал срабатывание точки останова"?
Уже который день мучаюсь с сортировками Тестируешь, вроде всё нормально, но потом вылетает ошибка,...

Выползает такая ошибка "test.exe вызвал срабатывание точки останова."
Одну итерацию цикла программа проходит, затем на середине второй выскакивает такая вот фигня:...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
19
Модератор
Эксперт С++
10489 / 8730 / 5274
Регистрация: 18.12.2011
Сообщений: 23,335
27.09.2018, 09:33 2
Цитата Сообщение от AlexejDrozdov Посмотреть сообщение
C++
1
2
3
Matrix mas[1]; 
mas[0] = m1; 
mas[1] = m2;
Отладчик должен был показать, что память портится в этом месте.
Массив создается размером в один элемент, а присваиваете значение двум элементам.
0
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
27.09.2018, 09:36  [ТС] 3
И как это исправить, и нет ли больше других ошибок, у меня не отрабатывают операторы сложения.
0
Jesus loves me
Эксперт С++
5164 / 3137 / 353
Регистрация: 12.12.2009
Сообщений: 7,924
Записей в блоге: 2
27.09.2018, 09:37 4
Цитата Сообщение от AlexejDrozdov Посмотреть сообщение
И как это исправить
Это не исправимо, переводись на другую кафедру.
0
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,243
Записей в блоге: 1
27.09.2018, 09:45 5
AlexejDrozdov, ошибка в конструкторе по умолчанию первая
C++
1
2
3
4
5
6
7
8
9
10
Matrix::Matrix() // конструктор по умолчанию
{
    n = 3; // по умолчанию размер матрицы = 3
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // рандомим матрицу (заполняем разными значениями)
        for (int jx = 0; jx < n; jx++) // тут была ошибка, out_of_range !!! (было 10 вместо n )
            ptr[ix][jx] = rand() % 10 - 5;
}
Добавлено через 42 секунды
вторая тут
C++
1
2
3
    Matrix mas[2];  // надо так!
    mas[0] = m1;
    mas[1] = m2;
Добавлено через 5 минут
рабочий коддд
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#ifndef MATRIX_H
#define MATRIX_H
#include <ostream>
 
class Matrix
{
private:
    int **ptr; // указатель на матрицу
    int n;// размер матрицы
public:
    Matrix(); // конструктор по умолчанию
    Matrix(int n); // конструктор с параметрами (только размер матрицы)
    Matrix(int n, int **mas); // конструктор с параметрами (размер матрицы + матрица)
    Matrix(const Matrix&c); // конструктор копирования
    ~Matrix(); // десструктор класса Matrix
 
    Matrix& operator *= (Matrix&c); // операция домножения
    int nornamatrix(); // вычисление нормы матрицы
    void umn(int num); // умножение миноров на константу
    int* operator[] (int i) { return(ptr[i]); } // функция-оператор, которая достаёт член строки матрицы (перегруженная операция взятия индекса)
    Matrix& operator = (Matrix&c); // оператор присваивания
    Matrix operator + (const Matrix&c); // оператор сложения
    Matrix operator - (const Matrix&c); // оператор вычитания
    Matrix operator * (const Matrix&c); // оператор произведения
    Matrix& operator += (Matrix&c);  // оператор дополнения
    friend std::ostream& operator<< (std::ostream &, const Matrix&); // перегруженный оператор вывода
    friend std::istream& operator>> (std::istream &, Matrix&); // перегруженный оператор ввода
};
#endif // MATRIX_H
 
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <string>
 
Matrix::Matrix() // конструктор по умолчанию
{
    n = 3; // по умолчанию размер матрицы = 3
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // рандомим матрицу (заполняем разными значениями)
        for (int jx = 0; jx < n; jx++) // тут была ошибка, out_of_range !!!
            ptr[ix][jx] = rand() % 10 - 5;
}
 
Matrix::Matrix(int k)
{
    n = k; // размер матрицы
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // рандомим матрицу (заполняем разными значениями)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = rand() % 10 - 5;
}
Matrix::Matrix(int k, int **mas)
{
    n = k; // размер матрицы
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++) // копируем матрицу
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = mas[ix][jx];
}
Matrix::Matrix(const Matrix &c)   // конструктор копирования
{
    
    ptr = new int*[n];
    for (int i = 0; i < c.n; i++)
        ptr[i] = new int[c.n];
 
    
    for (int ix = 0; ix < c.n; ix++)
        for (int jx = 0; jx < c.n; jx++)
            ptr[ix][jx] = c.ptr[ix][jx];// заполняем матрицу значениями матрицы c
}
// деструктор
Matrix::~Matrix()
{
    for (int i = 0; i < n; i++) delete[] ptr[i]; 
    delete[] ptr;
}
// остальные функции
// умножение  на константу
void Matrix::umn(int num)
{
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = ptr[ix][jx] * num;
}
 
// норма матрицы
int Matrix::nornamatrix()
{
    int norm_m = 0;
    for (int i = 0; i < n; i++)
    {
        int temp = 0;
        for (int j = 0; j < n; j++)
            temp += (int)fabs(ptr[i][j]);
        if (temp > norm_m)
            norm_m = temp;
    }
    return norm_m;
}
// операция домножения
Matrix& Matrix::operator *=(Matrix &c)
{
    int **tmp = new int *[n];
    for (int i = 0; i < n; i++)
    {
        tmp[i] = new int[n];
        for (int j = 0; j < n; j++)
            tmp[i][j] = 0;
    };
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int k = 0; k < n; k++)
                tmp[i][j] += ptr[i][k] * c.ptr[k][j];
    ptr = tmp;
    n = c.n;
    return *this;
}
 
// оператор присваивания
Matrix& Matrix::operator = (Matrix &c)
{
    for (int i = 0; i < n; i++) delete[] ptr[i];
    delete[] ptr;
    n = c.n;
    ptr = new int*[n]; // выделить место в памяти для матрицы
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
 
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = c.ptr[ix][jx];// заполняем матрицу значениями матрицы c
    return *this;
}
 
// оператор +=
Matrix& Matrix::operator += (Matrix &c)
{
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = ptr[ix][jx] + c.ptr[ix][jx];
 
    return *this;
}
// оператор сложения
Matrix Matrix::operator + (const Matrix&c)
{
    Matrix result(n);
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            result.ptr[ix][jx] = ptr[ix][jx] + c.ptr[ix][jx];
 
    return result;
}
 
// оператор вычитания
Matrix Matrix::operator - (const Matrix &c)
{
    
    Matrix result(n);
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            result.ptr[ix][jx] = ptr[ix][jx] - c.ptr[ix][jx];
    return result;
}
 
 
// оператор умножения
Matrix Matrix::operator * (const Matrix &c)
{
    Matrix result(c.n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < c.n; j++)
        {
            result[i][j] = 0;
            for (int v = 0; v < c.n; v++)
            {
                result[i][j] += ptr[i][v] * c.ptr[v][j];
            }
        }
    }
    return result;
}
 
// перегрузка оператора <<
std::ostream& operator<< (std::ostream &out, const Matrix &c)
{
    for (int ix = 0; ix < c.n; ix++)
    {
        for (int jx = 0; jx < c.n; jx++)
        {
            out << c.ptr[ix][jx] << "\t";
        }
        std::cout << std::endl;
    }
    out << std::endl; // перенос маркера на новую строку
    return out; // позволяет множественный вывод, типа cout << x << y << z << ...
}
// перегрузка оператора >>
std::istream& operator>> (std::istream &in, Matrix &c)
{
    std::cout << "ВВОД МАТРИЦЫ" << std::endl;
    for (int ix = 0; ix < c.n; ix++)
    {
        std::cout << "ВВОД " << ix + 1 << " СТРОКИ" << std::endl;
        for (int jx = 0; jx < c.n; jx++)
        {
            std::cout << "Ввод " << jx + 1 << " члена = ";
            in >> c.ptr[ix][jx]; // заполняем матрицу
        }
        std::cout << std::endl;
    }
    return in;
}
 
#include <iostream>
 
using namespace std;
 
/* Определить класс «Квадратная матрица» – Matrix. Класс должен содержать несколько конструкторов,
в том числе конструктор копирования. Реализовать методы для сложения, вычитания, умножения матриц;
вычисления нормы матрицы. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса.
Создать массив объектов класса Matrix и передать его в функцию, которая изменяет  i-ю матрицу путем возведения ее
в квадрат. В головной программе вывести результат.
*/
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    cout << "Введите размерность = "; cin >> n;
    Matrix m1(n);
    cout << "Ввод матрицы" << endl;
    cin >> m1;
    cout << "Вывод матрицы" << endl;
    cout << m1;
    cout << "Создаём новую (вторую) матрицу" << endl;
    Matrix m2(n);
    cout << "Выводим вторую матрицу" << endl;
    cout << m2;
    cout << "Норма первой матрицы = " << m1.nornamatrix() << endl;
    cout << "Норма второй матрицы = " << m2.nornamatrix() << endl;
 
    cout << endl << "Складываем первую и вторую матрицу" << endl;
 
    Matrix m3 = m2 + m1;
    cout << m3;
    cout << "Вычитаем из первой вторую матрицу" << endl;
    Matrix m4 = m2 - m1;
    cout << m4;
    cout << "Умножаем первую матрицу на вторую" << endl;
    Matrix m5 = m1 * m2;
    cout << m5;
    cout << "Прибавляем к первой матрицу вторую" << endl;
    m1 += m2;
    cout << m1;
 
    cout << "Создаём массив объектов класса, который будет состять из 2 матриц" << endl;
    Matrix mas[2];
    mas[0] = m1;
    mas[1] = m2;
    cout << "Возводим обе в квадрат" << endl;
    for (int i = 0; i < 2; i++)
    {
        mas[i] *= mas[i];
    }
    cout << endl << "Выводим полученные матрицы" << endl;
    for (int i = 0; i < 2; i++)
    {
        cout << "Матрицы " << i + 1 << endl;
        cout << mas[i];
        cout << endl;
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
27.09.2018, 09:56  [ТС] 6
спасибо за ответ, но операторы сложения вычитания и умножения у меня все равно не работают.
0
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,243
Записей в блоге: 1
27.09.2018, 10:31 7
Цитата Сообщение от AlexejDrozdov Посмотреть сообщение
но операторы сложения вычитания и умножения у меня все равно не работают.
а это уже совсем другая история дружок.

Добавлено через 24 минуты
странная однако ошибка нарушение границ происходит в конструкторе по умолчанию
C++
1
2
3
4
5
6
7
8
9
10
Matrix::Matrix()
{
    n = 3;
    ptr = new int*[n];
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < 10; jx++) // тут 10 вместо n
            ptr[ix][jx] = rand() % 10 - 5;
}
а ошибка вылетает в операторе присваивания
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Matrix& Matrix::operator = (Matrix &c)
{
    for (int i = 0; i < n; i++) delete[] ptr[i]; // тут ошибка
    delete[] ptr;
    n = c.n;
    ptr = new int*[n];
    for (int i = 0; i < n; i++)
        ptr[i] = new int[n];
 
    for (int ix = 0; ix < n; ix++)
        for (int jx = 0; jx < n; jx++)
            ptr[ix][jx] = c.ptr[ix][jx];
    return *this;
}
это особенности реализации компилятора?

Добавлено через 2 минуты
вот код для проверки
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
#include <cstddef>
#include <iostream>
 
int main()
{
    std::size_t size = 2;
    int** p = nullptr;
 
    p = new int*[size];
    for (std::size_t i = 0; i < size; ++i)
    {
        p[i] = new int[size];
    }
 
    for (std::size_t i = 0; i < size; ++i)
    {
        for (std::size_t j = 0; j < 10; ++j)
        {
            p[i][j] = j;
        }
    }
 
    for (std::size_t i = 0; i < size; ++i)
    {
        for (std::size_t j = 0; j < size; ++j)
        {
            std::cout << p[i][j] << ' ';
        }
        std::cout << std::endl;
    }
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
27.09.2018, 10:49  [ТС] 8
Что должен был вывести этот код?
0
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,243
Записей в блоге: 1
27.09.2018, 11:23 9
Цитата Сообщение от AlexejDrozdov Посмотреть сообщение
Что должен был вывести этот код?
это сокращенный вариант твоей ошибки.
0
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
27.09.2018, 12:39  [ТС] 10
он выдает (0 1;0 1)
0
14099 / 7566 / 1796
Регистрация: 30.01.2014
Сообщений: 12,663
27.09.2018, 12:44 11
Цитата Сообщение от _stanislav Посмотреть сообщение
это особенности реализации компилятора?
Это называется расстрел памяти.
Ты можешь сколько угодно портить память некорректным кодом, но проявится ошибка только после того, как кто-то решит этой испорченной (расстреляной) памятью воспользоваться.
Компилятор тут не при чем. Такое может быть абсолютно в любой системе.

Добавлено через 4 минуты
Причем даже в этом случае не факт, что ошибка проявится, т.к. испорченная память может быть так испорчена, что по стечению обстоятельств являться корректным состоянием для того кода, который начнет ей пользоваться. Тогда ошибка может жить долго в программе, пока звезды не сойдутся иначе.
Один из способов это отловить автоматически - это запустить программу в виртуальной машине (управляемой среде). Она будет анализировать все операции, которые программа пытается выполнять. Например, так поступает анализатор valgrind.
1
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,243
Записей в блоге: 1
27.09.2018, 13:14 12
Цитата Сообщение от DrOffset Посмотреть сообщение
Это называется расстрел памяти.
интересно, но не понятно. куда копать что бы понять? это особенности управлением памяти что ли на уровне операционной системы?
0
14099 / 7566 / 1796
Регистрация: 30.01.2014
Сообщений: 12,663
27.09.2018, 13:30 13
Цитата Сообщение от _stanislav Посмотреть сообщение
интересно, но не понятно. куда копать что бы понять? это особенности управлением памяти что ли на уровне операционной системы?
Понять это очень просто. Допустим ты купил короткоствол, и пошел с ним в тир. Стреляешь там и все нормально. А потом ты решил пострелять в воздух и в разные стороны. И ты можешь так довольно долго стрелять и ничего не случится. Но вот разочек можно попасть в птицу, или в человека через окно. И тогда будут последствия.

Твоей программе выделено адресное пространство, там, помимо твоих данных, также находятся другие данные - например, как в данном случае пострадавший менеджер кучи, или данные загруженных библиотек, да даже твои собственные данные которые ты создал ранее, и проч.
Если ты начнешь лупить мимо допустимых для записи участков, то сможешь попасть как в защищенные для записи области, тогда ОС моментально отреагирует на это системным исключением, либо попасть в данные одной из библиотек или попортить свои. Тогда сразу ничего плохого не произойдет, но как только настанет время ими пользоваться - можно ждать в разной степени некорректного поведения.
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
#include <iostream>
 
int as = 10;
int bs = 10;
 
int main()
{
    int * a = new int[as]{1,2,3,4,5,6,7,8,9,0};
    int * b = new int[bs]{0,9,8,7,6,5,4,3,2,1};
    
    std::ptrdiff_t dist = std::distance(a, b); // это некорректно, но нужно для демонстрации
    
    a[dist] = 121332323; // стреляем мимо и попадаем в другой массив (ничего не падает)
    // если логика программы зависит от данных в этом массиве, 
    // то далее нас ждет штатная, но некорректная работа
        
    for(int i = 0; i < as; ++i)
    {
        std::cout << ' ' << a[i];
    }
    std::cout << std::endl;
    
    for(int i = 0; i < bs; ++i)
    {
        std::cout << ' ' << b[i];
    }
    std::cout << std::endl;
}
http://rextester.com/TIPO55805
1
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,243
Записей в блоге: 1
27.09.2018, 13:47 14
DrOffset, получается, что я затер чьи то данные, например библиотеки, она проверила их на валидность и кинула исключение?
0
14099 / 7566 / 1796
Регистрация: 30.01.2014
Сообщений: 12,663
27.09.2018, 14:00 15
Цитата Сообщение от _stanislav Посмотреть сообщение
получается, что я затер чьи то данные, например библиотеки, она проверила их на валидность и кинула исключение?
Ни в коем случае (в большинстве случаев это сделать невозможно без управляемой среды, см. пост выше).
Исключение у нас кинула ОС, но произошло это вследствие работы с испорченными данными.
Банальный пример.
В программе есть связный список, указатели вперед и назад. Не важно в библиотеке он или в твоем коде. Некорректной записью ты портишь один из указателей, сделав ему, например, значение 1. Через некоторое время по этому списку нужно будет пройтись. Надо понимать, что с момента такой несанкционированной перезаписи программа уже некорректная, и все, что с ней происходит - некорректно. Пусть даже это иногда и выглядит как нормальная работа. Ну так вот, в тот момент когда по списку мы идем, указатели у нас разыменовываются, и вот когда дело доходит до нашего "битого" указателя со значением 1, ОС уже может бросить исключение (потому что, например, нет доступного адреса со значением 1) и ты увидишь ошибку. И вот от того, сколько времени прошло с момента некорректнной записи в память, и до момента когда некорректное поведение программы таки приведет к реакции ОС (а может и вообще не приведет), зависит тяжесть нашего случая
1
"C with Classes"
1628 / 1252 / 474
Регистрация: 16.08.2014
Сообщений: 5,243
Записей в блоге: 1
27.09.2018, 14:23 16
DrOffset, интересно что исключение бросается если тип данных передаваемый в cout длиннее 8 бит, то есть при вызове operator<<(char) исключения нет. но это уже по ходу дебри.

Добавлено через 12 секунд
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
#include <cstddef>
#include <iostream>
 
int main()
{
    std::size_t size = 2;
    int** p = nullptr;
 
    p = new int*[size];
    for (std::size_t i = 0; i < size; ++i)
    {
        p[i] = new int[size];
    }
 
    for (std::size_t i = 0; i < size; ++i)
    {
        for (std::size_t j = 0; j < 10; ++j)
        {
            p[i][j] = j;
        }
    }
 
    for (std::size_t i = 0; i < size; ++i)
    {
        for (std::size_t j = 0; j < size; ++j)
        {
            std::cout << (char)100 << ' '; // так исключения нет
        }
        std::cout << std::endl;
    }
 
    return 0;
}
Добавлено через 5 минут
C++
1
std::cout << 100 << ' '; // так исключения есть
0
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
27.09.2018, 14:46  [ТС] 17
А что на счёт моего вопроса?
0
14099 / 7566 / 1796
Регистрация: 30.01.2014
Сообщений: 12,663
27.09.2018, 14:57 18
AlexejDrozdov, в коде, который _stanislav дал выше нужно исправить 70 строку:
Цитата Сообщение от _stanislav Посмотреть сообщение
ptr = new int*[n];
тут надо ptr = new int*[c.n];
Также надо туда добавить строку n = c.n;
Возможно еще что-то есть, проверяйте.
1
Jesus loves me
Эксперт С++
5164 / 3137 / 353
Регистрация: 12.12.2009
Сообщений: 7,924
Записей в блоге: 2
27.09.2018, 14:57 19
Цитата Сообщение от AlexejDrozdov Посмотреть сообщение
А что на счёт моего вопроса?
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это не исправимо, переводись на другую кафедру.
...
0
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 39
27.09.2018, 15:10  [ТС] 20
Спасибо, теперь работает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2018, 15:10

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

System("cls") *.exe вызвал срабатывание точки останова
При вызове функции system(&quot;cls&quot;); крашит программу, но при вызове этой же функции функции с другими...

Вылетает "Вызвал срабатывание точки останова" после закрытия консоли
Есть такая задача: нужно вводить массив, пока не введешь число,отличающейся знаком, относительно...

" *.exe вызвал срабатывание точки останова " при закрытии консоли
Здравствуйте, уважаемые. Есть задание: Сделать &quot;гибкий&quot; массив на основе возрастающего...

Delete [] "вызвал срабатывание точки останова"
Всем привет. Стоит следующая задача на ЛР - создать функцию, которая дописывает одну строку в конец...


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

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

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