0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
1

Ошибка при удалении данных из программы

27.08.2018, 14:47. Показов 1606. Ответов 8
Метки нет (Все метки)

Столкнулся с такой проблемой (смотри скриншот).
До добавления очистки указатель и динамических массивов всё работало без ошибок, теперь VS 2017 не даёт закрыть программу именно на этапе очистки.
Как исправить?
Код мэйн:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdlib> 
#include <cmath>
#include "Header.h"
 
/*  Задан квадратный массив А из N стpок и N столбцов, элементами которого являются нули и единицы. 
Установить в нем наличие всех квадратов из единиц со стороной длины М. Если такой квадраты найдены,то 
вывести координаты их левых верхних углов.*/
using namespace std;
 
int main() {
    setlocale(LC_ALL, "Russian");
    do {
        int** ArrayFromInput = Input(SizeOfArrayP, SizeOfSquareP, OutOfProgP);
        FindSquare(SizeOfArrayP, SizeOfSquareP, ArrayFromInput, OutOfProgP);
        system("cls");
    } while (*OutOfProgP==false);
    delete SizeOfSquareP;
    delete SizeOfArrayP;
    delete[] ArrayFromInput;
    return 0;
}
код 1 спп:
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
#include <iostream>
#include <cstdlib> 
#include <cmath>
#include <Windows.h>
#include <clocale>
#include <fstream>
#include <iostream>
using namespace std;
 
void FindSquare(int *SizeOfArrayP, int *SizeOfSquareP, int ** ArrayFromInput, bool *OutOfProgP) {
    if (*OutOfProgP == true) {
        return;
    }
    ofstream FileOut;
    using namespace std;
    FileOut.open("output.txt");
    int k = 0;
    int AmountOfOnes = 0;
    int AmountOfSquares = 0;
    int **Array = ArrayFromInput;
    FileOut << "Array: " << endl;
    for (int i = 0; i < *SizeOfArrayP; i++) {
        FileOut << endl;
        for (int j = 0; j < *SizeOfArrayP; j++) {
            FileOut << Array[i][j];
        }
    }
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            if ((Array[i][j] == 1)&((i + *SizeOfSquareP) <= *SizeOfArrayP)&((j + *SizeOfSquareP) <= *SizeOfArrayP)) {
                for (int ik = i; ik < (i + (*SizeOfSquareP)); ik++) {
                    for (int jk = j; jk < (j + (*SizeOfSquareP)); jk++) {
                        if (Array[ik][jk] == 1) {
                            AmountOfOnes++;
                        }
                        else {
                            AmountOfOnes = 0;
                        }
                    }
                }
                if (AmountOfOnes == (*SizeOfSquareP)* (*SizeOfSquareP)) {
                    AmountOfSquares++;
                    AmountOfOnes = 0;
                    k++;
                    if (k == 1) {
                        cout << "Coordinates of 1st square (i,j): " << i << "," << j << endl;
                        FileOut << endl;
                        FileOut << "Coordinates of 1st square (i,j): " << i << "," << j << endl;
                    }
                    else {
                        cout << "Coordinates of " << k << "nd " << "square (i,j): " << i << "," << j << endl;
                        FileOut << endl;
                        FileOut << "Coordinates of " << k << "nd " << "square (i,j): " << i << "," << j << endl;
                    }
                }
                else {
                    AmountOfOnes = 0;
                }
 
            }
        }
    }
    if (AmountOfSquares >= 1) {
        cout << "Amount of squares: " << AmountOfSquares << endl;
        FileOut << "Amount of squares: " << AmountOfSquares << endl;
    }
    else {
        FileOut << endl;
        cout << "Squares not found." << endl;
        FileOut << "Squares not found." << endl;
    }
    cout << endl;
    cout << "Save result in output.txt?" << endl;
    cout << "1 Yes" << endl;
    cout << "2 No" << endl;
    int CaseSelect;
    cin >> CaseSelect;
    cout << endl;
    switch (CaseSelect) {
    case 1:
        delete[] Array;
        break;
    case 2:
        fstream FileOut("output.txt", ios::out);
        FileOut.close();
        delete[] Array;
        break;
 
    }
}
2 спп:
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include <iostream>
#include <cstdlib> 
#include <cmath>
#include <Windows.h>
#include <clocale>
#include <fstream>
#include <iostream>
using namespace std;
 
int** ReadFromFile(int *SizeOfArrayP, int *SizeOfSquareP) {
    ofstream FileOut;
    ifstream File;
    File.open("Array.txt");
    if (!File.is_open()) {
        cout << "File not found or not available" << endl;
    }
    cout << endl;
    cout << endl;
    cout << "Enter size of array (int): ";
    cin >> *SizeOfArrayP;
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    int **ArrayP = new int*[*SizeOfArrayP];
    for (int i = 0; i < *SizeOfArrayP; i++) {
        ArrayP[i] = new int[*SizeOfArrayP];
    }
 
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            File >> ArrayP[i][j];
 
        }
    }
 
 
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Array:" << endl;
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            cout << ArrayP[i][j];
 
        }
        cout << endl;
    }
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Enter size of square (int): ";
    cin >> *SizeOfSquareP;
    FileOut << "Size of array: ";
    FileOut << *SizeOfSquareP;
    if (*SizeOfSquareP > *SizeOfArrayP) {
        cout << "ERROR: square can not be larger than array." << endl;
        cout << "Enter size of square (int): ";
        cin >> *SizeOfSquareP;
        cout << endl;
    }
    return ArrayP;
}
 
int** HandInput(int *SizeOfArrayP, int *SizeOfSquareP) {
    ofstream FileOut;
    int temp = 0;
    int *tempP = &temp;
    cout << endl;
    cout << endl;
    cout << "Enter size of array (int): ";
    cin >> *SizeOfArrayP;
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Enter elements of array (int, only 1 and 0): ";
    int **ArrayP = new int*[*SizeOfArrayP];
    for (int i = 0; i < *SizeOfArrayP; i++) {
        ArrayP[i] = new int[*SizeOfArrayP];
    }
 
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            cin >> ArrayP[i][j];
        }
    }
 
 
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Array:" << endl;
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            cout << ArrayP[i][j];
 
        }
        cout << endl;
    }
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Enter size of square (int): ";
    cin >> *SizeOfSquareP;
    FileOut << "Size of array: ";
    FileOut << *SizeOfSquareP;
    if (*SizeOfSquareP > *SizeOfArrayP) {
        cout << "ERROR: square can not be larger than array." << endl;
        cout << "Enter size of square (int): ";
        cin >> *SizeOfSquareP;
        cout << endl;
    }
    return ArrayP;
}
 
 
int** RandInput(int *SizeOfArrayP, int *SizeOfSquareP) {
    ofstream FileOut;
    cout << endl;
    cout << endl;
    cout << "Enter size of array (int): ";
    cin >> *SizeOfArrayP;
    cout << endl;
    int **Array = new int*[*SizeOfArrayP];
    for (int i = 0; i < *SizeOfArrayP; i++) {
        Array[i] = new int[*SizeOfArrayP];
    }
 
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            Array[i][j] = rand() % 2;
 
        }
    }
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Array:" << endl;
    for (int i = 0; i < *SizeOfArrayP; i++) {
        for (int j = 0; j < *SizeOfArrayP; j++) {
            cout << Array[i][j];
 
        }
        cout << endl;
    }
    for (int i = 0; i < 15; i++) {
        cout << "-";
    }
    cout << endl;
    cout << "Enter size of square (int): ";
    cin >> *SizeOfSquareP;
    FileOut << "Size of array: ";
    FileOut << *SizeOfSquareP;
    if (*SizeOfSquareP > *SizeOfArrayP) {
        cout << "ERROR: square can not be larger than array." << endl;
        cout << "Enter size of square (int): ";
        cin >> *SizeOfSquareP;
        cout << endl;
    }
 
    return Array;
}
 
 
int** Input(int *SizeOfArrayP, int *SizeOfSquareP, bool *OutOfProgP) {
    do {
        cout << "This program solve the task: Задан квадратный массив А из N стpок и N столбцов, элементами которого" << endl;
        cout << "являются нули и единицы.Установить в нем наличие всех квадратов из единиц со стороной длины М." << endl;
        cout << "Если такие квадраты найдены, то вывести координаты их левых верхних углов." << endl;
        for (int i = 0; i < 15; i++) {
            cout << "-";
        }
        cout << endl;
        cout << "1 Manual input" << endl;
        cout << "2 Random input" << endl;
        cout << "3 Read from file" << endl;
        cout << "4 Info" << endl;
        cout << "5 Exit from the program" << endl;
        for (int i = 0; i < 15; i++) {
            cout << "-";
        }
        cout << endl;
        cout << "Enter type of input: ";
        int CaseSelect;
        cin >> CaseSelect;
        cout << endl;
        int** Array;
        switch (CaseSelect) {
        case 1:
            cout << "Manual input" << endl;
            Array = HandInput(SizeOfArrayP, SizeOfSquareP);
            return Array;
            break;
        case 2:
            cout << "Random input" << endl;
            Array = RandInput(SizeOfArrayP, SizeOfSquareP);
            return Array;
 
            break;
        case 3:
            cout << "Read from file" << endl;
            Array = ReadFromFile(SizeOfArrayP, SizeOfSquareP);
            return Array;
            break;
        case 4:
            cout << "Author: Vasilchenko Alexandr" << endl;
            cout << "Var: 4" << endl;
            cout << "SPBGTI, 4 faculty, group 474" << endl;
            system("pause>nul");
            system("cls");
            break;
        case 5:
            cout << "Exit from the program" << endl;
            Sleep(500);
            *OutOfProgP=true;
            break;
        default:
            cout << "Wrong input. Try again!";
            system("pause>nul");
            system("cls");
            break;
 
        }
    } while (*OutOfProgP == false);
}
хэдэр:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
bool OutOfProg=false;
bool *OutOfProgP = &OutOfProg;
int** ArrayFromInput;
int SizeOfSquare;
int *SizeOfSquareP = &SizeOfSquare;
int AmountOfOnes = 0;
int AmountOfSquares = 0;
int SizeOfArray;
int *SizeOfArrayP = &SizeOfArray;
int** Input(int *SizeOfArrayP, int *SizeOfSquareP, bool *OutOfProgP);
int** HandInput(int *SizeOfArrayP, int *SizeOfSquareP);
int** RandInput(int *SizeOfArrayP, int *SizeOfSquareP);
void FindSquare(int *SizeOfArrayP, int *SizeOfSquareP, int** ArrayFromInput, bool *OutOfProgP);
int** ReadFromFile(int *SizeOfArrayP, int *SizeOfSquareP);
Миниатюры
Ошибка при удалении данных из программы  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2018, 14:47
Ответы с готовыми решениями:

