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

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

Войти
Регистрация
Восстановить пароль
 
stdstring
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 7
#1

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

02.01.2015, 15:04. Просмотров 221. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка памяти при выполнении - не могу понять в чём дело (C++):

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

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

Удаляем из строки слова перевёртыши...не понять в чём дело - C++
программа должна удаляит из строки все слова которые читаются одинаково в дыух напралениях. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; ...

Найти сумму элементов квадратной матрицы (не могу понять в чём ошибка) - C++
Доброго времени суток уважаемые форумчане. Пожалуйста подскажите в чем проблема, почему не работает? #include &lt;iostream&gt; ...

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

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

6
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
02.01.2015, 15:12 #2
1) зачём вложенный класс?)
2) почему в двухмерном массиве память одномерная?
0
stdstring
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 7
02.01.2015, 15:34  [ТС] #3
1) зачём вложенный класс?)
2) почему в двухмерном массиве память одномерная?
1) Для перегрузки оператора двойной индексации.
2) Насколько я знаю, представление матрицы в виде одномерного массива - это довольно распространённый приём. В данном случае это ограничение задания.
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
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 / 0
Регистрация: 24.04.2014
Сообщений: 7
02.01.2015, 15:43  [ТС] #5
Такой вариант не удовлетворяет условию.
Насколько я знаю, представление матрицы в виде одномерного массива - это довольно распространённый приём. В данном случае это ограничение задания.
К тому же хотелось бы всё таки узнать почему происходит ошибка выполнения в моём коде.
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
02.01.2015, 15:48 #6
C++
1
matrix(matrix)
0
stdstring
0 / 0 / 0
Регистрация: 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
Привет! Вот еще темы с ответами:

Вывод строки. Не могу понять, в чем дело - C++
Добрый вечер. В программе на вход подается строка типа &quot;слово1-слово2&quot;, содержащаяся в переменной str. Я слово 1 помещаю в переменную...

Написанная программа не компилируется, не могу понять в чем дело - C++
Есть три файла в одном проекте: main.cpp cyber.cpp cyber.h //main.cpp: #include &lt;iostream&gt; #include...

Вызов перегруженной функции не могу понять в чем дело? - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;stdio.h&gt; using namespace std; //Прототипы функций bool LeapYear(int Year); ...

Не могу понять в чем дело. Машинный код" завершилась с кодом 0 (0x0) - C++
#include &lt; iostream &gt; using namespace std; struct coord { int x, y; }; bool isValidCoord(int x) { return x&gt;=1 &amp;&amp; x&lt;=8; ...


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

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

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