С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 14.10.2017
Сообщений: 5
1

Вызываются исключения, но не могу понять почему

27.10.2017, 01:03. Показов 3932. Ответов 2

Author24 — интернет-сервис помощи студентам
Не могу понять почему при значениях m и n больших 20 вызываются исключения. Такого рода: Вызвано исключение по адресу 0x00041D1E в №1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x008C8000.
или такого в файле new_scalar.cpp:
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
void* __CRTDECL operator new(size_t const size)
{
    for (;;)
    {
        if (void* const block = malloc(size))
        {
            return block;
        }
 
        if (_callnewh(size) == 0)
        {
            if (size == SIZE_MAX)
            {
                __scrt_throw_std_bad_array_new_length();
            }
            else
            {
                __scrt_throw_std_bad_alloc();
            }
        }
 
        // The new handler was successful; try to allocate again...
    }
}

Вот сама программа. Строит динамическую матрицу, строки которой будут состоять только из всех повторяющихся элементов соответствующей строки исходной матрицы. Строки должны быть переменной длины.
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <iostream>
#include <iomanip>
#include <fstream>
#include "Header.h"
using namespace std;
ifstream f1;
ofstream f2;
 
int main()
{
    setlocale(0, "");
    f1.open("input.txt");
    f2.open("output.txt");
    int m, n, k;
    cout << "Введите m и n: ";
    cin >> m >> n;
    unsigned int start_time = clock();
    f2 << "m=" << m << endl << "n=" << n << endl;
    k = m*n;
    //random_numbers_in_file(k); // заполняет input.txt случайными двузначными числами количества k
    int **matrix = new int *[m];  // int - тип элементов матрицы, **matrix - указатель на указатель                      
    for (int i = 0; i < m; i++)
        matrix[i] = new int[n];   // new - ключевое слово, которое выделяет память в куче под x элементов типа int
    // Ввод и вывод исходной матрицы
    f2 << "Исходная матрица\n";
    for (int i = 0; i < m; i++)
    {
        f2 << "  ";
        for (int j = 0; j < n; j++)
        {
            if (i == 0) f2 << setw(3) << j + 1 << ".";
            if (j == n - 1)f2 << endl;
        }
 
        for (int j = 0; j < n; j++)
        {
            f1 >> matrix[i][j];
            if (j == 0)f2 << i + 1 << ". ";
            f2 << setw(3) << matrix[i][j] << " ";
        }
        f2 << endl;
    }
    int *countmas = new int[n];
 
    int x = 0;
    int **matrix1 = new int*[m]; // Задание строчек конечной матрицы
 
 
    int *size = new int[n]; // Массив, в котором будет храниться количество чисел каждой строки
    for (int i = 0; i < n; i++)
        size[i] = 0;
 
 
 
    for (int i = 0; i < m; i++)
    {
        int x = 0;
        // Копирование i-ой строки в новый массив
        f2 << "countmas: ";
        for (int j = 0; j < n; j++)
        {
            countmas[j] = matrix[i][j];
            f2 << countmas[j] << " ";
        }
        f2 << "\n";
        //создаём массив состоящий только из повторяющихся элементов исходного
        int *p = new int[n];
        int d = 0, q1, e;
        for (int a = 0; a < n; a++)
        {
            q1 = 0; e = 0;
            
            //чтобы повторно не добавлять в массив одни и те же
            for (int q = 0; q < d; q++)
            {
                if (p[q] == countmas[a])
                {
                    q1 = 1;
                    break;
                }
            }
            if (q1 != 0)continue; //если данный элемент уже добавлялся в массив
            
            for (int b = a+1; b < n; b++)
            {
                if (countmas[a] == countmas[b] && x == 0)x++;
                if (countmas[a] == countmas[b])
                {
                    p[d] = countmas[a];
                    e++;
                    x++;// Необходимое количество ячеек в i-ой строке новой матрицы
                }
            }
            if (e != 0)d++;
            // В ячейку массива p записывает только один из повторяющихся элементов, далее такие
            // элементы ищутся в исходном массиве и заносятся в i-ую строку матрицы
        }
        
        int l = 0;
        for (int k = 0; k < x; k++)
        {   
            for (int j = 0; j < n; j++)
            {
                if (p[k] == matrix[i][j])
                {
                    size[i]++;
                }   
            }
        }
        matrix1[i] = new int[size[i]];
        for (int k = 0; k < size[i]; k++)
        {
            for (int j = 0; j < n; j++)
            {
 
                if (p[k] == matrix[i][j])
                {
                    matrix1[i][l] = p[k]; // В этом месте вызывается одно из исключений
                    l++;
                }
            }
        }
    }
 
    for (int i = 0; i < m; i++)
    {
        f2 << " x+1: " <<size[i]<<" - "<< i+1 << ". ";
        for (int j = 0; j < n; j++)
        {
            if (j >= size[i])break;
            f2 << matrix1[i][j]<<" ";
        }
        f2 << "\n";
    }
 
 
    f2.close();
    for (int i = 0; i < m; i++)
    {
        delete[] matrix[i];
    }
    delete[] matrix;
    for (int i = 0; i < m; i++)
    {
        delete[] matrix1[i];
    }
    delete[] matrix1;
    delete[]size;
 
    return 0;
}
Буду очень признателен!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2017, 01:03
Ответы с готовыми решениями:

Вызываются исключения, не могу понять почему
Это в библиотеке fstream _Myt *close() { // close the C stream _Myt *_Ans = this; if...

Не могу понять почему не могу считать символьный ряд через cin.getline
Не могу понять почему не могу считать символьный ряд через cin.getline.Помогите позязя. #define ...

Не могу понять почему...
#include &quot;stdafx.h&quot; void main() { funct(); _getch(); } void funct() {

Не могу понять почему
Есть кода программы(код взят разобраться): #include&lt;iostream&gt; using namespace std; class coord {...

2
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
27.10.2017, 17:27 2
Цитата Сообщение от Meetch Посмотреть сообщение
for (int k = 0; k < x; k++)
{
for (int j = 0; j < n; j++)
{
if (p[k] == matrix[i][j])
{
size[i]++;
}
}
}
тут size[i] может досчитаться до n*x, а т.к.
Цитата Сообщение от Meetch Посмотреть сообщение
int *p = new int[n];
, то

Цитата Сообщение от Meetch Посмотреть сообщение
for (int k = 0; k < size[i]; k++)
{
for (int j = 0; j < n; j++)
{
if (p[k] == matrix[i][j])
{
matrix1[i][l] = p[k]; // В этом месте вызывается одно из исключений
l++;
}
}
}
1
0 / 0 / 1
Регистрация: 14.10.2017
Сообщений: 5
28.10.2017, 19:51  [ТС] 3
Спасибо!
Я нашёл ошибки, в основном они в границах циклов.
Ещё одна ошибка была в этой строчке:
C++
1
int *size = new int[n]; // Массив, в котором будет храниться количество чисел каждой строки
здесь вместо n надo m

Вот, что получилось в итоге, теперь всё работает:
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*
№1.   Задана матрицы А размерности N*M (N,M<=100). Элементы матрицы целые знаковые числа. 
Построить динамическую  матрицу В, строки которой будут состоять только из всех повторяющихся элементов 
соответствующей строки матрицы А. В  конце строк  нули не добавлять, а  сделать строки переменной длины.
 
 
Создаёт вводный файл с k=m*n количеством элементов. Создаёт матрицу.
Заносит матрицу в двумерный массив. Ищет одинаковые элеметы массива, записывает их
в соответствующую строку новой матрицы.
 
Тесты:
m=3
n=25
Исходная матрица
    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.
1.  66  12  51  37  78  49  12  69  34  23  87  66  47  55  12  12  38  62  14  32  85   0  59  47  57
 
2.  86  72  55   0  44  41  58  21  14  29  42  53  78  30  23  36   3  48  54   5  72  45  23  38  61
 
3.  80  42  32  61  74   3  25  19  93  82  63  59  73  68  80   3  16  79  66  94  33  39  61  91  31
 
 
 
Новая матрица
    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.
1.  66  66  12  12  12  12  47  47
 
2.  72  72  23  23
 
3.  80  80  61  61   3   3
 
Время затраченное программой на расчёт: 0.003 секунд
*/
#include <iostream>
#include <iomanip>
#include <fstream>
#include "Header.h"
using namespace std;
ifstream f1;
ofstream f2;
 
int main()
{
    setlocale(0, "");
    f1.open("input.txt");
    f2.open("output.txt");
    int m, n, k;
    cout << "Введите m и n: ";
    cin >> m >> n;
    unsigned int start_time = clock();
    f2 << "m=" << m << endl << "n=" << n << endl;
    k = m*n;
    random_numbers_in_file(k); // заполняет input.txt случайными двузначными числами количества k
    int **matrix = new int *[m];  // int - тип элементов матрицы, **matrix - указатель на указатель                      
    for (int i = 0; i < m; i++)
        matrix[i] = new int[n];   // new - ключевое слово, которое выделяет память в куче под x элементов типа int
    // Ввод и вывод исходной матрицы
    f2 << "Исходная матрица\n";
    for (int i = 0; i < m; i++)
    {
        f2 << "  ";
        for (int j = 0; j < n; j++)
        {
            if (i == 0) f2 << setw(3) << j + 1 << ".";
            if (j == n - 1)f2 << endl;
        }
 
        for (int j = 0; j < n; j++)
        {
            f1 >> matrix[i][j];
            if (j == 0)f2 << i + 1 << ". ";
            f2 << setw(3) << matrix[i][j] << " ";
        }
        f2 << endl;
    }
    int *countmas = new int[n];
 
    int x = 0;
    int **matrix1 = new int*[m]; // Задание строчек конечной матрицы
 
 
    int *size = new int[m]; // Массив, в котором будет храниться количество чисел каждой строки
    for (int i = 0; i < m; i++)
        size[i] = 0;
 
 
 
    for (int i = 0; i < m; i++)
    {
        int x = 0;
        // Копирование i-ой строки в новый массив
        for (int j = 0; j < n; j++)
        {
            countmas[j] = matrix[i][j];
        }
        //создаём массив состоящий только из повторяющихся элементов исходного
        int *p = new int[n];//его размером будет количество столбцов исходной матрицы
        int d = 0, q1, e;
        for (int a = 0; a < n; a++)
        {
            q1 = 0; e = 0;
            
            //чтобы повторно не добавлять в массив одни и те же элементы
            for (int q = 0; q < d; q++)
            {
                if (p[q] == countmas[a])
                {
                    q1 = 1;
                    break;
                }
            }
            if (q1 != 0)continue; //если данный элемент уже добавлялся в массив
            
            for (int b = a+1; b <= n; b++)
            {
                if (countmas[a] == countmas[b] && x == 0)x++;
                if (countmas[a] == countmas[b])
                {
                    p[d] = countmas[a];
                    e++;
                    x++;// Необходимое количество ячеек в i-ой строке новой матрицы
                }
            }
            if (e != 0)d++;
            // В ячейку массива p записывается только один из повторяющихся элементов, далее такие
            // элементы ищутся в исходном массиве и заносятся в i-ую строку матрицы
        }
        
        int l = 0;
        for (int k = 0; k < x; k++)
        {
            for (int j = 0; j < n; j++)
            {
                if (p[k] == matrix[i][j])
                {
                    size[i]++;
                }
            }
        }
        matrix1[i] = new int[size[i]];
        for (int k = 0; k < x; k++)
        {
            for (int j = 0; j < n; j++)
            {
 
                if (p[k] == matrix[i][j])
                {
                    matrix1[i][l] = p[k];
                    l++;
                }
            }
        }
    }
    f2 << "\n\nНовая матрица \n";
    for (int i = 0; i < m; i++)
    {
        f2 << "  ";
        for (int j = 0; j < n; j++)
        {
            if (i == 0) f2 << setw(3) << j + 1 << ".";
            if (j == n - 1)f2 << endl;
        }
        f2 << i + 1 << ". ";
        for (int j = 0; j < size[i]; j++)
            f2 << setw(3) << matrix1[i][j]<<" ";
        f2 << "\n";
    }
    for (int i = 0; i < m; i++)
    {
        delete[] matrix[i];
    }
    delete[] matrix;
    for (int i = 0; i < m; i++)
    {
        delete[] matrix1[i];
    }
    delete[] matrix1;
    delete[]size;
 
    unsigned int end_time = clock();
    unsigned int search_time = end_time - start_time;
    f2 << "\nВремя затраченное программой на расчёт: " << search_time / 1000. << " секунд" << endl;
    
    f2.close();
    return 0;
}
0
28.10.2017, 19:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2017, 19:51
Помогаю со студенческими работами здесь

Не могу понять, почему?
Доброго времени суток=) Такая печаль. Создается класс Окружность с полями радиус, площадь и длина...

Не могу понять почему не запускается
Программа не запускается, скажите пожалуйста где ошибка? #include &lt;stdio.h&gt; #include &lt;conio.h&gt;...

ошибка не могу понять почему !
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; const int col=20; //создание...

не могу понять почему не работает
Пожалуйста ,помоги,найти ошибку... услвие задачи Подсчитать количество вхождений букв и слов в...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru