Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
#1

Непонятная для меня ошибка - C++

08.04.2013, 22:33. Просмотров 858. Ответов 27
Метки нет (Все метки)

Доброго времени суток. Во время выполнения оператора присваивания вылетает ошибка "Access violation", происходит это в месте обращения к элементу массива переменной input (см. код). Если просто посмотреть что находится в массиве, то там вместо чего-то вразумительного находится "CXX0030: Error: expression cannot be evaluated".
Что это может значить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class matrix
{
public:
    matrix(int,int);
    ~matrix(void);
    int columns;//кол столбиков
    int rows;//кол строк
    double **mat;//сама матрица
    //double det(void);
    //matrix inverse(void);//нахождение обратной
    matrix transpon(void);
    void transpon_this(void);
    matrix operator=(const matrix &);//оператор присваивания
    matrix operator+(const matrix &);//оператор сложения
    matrix operator-(const matrix &);//оператор вычитания
    matrix operator*(const matrix &);//оператор умножения матриц
    bool operator==(const matrix &);//оператор сравнения
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
matrix matrix::operator=(const matrix &input)
{
    for (int i=0; i<rows;++i)
        delete [] mat[i];
    delete [] mat;
 
    rows=input.rows;
    columns=input.columns;
    mat=new double*[rows]; 
    for (int i=0;i<rows;++i)
        mat[i]=new double[columns];
 
    for (int i=0;i<rows;++i)
        for(int j=0;j<columns;++j)
            mat[i][j]=input.mat[i][j];
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
10
11
matrix matrix::operator+(const matrix & rightmatrix)
{
    if ((rows==rightmatrix.rows)&&(columns==rightmatrix.columns))
    {
        matrix temp(rows,columns);
        for (int i=0;i<rows;++i)
            for (int j=0;j<columns;++j)
                temp.mat[i][j]=mat[i][j]+rightmatrix.mat[i][j];
        return temp;
    } else return(matrix(0,0));
}
И как вообще правильно оформлять такие классы по канонам ООП?(если не сложно пример кода или ссылку на верный путь)

Спасибо всем ответившим!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 22:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятная для меня ошибка (C++):

непонятная для меня ошибка прошу объяснить знающих людей - C++
Я обращаюсь с проблемой во вроде бы рабочей программе. Задача была построить программу с сортировкой массивов методами пузырька и шейкера....

Неизвестная (для меня) ошибка в коде! - C++
Выпадает вот такая ошибка в коде программы: Вот код: #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace...

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

Непонятная ошибка - C++
Вообщем имеется такой код: // главная программа aka programm.cpp #include &quot;Sales_item.h&quot; using namespace std; ...

непонятная ошибка - C++
Начал изучать с++. Все шло хорошо, но потом я столкнулся с проблемой, использовал bass.lib и bass.h. при компиляции выходит такая...

непонятная ошибка - C++
Здравствуйте. Вот в этой программе у меня пишет ошибку: cpp(60) : error C2065: 'j_max' : undeclared identifier. Хотя если вместо Y...

27
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.04.2013, 19:42  [ТС] #16
alsav22, можно как-то более удобно связаться?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 19:47 #17
Вот мой ворос:

Цитата Сообщение от alsav22 Посмотреть сообщение
Т.е., такой код вызывает ошибку?
Вот ваш ответ:

Цитата Сообщение от metaluga145 Посмотреть сообщение
alsav22, да
Теперь оказывается вы какой-то свой код пробуете?
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.04.2013, 19:50  [ТС] #18
alsav22, я не вижу отличий в коде, кроме мною написанного деструктора. Извиняюсь, что не заметил раньше его отсутствие.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 20:18 #19
Цитата Сообщение от metaluga145 Посмотреть сообщение
alsav22, я не вижу отличий в коде, кроме
Это и есть отличие... Явный конструктор копирования нужно добавить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
matrix(const matrix &obj)
{
    rows = obj.rows;
    columns = obj.columns;
    mat = new double*[rows]; 
    for (int i = 0; i < rows; ++i)
        mat[i] = new double[columns];
 
    for (int i = 0; i < rows; ++i)
        for(int j = 0; j < columns; ++j)
            mat[i][j] = obj.mat[i][j];
}
1
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.04.2013, 23:26  [ТС] #20
Спасибо, я попробую! Тогда у меня еще один вопрос касающийся этой темы. Я читал,что правильно оформлять операторы,которые возвращают ссылку, а не значение. Но у меня по завершению программы (при возврате ссылки) вылазит ошибка(скрин прилагается).
Простите за тупые вопросы, но уж очень хочу научиться
0
Миниатюры
Непонятная для меня ошибка  
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 23:37 #21
Цитата Сообщение от metaluga145 Посмотреть сообщение
Но у меня по завершению программы (при возврате ссылки)
Что из этого можно понять? Какой ссылки, где ссылка, на что ссылка? Если бы я задал вам такой вопрос?

Добавлено через 2 минуты
Цитата Сообщение от metaluga145 Посмотреть сообщение
Я читал,что правильно оформлять операторы,которые возвращают ссылку, а не значение.
Где читали? Тоже хочу почитать...
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.04.2013, 23:43  [ТС] #22
alsav22, прошу прощения. очяпятка. не "при возврате ссылки", а "перед закрытием окна", то есть после выполнения system("pause").
Где конкретно не скажу, ибо брожу по сайтам с гугла. Аргументация в пользу ссылки была такой:"лишний раз не вызывается конструктор копирования, соответственно экономим время". На сколько этот аргумент правилен я оценить не могу, но то,что действительно не вызывается конструктор копирования, знаю точно. Сам проверял в другом проекте.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 23:56 #23
Цитата Сообщение от metaluga145 Посмотреть сообщение
Аргументация в пользу ссылки была такой:"лишний раз не вызывается конструктор копирования, соответственно экономим время"
Всё зависит от конкретного кода. Если в классе есть поля с указателями, то без явного конструктора копий не обойтись. У вас, в операторе +, возвращается копия локального объекта. А если бы был возврат по ссылке? Что дальше делать со ссылкой на объект, который исчезает при выходе из метода?

Добавлено через 3 минуты
Цитата Сообщение от metaluga145 Посмотреть сообщение
alsav22, прошу прощения. очяпятка. не "при возврате ссылки", а "перед закрытием окна", то есть после выполнения system("pause").
На вопрос не ответили. Какая ссылка, где ссылка, на что ссылка? Где код изменили, покажите...
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.04.2013, 00:08  [ТС] #24
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё зависит от конкретного кода. Если в классе есть поля с указателями, то без явного конструктора копий не обойтись. У вас, в операторе +, возвращается копия локального объекта. А если бы был возврат по ссылке? Что дальше делать со ссылкой на объект, который исчезает при выходе из метода?
Я тоже задумывался над вопросом "что же делать со ссылкой на объект, который исчезает при выходе из метода?". Только теперь до меня дошло,что будет происходить в памяти.
Цитата Сообщение от alsav22 Посмотреть сообщение
На вопрос не ответили. Какая ссылка, где ссылка, на что ссылка? Где код изменили, покажите...
Вопрос про ссылку снимаю, ибо уже понял что за ошибка.

Спасибо за помощь. Вопросов пока что больше нет!
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2013, 00:14 #25
Конструктор копий может вызываться ведь не только в методах, которые вы перегрузили, но и в других случаях. Поэтому, по ссылке вы возвращаете, или не по ссылке, но, если есть поля с указателями, нужно создавать конструктор для глубокого копирования.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.04.2013, 00:19  [ТС] #26
Цитата Сообщение от alsav22 Посмотреть сообщение
конструктор для глубокого копирования.
Что значит "глубокое копирование"?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2013, 00:39 #27
Есть неявный конструктор копирования (конструктор поверхностного копирования), который предоставляется по умолчанию, если неопределён явный. Он просто копирует поля класса. Во многих случаях, этого вполне достаточно. Это всё похоже на работу явного и неявного операторов присваивания. В вашем коде задаётся явный оператор присваивания (по той же причине). Если бы работал неявный, то это выглядело бы так:

C++
1
2
3
4
5
6
7
8
matrix matrix::operator=(const matrix &input)
{
    rows = input.rows;
    columns = input.columns;
    mat = input.mat; 
    
    return *this;
}
Это и есть поверхностное присваивание. Для rows и columns это вполне подходит, а для mat - нет. Присваиваеся (или копируется) просто указатель, а не то, на что он ссылается.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.04.2013, 01:53 #28
Если код немного изменить, то можно увидеть, где что срабатывает:
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
#include <iostream>
#include <string>
using namespace std;
 
class matrix
{
public:
    matrix(int rows, int columns)
    {
         cout << "K" << endl;
        
        matrix::rows=rows;
        matrix::columns=columns;
        mat=new double*[rows]; 
        for (int i=0;i<rows;++i)
            mat[i]=new double[columns];
    }
    
    matrix(const matrix &obj)
    {
         cout << "cpy" << endl;
        
        rows = obj.rows;
        columns = obj.columns;
        mat = new double*[rows]; 
        for (int i = 0; i < rows; ++i)
            mat[i] = new double[columns];
 
        for (int i = 0; i < rows; ++i)
            for(int j = 0; j < columns; ++j)
                mat[i][j] = obj.mat[i][j];
    }
    
    ~matrix()
    {
         cout << "~" << endl;
        for (int i = 0; i < rows; ++i)
            delete [] mat[i];
        delete [] mat;
    }
    
    int rows;//кол строк
    int columns;//кол столбиков
    
    double **mat;//сама матрица
    //double det(void);
    //matrix inverse(void);//нахождение обратной
    matrix transpon(void);
    void transpon_this(void);
    matrix operator=(const matrix &);//оператор присваивания
    matrix operator+(const matrix &);//оператор сложения
    //matrix operator-(const matrix &);//оператор вычитания
    //matrix operator*(const matrix &);//оператор умножения матриц
    //bool operator==(const matrix &);//оператор сравнения
};
 
matrix matrix::operator=(const matrix &input)
{
    cout << "=" << endl;
    
    for (int i=0; i<rows;++i)
        delete [] mat[i];
    delete [] mat;
 
    rows=input.rows;
    columns=input.columns;               
    mat=new double*[rows]; 
    for (int i=0;i<rows;++i)
        mat[i]=new double[columns];
 
    for (int i=0;i<rows;++i)
        for(int j=0;j<columns;++j)
            mat[i][j]=input.mat[i][j];
    return *this;
}
 
matrix matrix::operator+(const matrix & rightmatrix)
{
     cout << "+" << endl;
    if ((rows==rightmatrix.rows)&&(columns==rightmatrix.columns))
    {
        matrix temp(rows,columns);
        for (int i=0;i<rows;++i)
            for (int j=0;j<columns;++j)
                temp.mat[i][j]=mat[i][j]+rightmatrix.mat[i][j];
        return temp;
    } else return(matrix(0,0));
}
 
int main()
{
    {
        matrix a(1,1), b(1,1), c(0,0);
        a.mat[0][0] = 3;
        b.mat[0][0] = 7;
        c = a + b;
    
        for (int i = 0; i < c.rows; ++i)
            for (int j = 0; j < c.columns; ++j)
                cout << c.mat[i][j] << ' ';
        cout << endl;
    }
    
     
    system("pause");
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 01:53
Привет! Вот еще темы с ответами:

Непонятная ошибка - C++
Всем привет! Вообщем вот функция, которая переводит двоичное число в десятичное, + ещё пару кусков кода, чтобы было понятно, что и откуда...

Непонятная ошибка - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class CMessage { private: char *Text; char...

Непонятная ошибка - C++
Добрый день. Переделывал код http://www.cyberforum.ru/cpp-beginners/thread53080.html под свои нужды. Немогу понять в чём ошибка. Заранее...

непонятная ошибка - C++
#include &lt;stdio.h&gt; #include &lt;math.h&gt; main() { float x,pi,s,e,q,n; pi=3.14 ; x= pi/6 ; e=0,0001; s=0 ;


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

Или воспользуйтесь поиском по форуму:
28
Yandex
Объявления
11.04.2013, 01:53
Ответ Создать тему
Опции темы

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