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

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

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

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

06.05.2012, 22:37. Просмотров 398. Ответов 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();
     
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2012, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При перемножении матриц ошибка с памятью (C++):

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

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

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

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

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

6
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,669
07.05.2012, 11:30 #2
функции show в коде нет. с экранированными вызовами show у меня никаких ошибок не выходит. в деструкторе писать delete [] matrix. в конструкторе по умолчанию делать matrix = float[1].
0
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. Тему можно закрывать
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,669
08.05.2012, 08:54 #4
только сейчас обратил внимание - а как у вас вообще код работает если вы вместо [i][j] делаете [i,j]?

Добавлено через 3 минуты
...а деструктор и должен вызываться - функция завершается и локальный объект temp удаляется. поскольку конструктор копирования у вас не определен компилятор создает свой который действует аналогично memcopy - в объект возвращаемый после вызова функции копируется содержимое объекта temp - причем это касается указателя на динамически выделенную матрицу которая уже была удалена. вам нужно определить конструктор копирования выделяющий для матрицы память и переносящий в нее содержимое оригинала. ну и остальные поля объекта тоже в нем скопировать.
0
Johny be Good
5 / 5 / 0
Регистрация: 25.09.2010
Сообщений: 89
08.05.2012, 14:13  [ТС] #5
Цитата Сообщение от vxg Посмотреть сообщение
только сейчас обратил внимание - а как у вас вообще код работает если вы вместо [i][j] делаете [i,j]?
Вот этого не знаю, но только так все ф-ции и работают. В моем понимании не работает [i][j], т.к. массив одномерный, но размерность определяется по стокам и столбцам. Как то так
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,669
09.05.2012, 10:55 #6
запись [i,j] эквивалентна записи [j] - операция запятая здесь не нужна. если массив одномерный используйте один индекс. если хотите ходить по одномерному как по двухмерному используйте записи вида [i * countof_j + j]
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.05.2012, 11:01 #7
Цитата Сообщение от Johny be Good Посмотреть сообщение
В моем понимании
А следует делать так, как предусмотрено операторами языка...

Ещё сделать нормальный деструктор, то перестанет работать, т.к. не определён конструктор копирования. При том, что копирование тут используется везде, где ни попадя.
0
09.05.2012, 11:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 11:01
Привет! Вот еще темы с ответами:

Ошибка с памятью при работе с двумерными массивами. - 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++)...

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

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

Ошибка при транспонировании матриц - C++
всем привет. Ошибка заключается в том ,что при указании размера любой из 3-х матриц (размера 1|2) то-есть 1-строка и 2-столбца,вылазит...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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