Tablica dwuwymiarowa niszczy narysowana plansze w konsoli

0

Cześć,
nowy dzień, nowe wyzwania. Nie przeprowadziłem wystarczających testow i wczoraj scommitowalem wersje z bledem. Po kilkudziesieciu minutach w koncu doszedlem, gdzie jest bug, nie wiem tylko dlaczego, a skoro nie wiem dlaczego, nie wiem jak go usunac.

void ConsoleSettings()
{
	int Width;
	int Height;

	std::cout << "Podaj szerokosc pola w zakresie od 5 do 40: ";
	std::cin >> Width;

	if (Width < 5 || Width > 40)
	{
		InputError(Width);
	}
	std::cout << "Podaj wysokosc pola w zakresie od 5 do 40: ";
	std::cin >> Height;

	if (Height < 5 || Height > 40)
	{
		InputError(Height);
	}

	BoardProperties ConsoleSize;
	ConsoleSize.Width = Width;
	ConsoleSize.Height = Height;

	//----------------------------------------------------------------------------------------------
	std::cout << "ConsoleSize.Width = " << ConsoleSize.Width << std::endl;					//Test struktury
	std::cout << "ConsoleSize.Height = " << ConsoleSize.Height << std::endl;
	//----------------------------------------------------------------------------------------------

	DefineFields(ConsoleSize);

	return;
}
 
void DefineFields(struct BoardProperties ConsoleSize)
{
	char **Board;
	Board = new char *[ConsoleSize.Width];
	for (int i = 0; i < ConsoleSize.Width; i++)
	{
		Board[i] = new char[ConsoleSize.Height];
	}

	for (int j = 0; j < ConsoleSize.Width; j++)
	{
		for (int k = 0; k < ConsoleSize.Height; k++)
			Board[j][k] = 'e';								//e - Empty field
	}

	//------------------------------------------------------------------------------------------------
	/*for (int i = 0; i < Size.Width; i++)
	{
	for (int j = 0; j < Size.Height; j++)					//test tablicy
	{
	std::cout << Board[i][j];
	}
	}*/
	//------------------------------------------------------------------------------------------------

	int SnakePosX, SnakePosY;
	int FoodPosX, FoodPosY;

	/*srand(time(NULL));

	SnakePosX = rand() % Size.Width;
	SnakePosY = rand() % Size.Height;

	Board[SnakePosX][SnakePosY] = 's';						//s - Snake on field

	do
	{
		FoodPosX = rand() % Size.Width;
		FoodPosY = rand() % Size.Height;
	} while (Board[FoodPosX][FoodPosY] != 'e');
	Board[FoodPosX][FoodPosY] = 'f';						//f- Food on field
	*/
	//for (;;)
	//{
		system("cls");
		// GORNA RAMA------------------------------------------------------------------------------------
		for (int i = 0; i <= ConsoleSize.Width; i++)
		{
			std::cout << "--";
		}
		// BOCZNE RAMY-----------------------------------------------------------------------------------
		for (int j = 0; j < ConsoleSize.Height; j++)
		{
			std::cout << std::endl << "|";

			for (int k = 0; k < ConsoleSize.Width; k++)
			{
				if (Board[j][k] == 'e')
				{
				std::cout << "  ";
				}
				/*if (Board[j][k] == 's')
				{
					std::cout << " o";
				}
				if (Board[j][k] == 'f')
				{
					std::cout << " x";
				}*/
			}
					std::cout << "|";
			}
		std::cout << std::endl;
		// DOLNA RAMA-------------------------------------------------------------------------------------
		for (int l = 0; l <= ConsoleSize.Width; l++)
		{
			std::cout << "--";
		}
		std::cout << std::endl;
	//}

	Sleep(500);

	return;
}
 
#pragma once

struct BoardProperties
{
	int Width;
	int Height;
};
 

**Problem dotyczy rysowania planszy w funkcji DefineFields(). W momencie, gdy chce wstawic warunek if (Board[j][k] == 'e') { std::cout << " ";}, nie moge utworzyc tablicy o dlugosci gornej i dolnej krawedzi roznych od dlugosci bocznych krawedzi. Gdy podaje takie same wartosci, rysuje mi prawidlowo. Gdy chce miec prostokat - wywala blad. Gdy warunki wstawie w komentarz, buduje prawidlowo nawet board o roznych bokach.
**

// BOCZNE RAMY-----------------------------------------------------------------------------------
		for (int j = 0; j < ConsoleSize.Height; j++)
		{
			std::cout << std::endl << "|";

			for (int k = 0; k < ConsoleSize.Width; k++)
			{
				**if (Board[j][k] == 'e')
				{**
				std::cout << "  ";
				**}
				/*if (Board[j][k] == 's')
				{
					std::cout << " o";
				}
				if (Board[j][k] == 'f')
				{
					std::cout << " x";
				}*/**
			}
					std::cout << "|";
			}
		std::cout << std::endl;
 
0

Zdebuggowalem. Przy wprowadzeniu wymiarow szerokosc: 5, wysokosc: 6 do momentu narysowania kwadratu 5x5 jest ok. Nastepnie buduje 6 element lewej sciany, resetuje wartosc int k, przechodzi do warunku if(Board[j][k] == 'e' i wywala:

Exception thrown at 0x00172B26 in Snake.exe: 0xC0000005: Access violation reading location 0xFDFDFDFD.
If there is a handler for this exception, the program may be safely continued.

1

Wszystkie pętle iterujące po planszy tworzysz w taki sposób, że pierwsza (zewnętrzna) oznacza zmienną x (0..width-1), a druga - y (0..height-1).
Wszystkie, oprócz jednej ;-)

0

Kurcze, stary (wybacz spoufalenie), jestes genialny.

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