Ошибка при удалении в базе данных.
Здравствуйте. Есть код готовый, рабочий с баззой данных. Ошибка вылетает(через раз) когда сначала...

ошибка при удалении программы
var st: string; reg: TRegistry; begin st := GetCurrentDir; //текущая директория reg...

Ошибка при удалении программы
Здравствуйте! При удалении Sony Vegas с панели управления, выдает ошибку (прикрепил скриншт) В чем...

Ошибка и при установке или удалении программы!
Когда я пытаюсь установить или удалить программу выходит сообщение &quot;Ошибка 1606. Не удаётся...

8
Модератор
Эксперт С++
11348 / 9312 / 5594
Регистрация: 18.12.2011
Сообщений: 24,852
27.08.2018, 14:51 2
Похоже Вы где-то вышли за границы выделенной памяти.
Воспользуйтесь отладчиком
Как пользоваться отладчиком (в Visual Studio)
0
0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
27.08.2018, 14:58  [ТС] 3
zss, всегда им пользуюсь. Нигде не было выхода за пределы. Ошибка стала появляться после добавления следующего кода в мэйн:
C++
1
2
3
delete SizeOfSquareP;
    delete SizeOfArrayP;
    delete[] ArrayFromInput;
0
1356 / 923 / 425
Регистрация: 30.10.2017
Сообщений: 2,611
27.08.2018, 15:00 4
Возможно дважды пытаетесь освободить одну и ту же область памяти.
0
0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
27.08.2018, 15:04  [ТС] 5
QuakerRUS, повторюсь, что добавил в мэйн после всех операций и перед возвратом нуля только
C++
1
2
3
delete SizeOfSquareP;
delete SizeOfArrayP;
delete[] ArrayFromInput;
0
1356 / 923 / 425
Регистрация: 30.10.2017
Сообщений: 2,611
27.08.2018, 15:07 6
Лучший ответ Сообщение было отмечено AlexOblom как решение

Решение

AlexOblom, а зачем вам первые два delete? Вы же не выделяли память через new по этим указателям. Поэтому и ошибка.
1
0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
27.08.2018, 15:15  [ТС] 7
QuakerRUS, Т.е. это не требуется?
Пишу лаб. работы, в которых требуется подчищать за собой всё из памяти и т.д.
0
1356 / 923 / 425
Регистрация: 30.10.2017
Сообщений: 2,611
27.08.2018, 15:16 8
Лучший ответ Сообщение было отмечено AlexOblom как решение

Решение

AlexOblom, очищать нужно только те области памяти, которые вы выделили через new (или через calloc/malloc).
1
0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
27.08.2018, 15:17  [ТС] 9
QuakerRUS, Спасибо большое!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2018, 15:17

Не запускаются некоторые программы, ошибка при удалении программ
Добрый день, были подозрения на вирусы, но эту причину отмели здесь:...

Ошибка при удалении данных
begin if Application.MessageBox('Удалить?', 'Удаление', MB_YESNO) = mrYes then ...

Ошибка при удалении данных из БД
Возникает при попытке удаления инфы из бд The object cannot be deleted because it was not found in...

Ограничение работы программы при изменении/удалении данных в коде
Коллеги, здравствуйте. Поставили передо мной задачу такого плана: необходимо написать программу,...


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

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

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