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

Странности поведения матриц - C++

Восстановить пароль Регистрация
 
Mikelanjelo
1 / 1 / 0
Регистрация: 17.09.2012
Сообщений: 24
13.04.2014, 13:10     Странности поведения матриц #1
При реализации класса матриц магия C++ проявила себя уже на сложении. При сложении каким-то образом портится правый операнд (внутренняя перегрузка унарного плюса). Вылетает даже на простой модели с ошибкой обращения к памяти.

Заголовочный класса:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
#ifndef MATRIX_H
#define MATRIX_H
#include <string>
#include <sstream>
 
using namespace std;
 
class matrix
{
private:
    int *pmatrix;
    unsigned int cCol,cRow;
public:
    //Конструкторы
    matrix(unsigned int rowCount, unsigned int colCount);
    matrix(int* arr, unsigned int rowCount, unsigned int colCount);
 
    //Перевод матрицы в строку
    string toString();
 
    //Операции
    matrix operator+(matrix);
    matrix operator=(matrix);
 
    //Деструктор
    ~matrix();
};
 
#endif // MATRIX_H


Реализация класса:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
#include "matrix.h"
 
//Перевод числа в строку
string myIntToString(int val)
{
    ostringstream oss;
    oss << val;
    return oss.str();
}
 
//Конструкторы
matrix::matrix(unsigned int rowCount, unsigned int colCount)
{
    unsigned int i,j;
    cCol = colCount;
    cRow = rowCount;
    pmatrix = new int [cCol*cRow];
    for (i = 0; i < cRow; i++)
    {
        for (j = 0; j < cCol; j++)
        {
            pmatrix[i*cCol+j] = 0;
        }
    }
}
 
matrix::matrix(int *pm, unsigned int rowCount, unsigned int colCount)
{
    unsigned int i,j;
    cCol = colCount;
    cRow = rowCount;
    pmatrix = new int [cCol*cRow];
    for (i = 0; i < cRow; i++)
    {
        for (j = 0; j < cCol; j++)
        {
            pmatrix[i*cCol+j] = pm[i*cCol+j];
        }
    }
}
 
//Перевод матрицы в строку
string matrix::toString()
{
    unsigned int i,j;
    string tmp = "";
    for (i = 0; i < cRow; i++)
    {
        for (j = 0; j < cCol; j++)
        {
            tmp += myIntToString(pmatrix[i*cCol+j]) + ' ';
        }
        tmp += '\n';
    }
    return tmp;
}
 
//Операции
matrix matrix::operator+(matrix op)
{
    unsigned int i;
    matrix tmp(cRow,cCol);
    for (i = 0; i < cRow*cCol; i++)
    {
        tmp.pmatrix[i] = pmatrix[i] + op.pmatrix[i];
    }
    return tmp;
}
 
matrix matrix::operator=(matrix op)
{
    for (unsigned int i = 0; i < cRow*cCol; i++)
        pmatrix[i] = op.pmatrix[i];
    return (*this);
}
 
//(Капитан очевидность) Деструктор
matrix::~matrix()
{
    delete [] pmatrix;
}


Головная:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include "matrix.h"
 
using namespace std;
 
int main()
{
    int pa[9];
    for (int i = 0; i < 9; i++)
    {
        pa[i] = i;
    }
    matrix a(pa, 3, 3), b(pa, 3, 3), c(3, 3);
    c = a + b;
    cout << a.toString() << endl;
    cout << b.toString() << endl;
    cout << c.toString() << endl;
    return 0;
}


Без решения проблемы дальше нет смысла двигаться. Заранее спасибо за ответ и терпение (ибо разбор чужого кода сущее наказание).
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2014, 13:10     Странности поведения матриц
Посмотрите здесь:

C++ Странности с typedef
C++ решить систему... и иследование поведения функции
Странности с матрицей C++
C++ Странности в поведении strncpy
Странные поведения с float C++
Странности с CodeBlocks C++
C++ Транспонирование матриц. Произведение транспонированных матриц
C++ MinGW и странности оптимизации

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.04.2014, 14:03     Странности поведения матриц #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Поле - указатель, а конструктора копирования нет. Правило трёх:
http://ru.wikipedia.org/wiki/Правило...ограммирование)

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
matrix::matrix(const matrix& op)
{
    cRow = op.cRow;
    cCol = op.cCol;
    pmatrix = new int [cCol * cRow];
    for (unsigned int i = 0; i < cRow * cCol; i++)
        pmatrix[i] = op.pmatrix[i];
}
Yandex
Объявления
13.04.2014, 14:03     Странности поведения матриц
Ответ Создать тему
Опции темы

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