С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927

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

08.04.2013, 22:33. Показов 2031. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.04.2013, 22:33
Ответы с готовыми решениями:

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

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

Непонятная ошибка
Исходник: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { char *p; char str; *p = str; ...

27
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 23:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от metaluga145 Посмотреть сообщение
Но у меня по завершению программы (при возврате ссылки)
Что из этого можно понять? Какой ссылки, где ссылка, на что ссылка? Если бы я задал вам такой вопрос?

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

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

Спасибо за помощь. Вопросов пока что больше нет!
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2013, 00:14
Конструктор копий может вызываться ведь не только в методах, которые вы перегрузили, но и в других случаях. Поэтому, по ссылке вы возвращаете, или не по ссылке, но, если есть поля с указателями, нужно создавать конструктор для глубокого копирования.
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
10.04.2013, 00:19  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
конструктор для глубокого копирования.
Что значит "глубокое копирование"?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2013, 00:39
Есть неявный конструктор копирования (конструктор поверхностного копирования), который предоставляется по умолчанию, если неопределён явный. Он просто копирует поля класса. Во многих случаях, этого вполне достаточно. Это всё похоже на работу явного и неявного операторов присваивания. В вашем коде задаётся явный оператор присваивания (по той же причине). Если бы работал неявный, то это выглядело бы так:

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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.04.2013, 01:53
Если код немного изменить, то можно увидеть, где что срабатывает:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2013, 01:53
Помогаю со студенческими работами здесь

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

Непонятная ошибка
Здравствуйте, есть код, в котором два раза выполняется одна и та же последовательность, первый раз выполняется без ошибок, во второй раз...

непонятная ошибка
Почему здесь выбивает ошибку? Помогите последнюю лабу сделать) if (x&lt;(*Node)-&gt;l) Add(x,&amp;(*Node)-&gt;l); #include...

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru