Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153

Вызов исключения при копировании матрицы

16.06.2020, 18:55. Показов 922. Ответов 20

Студворк — интернет-сервис помощи студентам
Вызывается исключение, когда матрица А копируется в матрицу А1 (Может быть напутал что-то в указателях? Или что-то неправильно считается в функции move? (В функции матрица сдвигается на К позиций вправо)

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
#include <string>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <array>
#include <ctime>
 
using namespace std;
 
void FormMatr(int* X, int n, int m) //Формирование матрицы
{
    for (int i = 0; i < n; i++)
 
    {
        for (int j = 0; j < m; j++)
        {
            *(X + i * m + j) = 160 * (float)rand() / RAND_MAX - 80;
        }
    }
}
void PrintMatr(int* X, int n, int m) //Печать матрицы
{
    cout.width(10);
    cout.precision(3);
    for (int i = 0; i < n; i++)
    {
        cout << endl;
        for (int j = 0; j < m; j++)
        {
            cout.width(6);
            cout << *(X + i * m + j) << " ";
        }
    }
}
int GetMax(int* X, int n, int m) //Нахождение максимального элемента матрицы
{
    int i, j; int max = -500;
    cout << "Матрица";
    for (i = 0; i < n; i++)
    {
        cout << "\n";
        for (j = 0; j < m; j++)
        {
            if (max <= *(X + i * m + j))
            {
                max = *(X + i * m + j);
            }
            cout << *(X + i * m + j) << "\t";
        }
    }
    cout << endl;
    cout << "Наибольшый элемент матрицы:" << max << endl;
    cout << endl;
    return max;
}
int GetSum(int* X, int n, int m, int& ReturnSum) //Нахождение суммы матрицы
{
    int i, j; int Sum = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            Sum += *(X + i * m + j);
        }
    }
    cout << "Сумма матрицы С = " << Sum << endl;
    ReturnSum = Sum;
    return Sum;
}
void Copy(int* X, int n, int m, int* X1) //Функция копирования матрицы 
{
 
    int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        {
            *(X + i * m + j) = *(X1 + i * m + j); //Вызов исключения в этой строке
        }
}
 
void move(int* X, int n, int m, int k) { //Сдвиг матрицы на К позиций вправо, правильно ли работает?) 
    int buf = 0;
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < k % n; t++)
        {
            buf = *(X + i * n - 1);
            for (int j = n - 1; j > 0; j--)
            {
                *(X + i * m + j) = *(X + i * m + j - 1);
            }
            *(X + i) = buf;
        }
    }
}
 
class Matr {// Класс матрица с разными конструкторами
private:
    int n, m;  int* X; int* X1;
public:
    Matr()
    {
        n = 0; m = 0;
    }
 
    Matr(int n1, int m1)
    {
        n = n1; m = m1; X = new int[n * m];
        FormMatr(X, n, m);
        cout << "Конструктор параметров сработал" << endl;
    }
    Matr(Matr& obj)
    {
        n = obj.n; m = obj.m; X = new int[n * m];
        Copy(obj.X, n, m, X1);
        cout << "Конструктор копии сработал" << endl;
    }
    ~Matr()
    {
        delete[] X;
        cout << "\nСработал деструктор" << endl;
    }
 
    friend void FormMatr(int*, int, int); //Друзья функции для класса
 
    friend void PrintMatr(int*, int, int);
 
    friend int GetMax(int*, int, int);
 
    friend int GetSum(int*, int, int, int&);
 
    friend void Copy(int* , int n, int m, int* );
 
    void PrintAll() //Печать матриц 
    {
        cout << "Размерность матрицы:" << endl; cout << "n= " << n << " m= " << m << endl; PrintMatr(X, n, m);
    }
 
    Matr& operator =(const Matr& obj) //ОПЕРАТОР ПРИСВАИВАНИЯ
    {
        if (this == &obj)
            return *this;
        cout << "Сработал оператор присваивания" << endl;
        n = obj.n;
        m = obj.m;
        X = new int[n * m];
        Copy(obj.X, n, m, X1);
        delete[] obj.X;
        return *this;
    }
 
    int operator ~()
    {
        cout << "Операция ~ " << endl;
        int ReturnSum;
        GetSum(X, n, m, ReturnSum);
        return ~ReturnSum;
    }
    int operator > (Matr& obj) //Оператор нахождения минимального элемента (У матриц А и Б находятся макс. элементы, из низ выбирается минимальный)
    {
        cout << "\nОперация >" << endl;
        int Max1, Max2;
        int Min_Max;
        Max1 = GetMax(this->X, this->n, this->m);
        Max2 = GetMax(obj.X, obj.n, obj.m);
        if (Max1 < Max2)
        {
            Min_Max = Max1;
        }
        else   Min_Max = Max2;
        return Min_Max;
    }
    Matr operator >> (int K) //Оперратор сдвига матрицы А на К позиций
    {
        cout << "Операция >> \n" << endl;
        move(X, n, m, K);
        return *this;
    }
};
void main()
{
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");
    Matr A(5, 5), B(5, 5), C(5, 5);
    Matr A1(5,5), A2(5,5);
    int K;
    cout << "Матрица А" << endl;
    A.PrintAll();
    cout << endl;
    cout << "Матрица В" << endl;
    B.PrintAll();
    cout << endl;
    cout << "Матрица С" << endl;
    C.PrintAll();
    cout << endl;
    K = ~C;
    cout << "Побитово инвертированное значение суммы матрицы С = " << K << endl << endl;
    cout << "Сдвиг матрицы А на К значений " << endl;
    if (K > 0)
    {
        A1 = A >> K; //Новая матрица А1 = сдвинутой матрице А на К позиций (К= побитово-инвертированному значению матрицы С)
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    K = A > B;
    cout << "Минимальный элемент из двух максимальных элементов матриц = " << K << endl;
    cout << "Сдвиг матрицы А1 на К значений\n" << endl;
    if (K > 0)
    {
        A2 = A1 >> K; //Новая матрица А2 = сдвинутой матрицы А1 на К позиций (К= минимальному элементу)
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    system("pause");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2020, 18:55
Ответы с готовыми решениями:

Ноли при копировании матрицы
Здравствуйте! Написал программу, которая считает СЛАР по методу Гаусса, все работает, но с одной, очень непонятной мне ошибкой. В...

Вызов исключения
Приветствую всех. Подскажите, возможно ли программно сгенерировать исключительную ситуацию в коде? Например: int i; try { i =...

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

20
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 19:18
Цитата Сообщение от superbest Посмотреть сообщение
Вызывается исключение, когда матрица А копируется в матрицу А1 (Может быть напутал что-то в указателях? Или что-то неправильно считается в функции move? (В функции матрица сдвигается на К позиций вправо)
C++
1
2
3
4
5
6
    Matr(const Matr& obj)
    {
        n = obj.n; m = obj.m; X = new int[n * m];
        Copy(X, n, m, obj.X);
        cout << "Конструктор копии сработал" << endl;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Matr& operator =(const Matr& obj) //ОПЕРАТОР ПРИСВАИВАНИЯ
    {
        if (this == &obj)
            return *this;
        cout << "Сработал оператор присваивания" << endl;
 
delete [] X;
 
        n = obj.n;
        m = obj.m;
        X = new int[n * m];
        Copy(X, n, m, obj.X);
        return *this;
    }
Добавлено через 1 минуту
C++
1
2
3
4
5
void Copy(int* X, int n, int m, const int* X1) //Функция копирования матрицы 
{
    for (int i = 0; i < (n * m); i++)
        X[i] = X1[i]; //Вызов исключения в этой строке
}
1
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:27  [ТС]
Такой же вывод как и был. Может что-то с функцией move?
Миниатюры
Вызов исключения при копировании матрицы  
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
16.06.2020, 19:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Matr& operator =(const Matr& obj) //ОПЕРАТОР ПРИСВАИВАНИЯ
{
    if (this == &obj)
        return *this;
    cout << "Сработал оператор присваивания" << endl;
    n = obj.n;
    m = obj.m;
// а вот тут как раз надо бы освободить память по указателю this->X прежде чем выделять новую память
    X = new int[n * m];
    Copy(obj.X, n, m, X1);
    delete[] obj.X; // это вы так прикололись? освобождаете память у копируемого объекта?
    return *this;
}
1
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:29  [ТС]
Внизу, матрица A1

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
Matr& operator =(const Matr& obj) //ОПЕРАТОР ПРИСВАИВАНИЯ
    {
        if (this == &obj)
            return *this;
        cout << "Сработал оператор присваивания" << endl;
        n = obj.n;
        m = obj.m;
        free(X);
        X = new int[n * m];
        Copy(obj.X, n, m, obj.X);
        return *this;
    }
По идее так?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 19:31
Цитата Сообщение от superbest Посмотреть сообщение
Такой же вывод как и был. Может что-то с функцией move?
А зачем тебе X1? Убери его

Добавлено через 59 секунд
Цитата Сообщение от superbest Посмотреть сообщение
Copy(obj.X, n, m, obj.X);
Copy(X, n, m, obj.X)

И покажи, как сделал
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:31  [ТС]
Так он же в функции копирования используется
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 19:32
Цитата Сообщение от superbest Посмотреть сообщение
Так он же в функции копирования используется
Нафига? Я ж тебе вроде показал, как копирование сделать.
Убери его отовсюду.
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:34  [ТС]
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
using namespace std;
 
void FormMatr(int* X, int n, int m) //Формирование матрицы
{
    for (int i = 0; i < n; i++)
 
    {
        for (int j = 0; j < m; j++)
        {
            *(X + i * m + j) = 160 * (float)rand() / RAND_MAX - 80;
        }
    }
}
void PrintMatr(int* X, int n, int m) //Печать матрицы
{
    cout.width(10);
    cout.precision(3);
    for (int i = 0; i < n; i++)
    {
        cout << endl;
        for (int j = 0; j < m; j++)
        {
            cout.width(6);
            cout << *(X + i * m + j) << " ";
        }
    }
}
int GetMax(int* X, int n, int m) //Нахождение максимального элемента матрицы
{
    int i, j; int max = -500;
    cout << "Матрица";
    for (i = 0; i < n; i++)
    {
        cout << "\n";
        for (j = 0; j < m; j++)
        {
            if (max <= *(X + i * m + j))
            {
                max = *(X + i * m + j);
            }
            cout << *(X + i * m + j) << "\t";
        }
    }
    cout << endl;
    cout << "Наибольшый элемент матрицы:" << max << endl;
    cout << endl;
    return max;
}
int GetSum(int* X, int n, int m, int& ReturnSum) //Нахождение суммы матрицы
{
    int i, j; int Sum = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            Sum += *(X + i * m + j);
        }
    }
    cout << "Сумма матрицы С = " << Sum << endl;
    ReturnSum = Sum;
    return Sum;
}
void Copy(int* X, int n, int m, const int* X1) //Функция копирования матрицы 
{
    for (int i = 0; i < (n * m); i++)
        X[i] = X1[i]; //Вызов исключения в этой строке
}
 
void move(int* X, int n, int m, int k) { //Сдвиг матрицы на К позиций вправо, правильно ли работает?) 
    int buf = 0;
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < k % n; t++)
        {
            buf = *(X + i * n - 1);
            for (int j = n - 1; j > 0; j--)
            {
                *(X + i * m + j) = *(X + i * m + j - 1);
            }
            *(X + i) = buf;
        }
    }
}
 
class Matr {// Класс матрица с разными конструкторами
private:
    int n, m;  int* X; 
public:
    Matr()
    {
        n = 0; m = 0;
    }
 
    Matr(int n1, int m1)
    {
        n = n1; m = m1; X = new int[n * m];
        FormMatr(X, n, m);
        cout << "Конструктор параметров сработал" << endl;
    }
    Matr(const Matr& obj)
    {
        n = obj.n; m = obj.m; X = new int[n * m];
        Copy(obj.X, n, m, obj.X);
        cout << "Конструктор копии сработал" << endl;
    }
    ~Matr()
    {
        delete[] X;
        cout << "\nСработал деструктор" << endl;
    }
 
    friend void FormMatr(int*, int, int); //Друзья функции для класса
 
    friend void PrintMatr(int*, int, int);
 
    friend int GetMax(int*, int, int);
 
    friend int GetSum(int*, int, int, int&);
 
    friend void Copy(int* , int n, int m, int* );
 
    void PrintAll() //Печать матриц 
    {
        cout << "Размерность матрицы:" << endl; cout << "n= " << n << " m= " << m << endl; PrintMatr(X, n, m);
    }
 
    Matr& operator =(const Matr& obj) //ОПЕРАТОР ПРИСВАИВАНИЯ
    {
        if (this == &obj)
            return *this;
        cout << "Сработал оператор присваивания" << endl;
        n = obj.n;
        m = obj.m;
        free(X);
        X = new int[n * m];
        Copy(obj.X, n, m, obj.X);
        return *this;
    }
 
    int operator ~()
    {
        cout << "Операция ~ " << endl;
        int ReturnSum;
        GetSum(X, n, m, ReturnSum);
        return ~ReturnSum;
    }
    int operator > (Matr& obj) //Оператор нахождения минимального элемента (У матриц А и Б находятся макс. элементы, из низ выбирается минимальный)
    {
        cout << "\nОперация >" << endl;
        int Max1, Max2;
        int Min_Max;
        Max1 = GetMax(this->X, this->n, this->m);
        Max2 = GetMax(obj.X, obj.n, obj.m);
        if (Max1 < Max2)
        {
            Min_Max = Max1;
        }
        else   Min_Max = Max2;
        return Min_Max;
    }
    Matr operator >> (int K) //Оперратор сдвига матрицы А на К позиций
    {
        cout << "Операция >> \n" << endl;
        move(X, n, m, K);
        return *this;
    }
};
void main()
{
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");
    Matr A(5, 5), B(5, 5), C(5, 5);
    Matr A1, A2;
    int K;
    cout << "Матрица А" << endl;
    A.PrintAll();
    cout << endl;
    cout << "Матрица В" << endl;
    B.PrintAll();
    cout << endl;
    cout << "Матрица С" << endl;
    C.PrintAll();
    cout << endl;
    K = ~C;
    cout << "Побитово инвертированное значение суммы матрицы С = " << K << endl << endl;
    cout << "Сдвиг матрицы А на К значений " << endl;
    if (K > 0)
    {
        A1 = A >> K; //Новая матрица А1 = сдвинутой матрице А на К позиций (К= побитово-инвертированному значению матрицы С)
        A1.PrintAll();
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    K = A > B;
    cout << "Минимальный элемент из двух максимальных элементов матриц = " << K << endl;
    cout << "Сдвиг матрицы А1 на К значений\n" << endl;
    if (K > 0)
    {
        A2 = A1 >> K; //Новая матрица А2 = сдвинутой матрицы А1 на К позиций (К= минимальному элементу)
        A2.PrintAll();
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    system("pause");
}
Добавлено через 56 секунд
Ну я имею ввиду, что он испольуется у вас в функции Copy :

C++
1
2
3
4
5
void Copy(int* X, int n, int m, const int* X1) //Функция копирования матрицы 
{
    for (int i = 0; i < (n * m); i++)
        X[i] = X1[i]; //Вызов исключения в этой строке
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 19:36
Цитата Сообщение от superbest Посмотреть сообщение
Ну я имею ввиду, что он испольуется у вас в функции Copy :
Я имел ввиду который в классе Matr, ты его уже убрал.

Добавлено через 17 секунд
Цитата Сообщение от superbest Посмотреть сообщение
Copy(obj.X, n, m, obj.X);
Здесь исправь

Добавлено через 52 секунды
В операторе и конструкторе копирования
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:39  [ТС]
Там же уже поставил

Добавлено через 1 минуту
Может, проблема в функции move, сдвигающей матрицу на К позиций Вправо?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 19:43
Цитата Сообщение от superbest Посмотреть сообщение
Может, проблема в функции move, сдвигающей матрицу на К позиций Вправо?
А что значит "сдвигать матрицу", сдвинуть каждую строку по отдельности?
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:45  [ТС]
Матрица сдвигается по столбцам вправо, например была матрица такая
1 2 3 4 5
5 4 3 2 1
2 0 3 4 1
3 2 1 0 3
Мы её сдвинули на 203 позиции 203%n= 3
Получили
4 5 1 2 3
2 1 5 4 3
4 1 2 0 3
0 3 3 2 1
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 19:53
Цитата Сообщение от superbest Посмотреть сообщение
Мы её сдвинули на 203 позиции 203%n= 3
Получили
Это на две позиции сдвинуто
И сделай эту функцию попроще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void ShiftRight(int* X, int n, int m, int k) { //Сдвиг матрицы на К позиций вправо, правильно ли работает?) 
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < k % m; t++)
        {
            int *arr = X + i * m;
            int buf = arr[0];
            for (int j = 1; j < m; ++j)
                arr[j] = arr[j - 1];
            arr[0] = buf;
        }
    }
}
Если я правильно понимаю, что n - это количество строк, а m - количество столбцов
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 19:58  [ТС]
Да, верно, спасибо, сейчас проверю

Добавлено через 3 минуты
Всё равно одно и тоже, может, я что-то не так вызываю?

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
void FormMatr(int* X, int n, int m) //Формирование матрицы
{
    for (int i = 0; i < n; i++)
 
    {
        for (int j = 0; j < m; j++)
        {
            *(X + i * m + j) = 160 * (float)rand() / RAND_MAX - 80;
        }
    }
}
void PrintMatr(int* X, int n, int m) //Печать матрицы
{
    cout.width(10);
    cout.precision(3);
    for (int i = 0; i < n; i++)
    {
        cout << endl;
        for (int j = 0; j < m; j++)
        {
            cout.width(6);
            cout << *(X + i * m + j) << " ";
        }
    }
}
int GetMax(int* X, int n, int m) //Нахождение максимального элемента матрицы
{
    int i, j; int max = -500;
    cout << "Матрица";
    for (i = 0; i < n; i++)
    {
        cout << "\n";
        for (j = 0; j < m; j++)
        {
            if (max <= *(X + i * m + j))
            {
                max = *(X + i * m + j);
            }
            cout << *(X + i * m + j) << "\t";
        }
    }
    cout << endl;
    cout << "Наибольшый элемент матрицы:" << max << endl;
    cout << endl;
    return max;
}
int GetSum(int* X, int n, int m, int& ReturnSum) //Нахождение суммы матрицы
{
    int i, j; int Sum = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            Sum += *(X + i * m + j);
        }
    }
    cout << "Сумма матрицы С = " << Sum << endl;
    ReturnSum = Sum;
    return Sum;
}
void Copy(int* X, int n, int m, const int* X1) //Функция копирования матрицы 
{
    for (int i = 0; i < (n * m); i++)
        X[i] = X1[i]; //Вызов исключения в этой строке
}
 
void move(int* X, int n, int m, int K) { //Сдвиг матрицы на К позиций вправо, правильно ли работает?) 
    for (int i = 0; i < n; i++)
    {
        for (int t = 0; t < K % m; t++)
        {
            int* arr = X + i * m;
            int buf = arr[0];
            for (int j = 1; j < m; ++j)
                arr[j] = arr[j - 1];
            arr[0] = buf;
        }
    }
}
 
class Matr {// Класс матрица с разными конструкторами
private:
    int n, m;  int* X; 
public:
    Matr()
    {
        n = 0; m = 0;
    }
 
    Matr(int n1, int m1)
    {
        n = n1; m = m1; X = new int[n * m];
        FormMatr(X, n, m);
        cout << "Конструктор параметров сработал" << endl;
    }
    Matr(const Matr& obj)
    {
        n = obj.n; m = obj.m; X = new int[n * m];
        Copy(obj.X, n, m, obj.X);
        cout << "Конструктор копии сработал" << endl;
    }
    ~Matr()
    {
        delete[] X;
        cout << "\nСработал деструктор" << endl;
    }
 
    friend void FormMatr(int*, int, int); //Друзья функции для класса
 
    friend void PrintMatr(int*, int, int);
 
    friend int GetMax(int*, int, int);
 
    friend int GetSum(int*, int, int, int&);
 
    friend void Copy(int* , int, int, int* );
 
    friend void move(int*, int, int, int);
 
    void PrintAll() //Печать матриц 
    {
        cout << "Размерность матрицы:" << endl; cout << "n= " << n << " m= " << m << endl; PrintMatr(X, n, m);
    }
 
    Matr& operator =(const Matr& obj) //ОПЕРАТОР ПРИСВАИВАНИЯ
    {
        if (this == &obj)
            return *this;
        cout << "Сработал оператор присваивания" << endl;
        n = obj.n;
        m = obj.m;
        free(X);
        X = new int[n * m];
        Copy(obj.X, n, m, obj.X);
        return *this;
    }
 
    int operator ~()
    {
        cout << "Операция ~ " << endl;
        int ReturnSum;
        GetSum(X, n, m, ReturnSum);
        return ~ReturnSum;
    }
    int operator > (Matr& obj) //Оператор нахождения минимального элемента (У матриц А и Б находятся макс. элементы, из низ выбирается минимальный)
    {
        cout << "\nОперация >" << endl;
        int Max1, Max2;
        int Min_Max;
        Max1 = GetMax(this->X, this->n, this->m);
        Max2 = GetMax(obj.X, obj.n, obj.m);
        if (Max1 < Max2)
        {
            Min_Max = Max1;
        }
        else   Min_Max = Max2;
        return Min_Max;
    }
    Matr operator >> (int K) //Оперратор сдвига матрицы А на К позиций
    {
        cout << "Операция >> \n" << endl;
        move(X, n, m, K);
        return *this;
    }
};
void main()
{
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");
    Matr A(5, 5), B(5, 5), C(5, 5);
    Matr A1, A2;
    int K;
    cout << "Матрица А" << endl;
    A.PrintAll();
    cout << endl;
    cout << "Матрица В" << endl;
    B.PrintAll();
    cout << endl;
    cout << "Матрица С" << endl;
    C.PrintAll();
    cout << endl;
    K = ~C;
    cout << "Побитово инвертированное значение суммы матрицы С = " << K << endl << endl;
    cout << "Сдвиг матрицы А на К значений " << endl;
    if (K > 0)
    {
        A1 = A >> K; //Новая матрица А1 = сдвинутой матрице А на К позиций (К= побитово-инвертированному значению матрицы С)
        A1.PrintAll();
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    K = A > B;
    cout << "Минимальный элемент из двух максимальных элементов матриц = " << K << endl;
    cout << "Сдвиг матрицы А1 на К значений\n" << endl;
    if (K > 0)
    {
        A2 = A1 >> K; //Новая матрица А2 = сдвинутой матрицы А1 на К позиций (К= минимальному элементу)
        A2.PrintAll();
    }
    else { cout << "Сдвиг невозможен, значение K отрицательное" << endl; }
    system("pause");
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 20:02
Цитата Сообщение от superbest Посмотреть сообщение
Всё равно одно и тоже, может, я что-то не так вызываю?
А оно у тебя скомпилировалось?

Добавлено через 1 минуту
Подозреваю, ты всё время запускал свой первый вариант

Добавлено через 1 минуту
friend void Copy(int* , int, int, const int* )
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 20:02  [ТС]
Да, но числа в новой матрице, оно выводит такие:
Миниатюры
Вызов исключения при копировании матрицы  
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 20:04  [ТС]
Поставил новую функцию: friend void Copy(int* , int, int, const int* ), выводит тоже самое

Добавлено через 1 минуту
Я заметил, что после конструктора копии, у меня вызывается деструктор, может проблема в этом? А после деструктора операция присваивания, но по-идее присваивать то нечего
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.06.2020, 20:10
Цитата Сообщение от superbest Посмотреть сообщение
Поставил новую функцию: friend void Copy(int* , int, int, const int* ), выводит тоже самое
C++
1
2
3
4
5
    Matr()
    {
        n = 0; m = 0;
        X = nullptr;
    }
Добавлено через 40 секунд
Цитата Сообщение от superbest Посмотреть сообщение
cout << "Сработал оператор присваивания" << endl;
        n = obj.n;
        m = obj.m;
        free(X);
        X = new int[n * m];
delete[] X, а не free
0
1 / 1 / 1
Регистрация: 27.12.2018
Сообщений: 153
16.06.2020, 20:13  [ТС]
Тож самое выводит, пустой массив
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2020, 20:13
Помогаю со студенческими работами здесь

Ошибка: Вызов исключения
В общем проблема такая: при компиляции программы выдает ошибку &quot;Вызов исключения&quot; В функции void reverse 95-я строчка Суть программы...

Вызов исключения в программе
Здравствуйте, имеется код, для создания стека, введения его размера и удаления чисел меньше среднего числа остальных чисел с последующим...

Вызов странного исключения в процессе отладке
Во время написание программы(точнее в процессе её отладке) возникла очень странная проблема. Вызывается странное исключение(текст...

Проверка входных данных: вызов и обработка исключения
Всем привет. Не могу разобраться с проверкой входных данных. Нужно чтобы если я ввел какой либо символ вместо числа возбуждалось...

Как избавиться от исключения “вызов функции PInvoke разбалансировал стек”
Пытаюсь написать код для управления машинкой Formula Allcode. Управление осуществляется путем вызова функций из dll файла. Функции...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru