Element *.exe wyzwolił punkt przerwania

0

Witam wszystkich,
Czy ktoś mógłby potwierdzić chwilę i podpowiedzieć dlaczego w moim kiepskim kodzie zostaje zgłoszony wyjątek "Element *.exe wyzwolił punkt przerwania."?
Czasami działa, czasami nie. Zauważyłem, że przy użyciu uzupelnij(); dla jednego obiektu działa jak trzeba.

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdio>
#include <random>

using namespace std;

class Autobus
{
private:

	string kierowca;

public:

	int numer;
	int iloscMiejsc;
	int iloscWolnychMiejsc;
	int* tablica;
	int wybor;
	char *tablicaWolnychMiejsc = new char[iloscMiejsc];

	string miejsceStartu;
	string miejsceDocelowe;

	Autobus(int n, int iM, int iWm, string mS, string mD, string k);
	~Autobus();
	

	void wypisz();
};

Autobus::Autobus(int n, int iM, int iWm, string mS, string mD, string k) {
	numer = n;
	iloscMiejsc = iM;
	tablica = new int[iloscMiejsc];
	miejsceStartu = mS;
	miejsceDocelowe = mD;
	kierowca = k;
	iloscWolnychMiejsc = iWm;
}

Autobus::~Autobus()
{
	delete[] tablica;
	delete[] tablicaWolnychMiejsc;
}


void rezerwuj(Autobus *a) {

	if (a->iloscWolnychMiejsc > 0) {
		a->iloscWolnychMiejsc--;

		srand(time(NULL));

		bool check = false;

		while (check == false) {
			int randIndex = rand() % 15;
			if (a->tablicaWolnychMiejsc[randIndex] != 'X') {
				a->tablicaWolnychMiejsc[randIndex] = 'X';
				check = true;
			}
		}
	}
	else {
		cout << "Niestety, nie ma wolnych miejsc" << endl;
		Sleep(2000);

	}
}

void wypiszTablice(Autobus* a, char* tablicaWsk) {

	system("cls");

	a->wypisz();

	for (int i = 0; i < a->iloscMiejsc; i++)
	{

		cout << "[ " << a->tablicaWolnychMiejsc[i] << " ]";

	}

	cout << endl;

	for (int i = 0; i < a->iloscMiejsc; i++)
	{
		if (i < 10) {
			cout << "[ " << i << " ]";
		}
		else {
			cout << "[ " << i << "]";
		}
	}

	cout << endl;

	for (int i = 0; i < a->iloscMiejsc; i++)
	{

		cout << "[ " << tablicaWsk[i] << " ]";

	}

	cout << endl;
	cout << endl;
	cout << "Nacisnij ESC by wrocic do menu" << endl;
}

void rezerwujSzczegolowo(Autobus* a) {

	system("cls");
	bool stop = false;
	char znak;
	int znakint, pozycja=0;


	char* tablicaWsk = new char [a->iloscMiejsc];

	a->wypisz();

	for (int i = 0; i < a->iloscMiejsc; i++)
	{
		tablicaWsk[i] = ' ';
	}

	tablicaWsk[0] = '^';

	for (int i = 0; i < a->iloscMiejsc; i++)
	{

		cout << "[ " << a->tablicaWolnychMiejsc[i] << " ]";

	}

	cout << endl;

	for (int i = 0; i < a->iloscMiejsc; i++)
	{
		if (i < 10) {
			cout << "[ " << i << " ]";
		}
		else {
			cout << "[ " << i << "]";
		}
	}

	cout << endl;

	for (int i = 0; i < a->iloscMiejsc; i++)
	{

		cout << "[ " << tablicaWsk[i] << " ]";

	}

	cout << endl;
	cout << endl;
	cout << "Nacisnij ESC by wrocic do menu" << endl;
	//cout << "Adres tablicy wolnych miejsc to: " << &a->tablicaWolnychMiejsc;

	while (stop == false) {

		znak = _getch();
		znakint = (int)znak;

		cout << znakint;

		switch (znakint)
		{

		case 115: // prawo
			if (pozycja < (a->iloscMiejsc)-1) {
				tablicaWsk[pozycja] = ' ';
				tablicaWsk[++pozycja] = '^';
				wypiszTablice(a, tablicaWsk);
			}
			break;

		case 97: // lewo
			if (pozycja > 0)
			{
				tablicaWsk[pozycja] = ' ';
				tablicaWsk[--pozycja] = '^';
				wypiszTablice(a, tablicaWsk);
			}
			break;

		case 13: // enter
			if (a->tablicaWolnychMiejsc[pozycja] != 'X') {
				a->tablicaWolnychMiejsc[pozycja] = 'X';
				a->iloscWolnychMiejsc--;
				wypiszTablice(a, tablicaWsk);
			}
			break;

		case 27: // escape
			stop = true;
			break;


		default:
			break;
		}
	}
}



void Autobus::wypisz() {

	cout << "Numer:  Ilosc Miejsc: IloscWolnychMiejsc:   Miejsce Startu:          Miejsce Docelowe:       Kierowca: " << endl;
	cout << numer << ".       " << iloscMiejsc << ".            " << iloscWolnychMiejsc << "                   " << miejsceStartu << "                  " << miejsceDocelowe << "                   " << kierowca << endl << endl;
}

int rezerwacja() {
	int numer;
	cout << "Ktory autobus chcesz zarezerwowac? " << endl;
	cout << "Autobus nr: "; cin >> numer;

	return numer;
	
}


void wypiszWszystkie(Autobus *a1, Autobus* a2, Autobus* a3, Autobus* a4, Autobus* a5) {

	a1->wypisz();
	a2->wypisz();
	a3->wypisz();
	a4->wypisz();
	a5->wypisz();
}

 void uzupelnij(Autobus* a) {

	for (int i = 0; i < a->iloscMiejsc; i++)
	{
		a->tablicaWolnychMiejsc[i] = ' ';
	}

}


void wypiszMenu() {
	cout << "[1] ZAREZERWUJ MIEJSCE" << endl;
	cout << "[2] ZAREZERWUJ SZCZEGOLOWO MIEJSCE";
	cout << endl;
}



int main()
{
	Autobus a1(1, 16, 16, "Gniezno", "Lodz", "Zasada");
	Autobus a2(2, 16, 16, "Koluszki", "Helm", "Ziobro");
	Autobus a3(3, 16, 16, "Warszawa", "Huta", "Adrian");
	Autobus a4(4, 16, 16, "Kalisz", "Mata", "Geralt");
	Autobus a5(5, 16, 16, "Zakopane", "Bale", "Najman");

	uzupelnij(&a1);
	uzupelnij(&a2);
	uzupelnij(&a3);
	uzupelnij(&a4);
	uzupelnij(&a5);

	int wybor = 0;
	int numer = 0;

	while (true)
	{
		system("cls");
		wypiszWszystkie(&a1, &a2, &a3, &a4, &a5);
		wypiszMenu();
		cin >> wybor;

		switch (wybor)
		{
		case 1:

			numer = rezerwacja();

			switch (numer) {
			case 1:
				rezerwuj(&a1);
				break;
			case 2:
				rezerwuj(&a2);
				break;
			case 3:
				rezerwuj(&a3);
				break;
			case 4:
				rezerwuj(&a4);
				break;
			case 5:
				rezerwuj(&a5);
				break;
			default:
				cout << "Nie ma tyle autobusow" << endl;
				break;

			}

			break;

		case 2:

			numer = rezerwacja();

			switch (numer) {
			case 1:
				rezerwujSzczegolowo(&a1);
					break;
			
			case 2:
				rezerwujSzczegolowo(&a2);
					break;
			case 3:
				rezerwujSzczegolowo(&a3);
				break;
			case 4:
				rezerwujSzczegolowo(&a4);
				break;
			case 5:
				rezerwujSzczegolowo(&a5);
				break;
			default:
				break;
			
			}
		default:
			break;
		}

	}

	return 0;

}
1
    int iloscMiejsc;
    char *tablicaWolnychMiejsc = new char[iloscMiejsc];

Jaką wartość ma iloscMiejsc?

0

@kq: Sugerujesz zrobić konstruktor z wartosciami domyślnymi?

2

Sugeruję aby nie używać zmiennych o nieokreślonych wartościach, bo to UB. A tak swoją drogą, zalecam lekturę:
https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0

Przecież kompilator daje ostrzeżenie!
Wystarczy przeczytać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1