Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57

Ошибка этапа исполнения в классе Матрица

04.03.2015, 19:03. Показов 1323. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет снова!)
Теперь я написала код по задаче, которая гласит: "у вас есть два класса -один одномерный массив, другой матрица. Вы должны вывести строки матрицы, элементы которой принадлежат массиву.Реализовать через дружественные функции"
тк не указан вид матрицы, то для начала взяла самый простой-квадратную. Вроде бы написала, даже комплится без ошибок. Но почему то на сайте https://ideone.com пишет ошибку выполнения. Может, кто сможет помочь и укажет на причины. Буду весьма благодарна
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
//Mas and matrix. Find and print the number of strings, that consist
//one of mas' element.Both of them are in the different classes
#include <iostream>
#include <cstring> //strcpy
#include <cstdio> //для gets
using namespace std;
 
class MATRIX;
class mas
{
    int n;
    int *a;
public:
    mas(int x){
        n=x;
        cout<<"Constructor mas"<<endl;
        a= new int[n];
    }
    virtual ~mas(){
        cout<<"Destructor mas"<<endl;
            delete[] a;
    }
    void input_mas();
    friend void fout(mas,MATRIX);
};
 
class MATRIX
{
    int k;
    int **dArray;
public:
    MATRIX(int y){ //предполагаю,что мтарица квадратная для простоты написания кода
        k=y;
        cout<<"Constructor MATRIX"<<endl;
        dArray = new int *[k];
        for(int i=0;i<k;i++){
            dArray[i]=new int[k];
        }
    }
    virtual ~MATRIX(){
        for(int i=0; i<k;i++){
            delete[] dArray[i];
        }
        delete[] dArray;
    }
    void input_MATRIX();
    friend void fout(mas,MATRIX);
};
 
void mas:: input_mas(){
    for(int i=0;i<n;i++){
        cout<<"Input the value of element of mas"<<endl;
        cin>>a[i];
    }
}
 
void MATRIX:: input_MATRIX(){
    for(int i=0;i<k;i++)
        for(int j=0;j<k;j++){
            cout<<"Input the value of element of MATRIX"<<endl;
            cin>>dArray[i][j];
        }
}
 
void fout(mas f, MATRIX q){
    for(int j=0;j<q.k;j++)
        for(int p=0;p<q.k;p++){
            int i=0;
            while(i<=f.n){
                if(q.dArray[p][j] == f.a[i]) cout<<j<<endl;
                i++;
            }
        }
}
 
int main()
{
    int len, d;
    cout<<"Enter the size of mas"<<endl;
    cin>>len;
    mas A(len);
    A.input_mas();
    cout<<"Enter the size of MATRIX"<<endl;
    cin>>d;
    MATRIX M(d);
    M.input_MATRIX();
    fout(A,M);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2015, 19:03
Ответы с готовыми решениями:

Ошибка этапа исполнения
Доброго времени суток! Хочу разобраться с ошибкой, буду благодарна за помощь) Вот код функции: void addCard ( sDeck* oldDeck,...

Ошибка этапа исполнения
Всем доброго времени суток! Пытаюсь решить вот эту задачу: В ряд выложены N кучек камней, в i-ой из которых было Qi камней. В любой...

Ошибка этапа исполнения - переполнение стека
Помогите пожалуйста C++ написала программу она правильно работает, но при каждом запуске она выкидывает окно переполнение стека...

10
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 19:11
Лучший ответ Сообщение было отмечено Lokomoss как решение

Решение

Цитата Сообщение от Lokomoss Посмотреть сообщение
Но почему то на сайте https://ideone.com пишет ошибку выполнения. Может, кто сможет помочь и укажет на причины. Буду весьма благодарна
Конструктор копирования классу напиши. Который бы корректно копировал внутренний массив.
Сейчас у тебя получается копия объекта MATRIX при передаче в метод fout. Две копии, каждая указывает на одни и те же массивы (по-умолчанию там скопировались просто адреса). Ну и потом двойной delete на один и тот же адрес, по одному на каждый деструктор - дает ошибку выполнения.

Добавлено через 2 минуты
Точнее там одинаковая ситуация для обоих классов. Обоим нужны конструкторы копирования, либо в метод fout их нужно передавать по ссылке, чтобы избежать копирования. А само копирование тогда лучше явно запретить.
0
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57
04.03.2015, 19:12  [ТС]
но MATRIX это многомерный массив, я сначала должна удалить строки,а потом элемент,или нет? конструктор копирования написать только для MATRIX?
и да- спасибо)
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
04.03.2015, 19:12
Лучший ответ Сообщение было отмечено Lokomoss как решение

Решение

Цитата Сообщение от Lokomoss Посмотреть сообщение
void fout(mas f, MATRIX q){
Вы передаете значения f и q в функцию по значению.
Значит, передается копия переменных A и M.
А где копиконструкторы?
Чтобы не делать таких ошибок неукоснительно следуйте
Правилу трех
0
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57
04.03.2015, 19:14  [ТС]
Какие тут все милаши^^
Спасибо. Это просто третье занятие по с++, но огромное спасибо за критику такую
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 19:19
Цитата Сообщение от Lokomoss Посмотреть сообщение
конструктор копирования написать только для MATRIX?
Для обоих классов. Я выше дополнил.
Может быть как-то так:
C++
1
2
3
4
5
6
7
8
9
    MATRIX(MATRIX const & x)
      : k(x.k)
      , dArray(new int *[k])
    {
        for(int i = 0; i < k; i++){
            dArray[i] = new int[k];
            memcpy(dArray[i], x.dArray[i], k);
        }
    }
0
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57
04.03.2015, 19:28  [ТС]
C++
1
2
3
4
5
6
MATRIX(const MATRIX& x):k(x.k){
        dArray= new int [x.k];
        for(int i=0;i<x.k;i++)
            for(int j=0;j<x.k;j++)
                dArray[i][j]=x.dArray[i][j];
    }
Я вот так должна написать конструктор копирования?

Добавлено через 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
//Mas and matrix. Find and print the number of strings, that consist
//one of mas' element.Both of them are in the different classes
#include <iostream>
#include <cstring> //strcpy
#include <cstdio> //для gets
using namespace std;
 
class MATRIX;
class mas
{
    int n;
    int *a;
public:
    mas(int x){
        n=x;
        cout<<"Constructor mas"<<endl;
        a= new int[n];
    }
    virtual ~mas(){
        cout<<"Destructor mas"<<endl;
            delete[] a;
    }
    mas(const mas& y):n(y.n){ //constructor of copy
        a=new int[y.n];
        for(int i=0;i<y.n;i++)
            a[i]=y.a[i];
        
    }
    void input_mas();
    friend void fout(mas,MATRIX);
};
 
class MATRIX
{
    int k;
    int **dArray;
public:
    MATRIX(int y){ //предполагаю,что мтарица квадратная для простоты написания кода
        k=y;
        cout<<"Constructor MATRIX"<<endl;
        dArray = new int *[k];
        for(int i=0;i<k;i++){
            dArray[i]=new int[k];
        }
    }
    virtual ~MATRIX(){
        for(int i=0; i<k;i++){
            delete[] dArray[i];
        }
        delete[] dArray;
    }
    MATRIX(const MATRIX& x):k(x.k){ //constructor of copy
        dArray= new int [x.k];
        for(int i=0;i<x.k;i++)
            for(int j=0;j<x.k;j++)
                dArray[i][j]=x.dArray[i][j];
    }
    void input_MATRIX();
    friend void fout(mas,MATRIX);
};
 
void mas:: input_mas(){
    for(int i=0;i<n;i++){
        cout<<"Input the value of element of mas"<<endl;
        cin>>a[i];
    }
}
 
void MATRIX:: input_MATRIX(){
    for(int i=0;i<k;i++)
        for(int j=0;j<k;j++){
            cout<<"Input the value of element of MATRIX"<<endl;
            cin>>dArray[i][j];
        }
}
 
void fout(mas f, MATRIX q){
    for(int j=0;j<q.k;j++)
        for(int p=0;p<q.k;p++){
            int i=0;
            while(i<=f.n){
                if(q.dArray[p][j] == f.a[i]) cout<<j<<endl;
                i++;
            }
        }
}
 
int main()
{
    int len, d;
    cout<<"Enter the size of mas"<<endl;
    cin>>len;
    mas A(len);
    A.input_mas();
    cout<<"Enter the size of MATRIX"<<endl;
    cin>>d;
    MATRIX M(d);
    M.input_MATRIX();
    fout(A,M);
    return 0;
}
вот сейчас это то,что нужно?

Добавлено через 2 минуты
но он все равно пишет ошибку выполнения
C++
1
dArray= new int *[x.k];
(в конструкторе копирования подредактировала)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 19:47
Цитата Сообщение от Lokomoss Посмотреть сообщение
но он все равно пишет ошибку выполнения
Смотри мой предыдущий пример.

Добавлено через 9 минут
Цитата Сообщение от Lokomoss Посмотреть сообщение
но он все равно пишет ошибку выполнения
Если что, причина в том, что ты память выделила только для указателей, а для элементов нет. Если твой пример исправлять, то должно быть нечто такое:
C++
1
2
3
4
5
6
7
8
9
    MATRIX(const MATRIX& x):k(x.k){ //constructor of copy
        dArray= new int* [x.k];
        for(int i=0;i<x.k;i++)
        {
            dArray[i] = new int[x.k];
            for(int j=0;j<x.k;j++)
                dArray[i][j]=x.dArray[i][j];
        }
    }
1
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57
04.03.2015, 21:36  [ТС]
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
//Mas and matrix. Find and print the number of strings, that consist
//one of mas' element.Both of them are in the different classes
#include <iostream>
#include <cstring> //strcpy
#include <cstdio> //для gets
using namespace std;
 
class Matrix;
class Array
{
    int n;
    int *a;
public:
    Array(int x){
        n=x;
        cout<<"Constructor Array"<<endl;
        a= new int[n];
    }
    virtual ~Array(){
        cout<<"Destructor Array"<<endl;
            delete[] a;
    }
    Array(const Array& y):n(y.n){ //constructor of copy
        a=new int[y.n];
        for(int i=0;i<y.n;i++)
            a[i]=y.a[i];
        
    }
    void input_mas();
    friend void fout(Array,Matrix);
};
 
class Matrix
{
    int k;
    int z;
    int **dArray;
public:
    Matrix(int y,int x){ //предполагаю,что мтарица квадратная для простоты написания кода
        k=y;
        z=x;
        cout<<"Constructor Matrix"<<endl;
        dArray = new int *[k];
        for(int i=0;i<k;i++){
            dArray[i]=new int[z];
        }
    }
    virtual ~Matrix(){
        for(int i=0; i<k;i++){
            delete[] dArray[i];
        }
        delete[] dArray;
    }
    Matrix(const Matrix& x):k(x.k),z(x.z){ //constructor of copy
        dArray= new int *[x.k];
        for(int i=0;i<x.k;i++){
            dArray[i]= new int[x.k];
            for(int j=0;j<x.z;j++)
                dArray[i][j]=x.dArray[i][j];
        }
    }
    void input_MATRIX();
    friend void fout(Array,Matrix);
};
 
void Array:: input_mas(){
    for(int i=0;i<n;i++){
        cout<<"Input the value of element of Array"<<endl;
        cin>>a[i];
    }
}
 
void Matrix:: input_MATRIX(){
    for(int i=0;i<k;i++)
        for(int j=0;j<z;j++){
            cout<<"Input the value of element of Matrix"<<endl;
            cin>>dArray[i][j];
        }
}
 
void fout(Array f, Matrix q){
    for(int j=0;j<q.k;j++)
        for(int p=0;p<q.z;p++){
            int i=0;
            while(i<=f.n){
                if(q.dArray[p][j] == f.a[i]) cout<<j<<endl;
                i++;
            }
        }
}
 
int main()
{
    int len, d,h;
    cout<<"Enter the size of Array"<<endl;
    cin>>len;
    Array A(len);
    A.input_mas();
    cout<<"Enter the size of Matrix"<<endl;
    cin>>d>>h;
    Matrix M(d,h);
    M.input_MATRIX();
    fout(A,M);
    return 0;
}
Теперь массив прямоугольный, но это зараза все равно пишет ошибку выполнения
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 23:07
Lokomoss, внимательно проверь размерности. они у тебя не везде поправлены верно.
C++
1
2
3
4
5
6
7
8
    Matrix(const Matrix& x):k(x.k),z(x.z){ //constructor of copy
        dArray= new int *[x.k];
        for(int i=0;i<x.k;i++){
            dArray[i]= new int[x.k]; // почему тут k, когда цикл ниже по z? здесь надо x.z!
            for(int j=0;j<x.z;j++)
                dArray[i][j]=x.dArray[i][j];
        }
    }
0
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57
06.03.2015, 08:55  [ТС]
Итак, предоставляю свой итоговый(рабочий!!!!) вариант
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
//Mas and matrix. Find and print the number of strings, that consist
//one of mas' element.Both of them are in the different classes
#include <iostream>
#include <cstring> //strcpy
#include <cstdio> //для gets
using namespace std;
 
class Matrix;
class Array
{
    int n;
    int *a;
public:
    Array(int x){
        n=x;
        cout<<"Constructor Array"<<endl;
        a= new int[n];
    }
    virtual ~Array(){
        cout<<"Destructor Array"<<endl;
            delete[] a;
    }
    Array(const Array& y):n(y.n){ //constructor of copy
        a=new int[y.n];
        for(int i=0;i<y.n;i++)
            a[i]=y.a[i];
        
    }
    void input_mas();
    friend void fout(Array,Matrix);
};
 
class Matrix
{
    int k;
    int z;
    int **dArray;
public:
    Matrix(int y,int x){
        k=y;
        z=x;
        cout<<"Constructor Matrix"<<endl;
        dArray = new int *[k];
        for(int i=0;i<k;i++){
            dArray[i]=new int[z];
        }
    }
    virtual ~Matrix(){
        for(int i=0; i<k;i++){
            delete[] dArray[i];
        }
        delete[] dArray;
    }
    Matrix(const Matrix& x):k(x.k),z(x.z){ //constructor of copy
        dArray= new int *[x.k];
        for(int i=0;i<x.k;i++){
            dArray[i]= new int[x.z];
            for(int j=0;j<x.z;j++)
                dArray[i][j]=x.dArray[i][j];
        }
    }
    void input_matrix();
    friend void fout(Array,Matrix);
};
 
void Array:: input_mas(){
    for(int i=0;i<n;i++){
        cout<<"Input the value of element of Array"<<endl;
        cin>>a[i];
    }
}
 
void Matrix:: input_matrix(){
    for(int i=0;i<k;i++)
        for(int j=0;j<z;j++){
            cout<<"Input the value of element of Matrix"<<endl;
            cin>>dArray[i][j];
        }
}
 
void fout(Array f, Matrix q){
    for(int j=0;j<q.k;j++)
        for(int p=0;p<q.z;p++){
            int i=0;
            while(i<f.n){
                if(q.dArray[j][p] == f.a[i]) 
                        cout<<"The number of string of matrix, which element is consisted in array "<<(j+1)<<endl;//for human imagine
                i++;
            }
        }
}
 
int main()
{
    int len, d,h;
    cout<<"Enter the size of Array"<<endl;
    cin>>len;
    Array A(len);
    A.input_mas();
    cout<<"Enter the size of Matrix"<<endl;
    cin>>d>>h;
    Matrix M(d,h);
    M.input_matrix();
    fout(A,M);
    return 0;
}
Всем,кто помог, огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2015, 08:55
Помогаю со студенческими работами здесь

Ошибка этапа исполнения: double free or corruption (fasttop):
Доброе времени суток подскажите пожалуйста в чем может быть следующая проблема. Код который выводит программа приведен ниже. Сама...

Ошибка этапа исполнения при преобразовании символов в верхний регистр
Доброго времени суток, уважаемые пользователи CyberForum.ru! По какой то причине падает программа, прощу Вашей помощи :) void main()...

Не могу найти ошибку этапа исполнения
Здравствуйте, написал программу, не могу понять, почему при отладке VB не хочет ее запускать(вылетает) В чем может быть причина? ...

Работа с датой и временем put_time Ошибка этапа выполнения
Решил не делать велосипедов. С не кустарными способами работы с датой и временем не знаком. clang 3.7.0-3 // put_time example ...

Ошибка во время исполнения
При попытке запустить программу Visual Studio пишет: Unhandled exception at 0x011027ce in GLTore.exe: 0xC0000005: Access violation...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru