При переходе с Debug на Release, выдает: Необработанное исключение по адресу: Куча была повреждена (параметры: 0x00007FF8470397F0)
Запускал программу на Debug, все работало нормально, при переходе на Release стало ругаться, причем если проигнорировать предупреждения, код работает как задумано. Раньше не работал с Release, и не знаю где ошибка.
//Программа реализации ДКА
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
#include <locale.h>
#include <wchar.h>
#include <algorithm>
#define N 18
using namespace std;
/* Структура, описывающая узел графа
char psevdonim[4] - имя данного узла
Item* a - указатель на следующий узел графа, находящийся по дуге a
Item* b - указатель на следующую узел графа, находящийся по дуге b
Item* с - указатель на следующую узел графа, находящийся по дуге c
Item* d - указатель на следующую узел графа, находящийся по дуге d
bool YorN - значение, определяющее, является ли данный узел допускающим или нет
*/
struct Item {
char psevdonim[4] = "";
Item* a = nullptr;
Item* b = nullptr;
Item* c = nullptr;
Item* d = nullptr;
bool YorN;
};
typedef Item* point;
/*
Функция обработки данных из таблицы переходов
char* boo - указатель на обрабатываемый элемент
return: номер узла, соответствующий элементу
*/
int char_to_int(char* boo);
/*
Функция форматированного вывода
const char* bufer - указатель на обрабатываемый символ алфовита, по которому производится переход
Item*& head - ссылка на первый элемент графа
return: ничего
*/
void output(const char* bufer, Item*& head);
/*
Функция инициалиализации графа
point*& Points - ссылка на выделенное для графа место
return: ничего
*/
void init_graph(point*& Points);
/*
Функция проверки, соответствует ли введенная последовательность алфавиту
string bufer - проверяемая строка
return: true - соответствует
false - не соответствует
*/
bool check(string bufer);
int main() {
setlocale(LC_ALL, "rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
point* Points = (point*)calloc(N + 1, sizeof(Item*));
init_graph(Points);
bool first_enter = true;
bool MyExit = true;
bool next_enter = false;
do {
int cont = 1;
string bufer;
if (first_enter) {
cout << "Введите входную цепочку, закончив её символом \"!\": ";
}
if (next_enter) {
cout << "\nВходная цепочка: ";
}
cin >> bufer;
first_enter = false;
if (check(bufer)) {
point head = Points[1];
int i = 0; char boo;
do {
boo = bufer[i];
output(&boo, head);
i++;
} while (boo != '!');
cout << (!(head->YorN) ? " -> false" : (head != Points[1]) ? " -> true" : "q0 -> true");
cout << "\nВведи next при необходимости проверить ещё одну цепочку\n";
string flag;
cin >> flag;
if (flag != "next")
MyExit = false;
else {
first_enter = false;
next_enter = true;
cont = 1;
}
}
else {
string flag;
cout << "\nУсловия читай, пожалуйста.\n";
cout << "Введи next, если тебе нужна еще одна попытка\n";
cin >> flag;
if (flag != "next")
MyExit = false;
else {
first_enter = true;
next_enter = false;
cont = 1;
}
}
} while (MyExit);
for (int i = 1; i <= N; ++i) {
free(Points[i]);
}
free(Points);
return 0;
}
bool check(string bufer) {
bool flag_check = true;
char boo; int cont = 0;
do {
boo = bufer[cont];
if (cont >= bufer.length()) flag_check = false;
if (!(boo == '!' || boo == 'a' || boo == 'b' || boo == 'c' || boo == 'd')) flag_check = false;
cont++;
} while (boo != '!' && flag_check);
return flag_check;
}
void output(const char* bufer, Item*& head) {
char boo = *bufer;
if (boo == 'a') {
cout << "\na: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->a->psevdonim[0] << head->a->psevdonim[1] << head->a->psevdonim[2];
head = head->a;
}
else if (boo == 'b') {
cout << "\nb: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->b->psevdonim[0] << head->b->psevdonim[1] << head->b->psevdonim[2];
head = head->b;
}
else if (boo == 'c') {
cout << "\nc: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->c->psevdonim[0] << head->c->psevdonim[1] << head->c->psevdonim[2];
head = head->c;
}
else if (boo == 'd') {
cout << "\nd: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->d->psevdonim[0] << head->d->psevdonim[1] << head->d->psevdonim[2];
head = head->d;
}
}
int char_to_int(char* boo) {
char* ptr1 = boo;
char* ptr2 = boo + 1;
int flag = 0;
if (*ptr1 == 'F') flag = 18;
else if (*ptr2 != '\0')
flag = (*ptr1 - '0') * 10 + (*ptr2 - '0') + 1;
else
flag = (*ptr1 - '0') + 1;
return flag;
}
void init_graph(point*& Points) {
// даем имена узлам
FILE* f1 = fopen("input.txt", "r");
if (f1 == nullptr) {
cout << "Failed to open file 1" << endl;
exit(1);
}
int pos = 6, kolEl = 0;
while (kolEl <= N) {
char boo[4] = "";
fscanf(f1, "%s", boo);
if (pos % 6 == 0) {
kolEl++;
Points[kolEl] = (point)calloc(1, sizeof(Item));
strcpy(Points[kolEl]->psevdonim, boo);
}
pos++;
}
fclose(f1);
// заполняем узлы данными
FILE* f2 = fopen("input.txt", "r");
if (f2 == nullptr) {
cout << "Failed to open file 2" << endl;
exit(1);
}
pos = 6, kolEl = 0;
while (kolEl <= N) {
if (pos % 6 == 0) {
char boo[4] = "";
fscanf(f2, "%s", boo); pos++;
kolEl++;
} else {
char booA[3] = "", booB[3] = "", booC[3] = "", booD[3] = "", booY[3] = "";
fscanf(f2, "%s", booA); pos++;
int way_a = char_to_int(booA);
Points[kolEl]->a = Points[way_a];
fscanf(f2, "%s", booB); pos++;
int way_b = char_to_int(booB);
Points[kolEl]->b = Points[way_b];
fscanf(f2, "%s", booC); pos++;
int way_c = char_to_int(booC);
Points[kolEl]->c = Points[way_c];
fscanf(f2, "%s", booD); pos++;
int way_d = char_to_int(booD);
Points[kolEl]->d = Points[way_d];
fscanf(f2, "%s", booY); pos++;
Points[kolEl]->YorN = (strcmp(booY, "Y") == 0);
}
}
fclose(f2);
}
если кому то нужно попробовать запустить, вот данные из input.txt:
q0 2 1 4 1 Y
q1 2 1 4 1 Y
q2 3 2 6 2 Y
q3 10 3 7 3 Y
q4 6 4 5 4 Y
q5 8 5 11 5 Y
q6 7 6 8 6 Y
q7 15 7 9 7 Y
q8 9 8 16 8 Y
q9 12 9 13 9 Y
q10 F 10 15 10 Y
q11 16 11 F 11 Y
q12 F 12 14 12 Y
q13 14 13 F 13 Y
q14 F 14 F 14 Y
q15 F 15 12 15 Y
q16 13 16 F 16 Y
F F F F F N