Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 11
1

Оператор "+", который должен суммировать 2 массива 2-х классов, выдает ошибку доступа

06.11.2014, 21:03. Показов 1085. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Все же не могу понять причину этого...
Вот код:
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
#include <iostream> 
#include<ctime>
#include<stdio.h>
#include<locale.h>
#include <windows.h>
#include <conio.h>
#include<iomanip>
#include <cstring>
class Matrix
{
    int ** m;
    int s1; 
    int s2;
public:
    Matrix()
    {
        s1=3 ; s2 = 3;
        m=new int*[s1];
        srand(time(NULL));
        for(int i=0; i<s1;i++)
        {
            m[i]=new int;
            for(int j=0; j<s2; j++)m[i][j]=rand()%100-50;
            
        }
    }
    ~Matrix()
    {
        delete[]m;
    }
    void show()
    {
        for(int i=0; i<s1;i++)
        {
            for(int j=0; j<s2; j++)cout<<m[i][j]<<"\t";
            cout<<endl;
        }
        
    }
    
    void operator()(int ** m,int s1,int s2)
    {
        this->s1=s1;    this->s2=s2; this->m=m;
    }
    void  memory(int s1,int s2)
    {
        this->s1=s1;    this->s2=s2;
        this->m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            this->m[i]=new int;
            for(int j=0; j<s2; j++)m[i][j]=0;
            
        }
    }
    int s(bool a)
    {
        if(a==0)return this->s1;
        else return this->s2;
    }
    Matrix operator +(const Matrix&F)
    {
        Matrix tmp;
        int s2_tmp;
        if(this->s2>F.s2)s2_tmp=this->s2;
        else s2_tmp=F.s2;
        int s1_tmp=this->s1+F.s1;
        tmp.memory(s1_tmp,s2_tmp);
        for(int i=0; i < s1; i++)
        {
            for(int j=0; j < s2; j++)tmp.m[i][j]=this->m[i][j];
        }
        for(int i=s1; i < s1_tmp; i++)
        {
            for(int j=0; j < F.s2; j++)tmp.m[i][j]=F.m[i][j];   //Ошибку выдает здесь
        }
        return tmp;
    }
 
 
 
 
};
 
int main()
{
 
    Matrix a,b,c;
    a.show();
    c=a+b;
    c.show();
    while(1);
    return 0;
}
Добавлено через 25 минут
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
#include <iostream> 
#include<ctime>
#include<stdio.h>
#include<locale.h>
#include <windows.h>
#include <conio.h>
#include<iomanip>
#include <cstring>
class Matrix
{
    int ** m;
    int s1; 
    int s2;
public:
    Matrix()
    {
        s1=3 ; s2 = 3;
        m=new int*[s1];
        srand(time(NULL));
        for(int i=0; i<s1;i++)
        {
            m[i]=new int;
            for(int j=0; j<s2; j++)m[i][j]=rand()%100-50;
            
        }
    }
    ~Matrix()
    {
        delete[]m;
    }
    void show()
    {
        for(int i=0; i<s1;i++)
        {
            for(int j=0; j<s2; j++)cout<<m[i][j]<<"\t";
            cout<<endl;
        }
        
    }
    
    void operator()(int ** m,int s1,int s2)
    {
        this->s1=s1;    this->s2=s2; this->m=m;
    }
    void  memory(int s1,int s2)
    {
        this->s1=s1;    this->s2=s2;
        this->m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            this->m[i]=new int;
            for(int j=0; j<s2; j++)m[i][j]=0;
            
        }
    }
    
    Matrix operator +(const Matrix&F)
    {
        Matrix tmp;
        int s2_tmp;
        if(this->s2>F.s2)s2_tmp=this->s2;
        else s2_tmp=F.s2;
        int s1_tmp=this->s1+F.s1;
        tmp.memory(s1_tmp,s2_tmp);
        for(int i=0; i < s1; i++)
        {
            for(int j=0; j < s2; j++)tmp.m[i][j]=this->m[i][j];
        }
        for(int i=s1; i < s1_tmp; i++)
        {
            for(int j=0; j < F.s2; j++)tmp.m[i][j]=F.m[i-s1][j];//добавил -s1
        }
        return tmp;
    }
 
 
 
 
};
int main()
{
 
    Matrix a,b,c;
    a.show();
    c=a+b;
    c.show();
    while(1);
    return 0;
}
Несмотря на это исправление, все равно ошибка
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2014, 21:03
Ответы с готовыми решениями:

Создать оператор, который будет суммировать объекты класса
Есть класс поля которого это &quot;название&quot; и &quot;лист&quot;, нужно создать оператор который будет сумировать...

Почему не работает условный оператор который по идее должен работать
Здравствуйте есть такой код . Суть в том что человек вводит команду Казино программа проверяет...

При заполнении двумерного динамического массива выдает ошибку "нарушения прав доступа"
#include&lt;iostream&gt; using namespace std; int main() { int sizeC, sizeS; cout &lt;&lt;...

Номер телефона возвращает null и выдает ошибку. хотя не должен
Добрый день! Делал валидацию для номера телефона, использовал switch case и метод match(), для...

5
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
06.11.2014, 21:29 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
34
35
36
37
Matrix(const Matrix& copy)
    {
        s1=copy.s1; 
        s2 = copy.s2;
        m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            m[i]=new int[s2];
            for(int j=0; j<s2; j++)
                m[i][j]=copy.m[i][j];
        }
    }
 
    Matrix& operator=(const Matrix& copy)
    {
        if(this == &copy)
            return *this;
 
        if(m)
        {
            for(int i=0; i<s1;i++)
                if(m[i])
                    delete m[i];
 
            delete[] m;
        }   
 
        s1=copy.s1; s2 = copy.s2;
        m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            m[i]=new int[s2];
            for(int j=0; j<s2; j++)
                m[i][j]=copy.m[i][j];
        }
 
    }
