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

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

Восстановить пароль Регистрация
 
Johny be Good
 Аватар для Johny be Good
5 / 5 / 0
Регистрация: 25.09.2010
Сообщений: 89
06.05.2012, 22:37     При перемножении матриц ошибка с памятью #1
Написал класс матрица с алгоритмом умножения, но при выходе из проги выбивает ошибку. Не пойму как написать деструктор. Подскажите как исправить

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();
     
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2726 / 1737 / 173
Регистрация: 13.01.2012
Сообщений: 6,510
07.05.2012, 11:30     При перемножении матриц ошибка с памятью #2
функции show в коде нет. с экранированными вызовами show у меня никаких ошибок не выходит. в деструкторе писать delete [] matrix. в конструкторе по умолчанию делать matrix = float[1].
Johny be Good
 Аватар для 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
Модератор
 Аватар для vxg
2726 / 1737 / 173
Регистрация: 13.01.2012
Сообщений: 6,510
08.05.2012, 08:54     При перемножении матриц ошибка с памятью #4
только сейчас обратил внимание - а как у вас вообще код работает если вы вместо [i][j] делаете [i,j]?

Добавлено через 3 минуты
...а деструктор и должен вызываться - функция завершается и локальный объект temp удаляется. поскольку конструктор копирования у вас не определен компилятор создает свой который действует аналогично memcopy - в объект возвращаемый после вызова функции копируется содержимое объекта temp - причем это касается указателя на динамически выделенную матрицу которая уже была удалена. вам нужно определить конструктор копирования выделяющий для матрицы память и переносящий в нее содержимое оригинала. ну и остальные поля объекта тоже в нем скопировать.
Johny be Good
 Аватар для Johny be Good
5 / 5 / 0
Регистрация: 25.09.2010
Сообщений: 89
08.05.2012, 14:13  [ТС]     При перемножении матриц ошибка с памятью #5
Цитата Сообщение от vxg Посмотреть сообщение
только сейчас обратил внимание - а как у вас вообще код работает если вы вместо [i][j] делаете [i,j]?
Вот этого не знаю, но только так все ф-ции и работают. В моем понимании не работает [i][j], т.к. массив одномерный, но размерность определяется по стокам и столбцам. Как то так
vxg
Модератор
 Аватар для vxg
2726 / 1737 / 173
Регистрация: 13.01.2012
Сообщений: 6,510
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     При перемножении матриц ошибка с памятью
Еще ссылки по теме:

Ошибка с памятью при работе с двумерными массивами. C++
Ошибка с памятью при работе класса и map C++
Написать процедуру для суммирования матриц. Ошибка при передаче массива в функцию C++
C++ Ошибка с памятью
Определить может ли введенное число получиться при перемножении его десятичных цифр C++

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

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

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

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