Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
stdstring
0 / 0 / 1
Регистрация: 24.04.2014
Сообщений: 7
#1

Ошибка памяти при выполнении - не могу понять в чём дело

02.01.2015, 15:04. Просмотров 242. Ответов 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
#include <iostream>
 
using namespace std;
 
class Matrix
{
private:
    int* arr_ptr;
    unsigned int n;
    unsigned int m;
    class Tmp
    {
        Matrix &matrix;
        int i;
        friend class Matrix;
    public:
        Tmp(Matrix &matrix, int i):matrix(matrix), i(i) {}
        int &operator[](int j) { 
            return matrix.arr_ptr[i*matrix.n+j]; 
        }
    };
public:
    Matrix(unsigned int n, unsigned int m):n(n), m(m){
        arr_ptr=new int[n*m];
    }
    ~Matrix(){
        delete[] arr_ptr;
    }
 
    Tmp operator[](int i) { 
        return Tmp(*this, i); 
    }
};
 
int main(){
    setlocale(LC_ALL, "RUS");
    int n, m;
    cout<<"Введите n: ";
    cin>>n;
    cout<<"Введите m: ";
    cin>>m;
 
    Matrix matrix(n, m);
 
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<m; j++)
        {
            matrix[i][j]=1+i*m+j;
        }
    }
 
 
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<m; j++)
        {
            cout<<matrix[i][j]<<'\t';
        }
        cout<<endl;
    }   
 
    system("pause");
    return 0;
}
Иногда работает нормально, а при некоторых значениями n и m вылетает при выполнении. Например когда ввожу 5 и 4 вылетает при вызове деструктора (скриншот: http://prntscr.com/5njv3a), а когда ввожу 7 и 5 вылетает на строчке cout<<matrix[i][j]<<'\t'; (http://prntscr.com/5njvjw).

Помогите понять из-за чего так происходит и в чём ошибка.
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2015, 15:04
Ответы с готовыми решениями:

Не могу понять в чём ошибка?
программа (работа с файлами) отрабатывает правильно, но в конце возникает ошибка. Не могу понять,...

Не могу понять в чём ошибка
Циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от...

База болезней, не могу понять в чём ошибка
Задание такое База болезней: название, симптомы, процедуры, перечень рекомендуемых лекарств с...

Удаляем из строки слова перевёртыши...не понять в чём дело
программа должна удаляит из строки все слова которые читаются одинаково в дыух напралениях....

Найти сумму элементов квадратной матрицы (не могу понять в чём ошибка)
Доброго времени суток уважаемые форумчане. Пожалуйста подскажите в чем проблема, почему не...

6
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
02.01.2015, 15:12 #2
1) зачём вложенный класс?)
2) почему в двухмерном массиве память одномерная?
0
stdstring
0 / 0 / 1
Регистрация: 24.04.2014
Сообщений: 7
02.01.2015, 15:34  [ТС] #3
1) зачём вложенный класс?)
2) почему в двухмерном массиве память одномерная?
1) Для перегрузки оператора двойной индексации.
2) Насколько я знаю, представление матрицы в виде одномерного массива - это довольно распространённый приём. В данном случае это ограничение задания.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
02.01.2015, 15:38 #4
Цитата Сообщение от stdstring Посмотреть сообщение
Насколько я знаю, представление матрицы в виде одномерного массива - это довольно распространённый приём



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
#include <iostream>
#include <ctime>
using namespace std;
 
class Matrix
{
private:
    unsigned int m_rows = 0;
    unsigned int m_cols = 0;
    int** m_arr = nullptr;
 
public:
    Matrix(const unsigned int rows, const unsigned int cols)    :
        m_rows(rows),
        m_cols(cols)
    {
        m_arr = new int*[rows];
        for (int i = 0; i < rows; i++)
        {
            m_arr[i] = new int[cols];
        }
    }
    ~Matrix()
    {
        for (int i = 0; i < m_rows; i++)
        {
            delete [] m_arr[i];
        }
        delete [] m_arr;
    }
    void random()
    {
        for (int i = 0; i < m_rows; i++)
        {
            for (int q = 0; q < m_cols; q++)
            {
                m_arr[i][q] = rand() % 100;
            }
        }
    }
    void show()
    {
        for (int i = 0; i < m_rows; i++)
        {
            for (int q = 0; q < m_cols; q++)
            {
                cout.width(4);
                cout << m_arr[i][q] << " ";
            }
            cout << endl;
        }
    }
    int* operator[](int index)
    {
        return m_arr[index];
    }
};
 
int main()
{
    srand(time(0));
    Matrix a(6, 8);
    a.random();
    a.show();
 
    int i = 4;
    int y = 3;
    cout << "Element [" << i << "][" << y << "] : " << a[i][y] << endl;
    a[i][y] = 111;
    a.show();
}
0
stdstring
0 / 0 / 1
Регистрация: 24.04.2014
Сообщений: 7
02.01.2015, 15:43  [ТС] #5
Такой вариант не удовлетворяет условию.
Насколько я знаю, представление матрицы в виде одномерного массива - это довольно распространённый приём. В данном случае это ограничение задания.
К тому же хотелось бы всё таки узнать почему происходит ошибка выполнения в моём коде.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
02.01.2015, 15:48 #6
C++
1
matrix(matrix)
0
stdstring
0 / 0 / 1
Регистрация: 24.04.2014
Сообщений: 7
02.01.2015, 16:02  [ТС] #7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Код C++
1
matrix(matrix)
Эм... Извините, я не понял что Вы хотели сказать.

Добавлено через 4 минуты
Всё, спасибо, проблема похоже решена.
Цитата Сообщение от stdstring Посмотреть сообщение
return matrix.arr_ptr[i*matrix.n+j];
Тут был выход за пределы массива, надо было писать
C++
1
return matrix.arr_ptr[i*matrix.m+j];
0
02.01.2015, 16:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2015, 16:02

Ошибка памяти при выполнении, при компиляции не выводит ошибки
ПОмогите плс программа вводит строку символов до точки, а после вычисляет процент согласных в этой...

не могу понять в чем дело
In file included from /usr/local/lib/gcc47/include/c++/csignal:44:0, from...

Не работают перечни, не могу понять в чем дело
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;Windows.h&gt; #include...


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

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

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