И деструктор поменять:
C++
1
2
3
4
5
6
7
8
9
10
11
12
~Matrix()
    {
        if(m)
        {
            for(int i=0; i<s1;i++)
            {
                if(m[i])
                    delete m[i];
            }
            delete[] m;
        }       
    }
0
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 11
06.11.2014, 21:37  [ТС] 3
А в ответ на такие действие мне вот какой ответ
 Комментарий модератора 
Загружайте изображения на форум (в расширенном режиме через менеджер вложений).

https://pp.vk.me/c625718/v6257... Nm8mbY.jpg
https://pp.vk.me/c625718/v6257... n61utk.jpg
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
06.11.2014, 21:41 4
Лучший ответ Сообщение было отмечено Radonl-9 как решение

Решение

Вот полный мой код, может что-то еще я исправил.
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream> 
#include<ctime>
#include<stdio.h>
#include<locale.h>
#include <windows.h>
#include <conio.h>
#include<iomanip>
#include <cstring>
 
using namespace std;
class Matrix
{
    int ** m;
    int s1; 
    int s2;
public:
    Matrix(const Matrix& copy)
    {
        s1=copy.s1; 
        s2 = copy.s2;
        m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            m[i]=new int[s2];
            for(int j=0; j<s2; j++)
                m[i][j]=copy.m[i][j];
        }
    }
 
    Matrix& operator=(const Matrix& copy)
    {
        if(this == &copy)
            return *this;
 
        if(m)
        {
            for(int i=0; i<s1;i++)
                if(m[i])
                    delete m[i];
 
            delete[] m;
        }   
 
        s1=copy.s1; s2 = copy.s2;
        m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            m[i]=new int[s2];
            for(int j=0; j<s2; j++)
                m[i][j]=copy.m[i][j];
        }
 
    }
    Matrix()
    {
        s1=3 ; s2 = 3;
        m=new int*[s1];
        srand(time(NULL));
        for(int i=0; i<s1;i++)
        {
            m[i]=new int[s2];
            for(int j=0; j<s2; j++)m[i][j]=rand()%100-50;
 
        }
    }
    ~Matrix()
    {
        if(m)
        {
            for(int i=0; i<s1;i++)
            {
                if(m[i])
                    delete m[i];
            }
            delete[] m;
        }       
    }
    void show()
    {
        for(int i=0; i<s1;i++)
        {
            for(int j=0; j<s2; j++)cout<<m[i][j]<<"\t";
            cout<<endl;
        }
 
    }
 
    void operator()(int ** m,int s1,int s2)
    {
        this->s1=s1;    this->s2=s2; this->m=m;
    }
    void  memory(int s1,int s2)
    {
        this->s1=s1;    this->s2=s2;
        this->m=new int*[s1];
        for(int i=0; i<s1;i++)
        {
            this->m[i]=new int[s2];
            for(int j=0; j<s2; j++)m[i][j]=0;
 
        }
    }
    int s(bool a)
    {
        if(a==0)return this->s1;
        else return this->s2;
    }
    Matrix operator +(const Matrix&F)
    {
        Matrix tmp;
        int s2_tmp;
        if(this->s2>F.s2)s2_tmp=this->s2;
        else s2_tmp=F.s2;
        int s1_tmp=this->s1+F.s1;
        tmp.memory(s1_tmp,s2_tmp);
        for(int i=0; i < s1; i++)
        {
            for(int j=0; j < s2; j++)tmp.m[i][j]=this->m[i][j];
        }
        for(int i=s1; i < s1_tmp; i++)
        {
            for(int j=0; j < F.s2; j++)tmp.m[i][j]=F.m[i-s1][j];   //Ошибку выдает здесь
        }
        return tmp;
    }
 
 
 
 
};
 
int main()
{
 
    Matrix a,b,c;
    a.show();
    cout << endl;
    b.show();
    cout << endl;
    c=a+b;
    c.show();
    while(1);
    return 0;
}
1
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 11
06.11.2014, 21:44  [ТС] 5
Спасибо большое!!!
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
06.11.2014, 21:46 6
Почитай про правило трех.
1
06.11.2014, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2014, 21:46
Помогаю со студенческими работами здесь

Оператор условий выдает ошибку
var Form1: TForm1; b,a:string; n:Integer; implementation {$R *.dfm} procedure...

Условный оператор IF (компилятор выдает ошибку)
Добрый день! Помогите, пожалуйста, подправить синтаксис. Компилятор выдает ошибку на 9 линии на...

Запрос! (выдает ошибку отсутствует оператор)
Помогите пожалуйста с проблемой! Имеется база данных &quot;Складской учет&quot;. На форме создания нового...

Немогу перегрузить оператор, выдает ошибку
при попытке f = d - e выдает ошибку no match for 'operator=' не могу понять в чем проблема ...

Выдает ошибку на массив объекта классов
Компилятор выдает ошибку на массив объекта класса. Почему? class Basket { private: ...

Оператор сравнения выдает ошибку Type mismatch
Есть три ячейки в столбце. Содержат символы: -, 0, - . Имеют тип string Условие If ((Cells(NumR,...

Оператор for: найти сумму n элементов ряда (выдает ошибку)
Для заданного ряда необходимо найти сумму N элементов ряда (с использованием оператора FOR....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru