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

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

Войти
Регистрация
Восстановить пароль
 
Johny be Good
5 / 5 / 0
Регистрация: 25.09.2010
Сообщений: 89
#1

При перемножении матриц ошибка с памятью - C++

06.05.2012, 22:37. Просмотров 391. Ответов 6
Метки нет (Все метки)

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

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
//---------------------------------------------------------------------------
#pragma hdrstop
#include<conio.h>
#include<iostream.h>
#include<stdio.h>
#include<locale.h>
#include<windows.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#pragma argsused
//---------------------------------------------------------------------------
char* Rus(const char*);
char bufRus[256];
char* Rus(const char* text)
{
    CharToOem(text,bufRus);
    return bufRus;
}
  void Exit()
    {
        GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
    }
class Matrix
{
        private:
        public:
        float* matrix;
        int rows;
        int cols;
        int error;
        Matrix()
        {
                matrix = new float(0);
                rows = 1;
                cols = 1;
        }
        Matrix(int _row, int _col)
        {
                matrix = new float[_row*_col];
                rows=_row;
                cols=_col;
                for(int i=0; i<rows; i++)
                {
                        for(int g=0; g<cols; g++)
                        {
                                matrix[i, g]=g;
                        }
                }
        }
        Matrix(float a)
        {
                matrix = new float[3*3];
                rows = 3;
                cols = 3;
                for(int i=0; i<rows; i++)
                {
                        for(int g=0; g<cols; g++)
                        {
                                matrix[i, g]=a;
                        }
                }
        }
        ~Matrix()
        {         }
        
        Matrix mul (Matrix m1)
        {                                                           //cols = j
                Matrix temp;
                if(cols == m1.rows)
                        {
                                temp.matrix = new float[rows*m1.cols];
                                temp.cols = m1.cols;
                                temp.rows = rows;
                                for(int n=0; n<temp.cols*temp.rows; n++)
                                {
                                        for(int k=0; k<temp.rows; k++)
                                        {
                                                temp.matrix[n*k] = 0;
                                        }
                                }
                                int i, j, k;
                                float sum;
                                for(i = 0; i < temp.rows; i++)
                                        for(j = 0; j < temp.cols; j++)
                                        {
                                                sum = 0;
                                                for (k = 0; k < temp.rows; k++)
                                                sum += matrix[i,k] * m1.matrix[k,j];
                                                temp.matrix[i,j]=sum;
                                        }
 
                                return temp;
                        }
                else
                {
                        cout<<"Forms of the matrixs are not aligned!\n";
                        error = 2;
                        return temp;
                }
        }
 
 
};
 
int main(int argc, char* argv[])
{
        Matrix m1(3,3);
        Matrix m2(5);
        Matrix a;
        cout<<Rus("Матрица 1")<<endl;
        m1.Show();
        cout<<Rus("Матрица 2")<<endl;
        m2.Show();       
        cout<<Rus("Матрица 3 = Матрица 1 * Матрица 2")<<endl;
        a=m2.mul(m1);
        a.Show();
        getch();
        Exit();
     
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2012, 22:37     При перемножении матриц ошибка с памятью
Посмотрите здесь:

Ошибка вывода при перемножении матриц - C++
Здравствуйте! Программирую на C++ совсем недавно, столкнулся с проблемой, при выводе матрицы. Вместо результата перемножения двух матриц (...

Ошибка в перемножении матриц - C++
Имеется программка для перемножения матриц. void matrix_iter(double **mas_e, double **mas1, double **mas2, int size) { for (int...

Ошибка при работе с памятью - C++
Если ввести например 6, 0, чтобы выбросить исключение. То по завершение программы выскакивает ошибка. В чём может быть дело? Так что то про...

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

Ошибка при работе с памятью - C++
Написан следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;cstdlib&gt; #include...

Ошибка с памятью при работе с двумерными массивами. - C++
{ int i, j, c, kol; n=StrToInt(Edit1-&gt;Text); m=StrToInt(Edit2-&gt;Text); for(i=0; i&lt;n; i++) { for(j=0; j&lt;m; j++)...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
07.05.2012, 11:30     При перемножении матриц ошибка с памятью #2
функции show в коде нет. с экранированными вызовами show у меня никаких ошибок не выходит. в деструкторе писать delete [] matrix. в конструкторе по умолчанию делать matrix = float[1].
Johny be Good
5 / 5 / 0
Регистрация: 25.09.2010
Сообщений: 89
07.05.2012, 18:14  [ТС]     При перемножении матриц ошибка с памятью #3
Show выводит элементы обыкновенным перебором. Ошибку нашел:
C++
1
2
3
4
5
6
7
8
9
10
temp.matrix = new float[rows*m1.cols];
                                temp.cols = m1.cols;
                                temp.rows = rows;
                                for(int n=0; n<temp.cols*temp.rows; n++)
                                {
                                        for(int k=0; k<temp.rows; k++)
                                        {
                                                temp.matrix[n,k] = 0; //вместо * нужна , 
                                        }
                                }
Не знаю почему но при return temp вызывается деструктор и на экран выводиться бред. Но решил эту проблему просто выводом результата до return. Тему можно закрывать
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
08.05.2012, 08:54     При перемножении матриц ошибка с памятью #4
только сейчас обратил внимание - а как у вас вообще код работает если вы вместо [i][j] делаете [i,j]?

Добавлено через 3 минуты
...а деструктор и должен вызываться - функция завершается и локальный объект temp удаляется. поскольку конструктор копирования у вас не определен компилятор создает свой который действует аналогично memcopy - в объект возвращаемый после вызова функции копируется содержимое объекта temp - причем это касается указателя на динамически выделенную матрицу которая уже была удалена. вам нужно определить конструктор копирования выделяющий для матрицы память и переносящий в нее содержимое оригинала. ну и остальные поля объекта тоже в нем скопировать.
Johny be Good
5 / 5 / 0
Регистрация: 25.09.2010
Сообщений: 89
08.05.2012, 14:13  [ТС]     При перемножении матриц ошибка с памятью #5
Цитата Сообщение от vxg Посмотреть сообщение
только сейчас обратил внимание - а как у вас вообще код работает если вы вместо [i][j] делаете [i,j]?
Вот этого не знаю, но только так все ф-ции и работают. В моем понимании не работает [i][j], т.к. массив одномерный, но размерность определяется по стокам и столбцам. Как то так
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.05.2012, 10:55     При перемножении матриц ошибка с памятью #6
запись [i,j] эквивалентна записи [j] - операция запятая здесь не нужна. если массив одномерный используйте один индекс. если хотите ходить по одномерному как по двухмерному используйте записи вида [i * countof_j + j]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 11:01     При перемножении матриц ошибка с памятью
Еще ссылки по теме:

Ошибка с памятью при работе класса и map - C++
В общем есть класс тест class test { public: test(void); ~test(void); test(const int&amp;); private:

Ошибка с памятью при работе с динамическим двумерным массивом - C++
Вроде всё правильно, но в ходе работы программа выдаёт ошибку(на скрине). Дело в двумерном динамическом массиве. Ниже код с функцией, куда...

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

Ошибка при сложении матриц - C++
Если убрать деструктор, ошибки нет. Подскажите, пожалуйста, в чем проблема? #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include...


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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.05.2012, 11:01     При перемножении матриц ошибка с памятью #7
Цитата Сообщение от Johny be Good Посмотреть сообщение
В моем понимании
А следует делать так, как предусмотрено операторами языка...

Ещё сделать нормальный деструктор, то перестанет работать, т.к. не определён конструктор копирования. При том, что копирование тут используется везде, где ни попадя.
Yandex
Объявления
09.05.2012, 11:01     При перемножении матриц ошибка с памятью
Ответ Создать тему
Опции темы

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