Odczytywanie pojedynczego znaku ze zmiennej typu string

0

Drodzy Współprogramiści :D
W ramach ćwiczenia się w c++ zacząłem tworzyć małą grę w konsoli. Zrobiłem coś w rodzaju bufora - tablicę zawierającą wszystkie znaki, które mają się wyświetlić. Postanowiłem stworzyć funkcję, taką jak ta:

int WriteText(int nY, int nX, std::string strText, bool bCenter = false)
{
	int nLength = strText.length();

        // jeżeli bCenter == true wyśrodkuj
	if (bCenter) nX = 40-(nLength-nLength%2)/2-1-nLength%2;

        //pętla wpisywania
	for (int i = 0; i < nLength; ++i)
		Plansza[nY][nX+i] = strText[i]; // po dodaniu tego zaczął się pojawiać problem

	return 0;
} 

Ma ona wpisać dany tekst do mojej Planszy (24x80) literka po literce. Program uruchamia się i spełnia swoje zadanie, ale po dodaniu tej funkcji zamknięcie konsoli powoduje błąd:
Unhandled exception at 0x103206db (msvcr100d.dll) in Game in console.exe: 0xC0000005: Access violation writing location 0x00411163.

Odnosi mnie on do pliku dbgrpt.h, do linijki:

_VALIDATE_RETURN(mode == _CRT_RPTHOOK_INSTALL || mode == _CRT_RPTHOOK_REMOVE, EINVAL, -1);

Nigdzie nie potrafię znaleźć odpowiedzi jak naprawić ten wyciek... Proszę o pomoc i wyrozumiałość :)

dodanie znaczników <code class="cpp"> - furious programming

0
 if(bCenter) nX=(80-nLength)/2;
 if(nLength<80) memcpy(&Plansza[nY][nX],strText.c_str(),nLength);
0

Niestety, wciąż:

Unhandled exception at 0x103206db (msvcr100d.dll) in Game in console.exe: 0xC0000005: Access violation writing location 0x00411163.

dodanie znacznika <quote> dla treści błędu - furious programming

0

Więc to nie w tym miejscu.

0

Ale ze mnie debil... :O
No, rzeczywiście :'(
Ale zastanawia mnie w wyniku czego doszło do błędu ochrony pamięci, skoro nie użyłem jeszcze wskaźników, ani nigdzie nie przekroczyłem indeksu...
Jeszcze jedno małe pytanie. Co może wywoływać access violation przy kończeniu funkcji main() poprzez zwrócenie zera?

0

Zwolnienie czegoś co nie zostało przydzielone, mazanie po pamięci.

0

Właśnie dlatego nw co jest, bo nie próbowałem zwalniać niczego, bo jeszcze nie użyłem wskaźników. Co masz na myśli przez mazanie po pamięci?

0

Mazanie po pamięci - wpisywanie czegoś w nieprzydzielone miejsce.

0

Tego też nie robiłem :/
Dziękuję za chęci :)
Prześpie się z tym, może coś wymyślę...
Jak mi się uda to dam znać :3

0

Gdyby twoje stwierdzenie: - "Tego też nie robiłem" miało jakąkolwiek miarodajność to nie prosiłbyś tu o pomoc.

0

Nie zamierzam się z tobą kłócić. Mogę to udowodnić wysyłając cały kod, ale nie chcę.
Po dłuższej analizie wywaliłem taki fragment kodu:

 for (int i = 0; i < 80; ++i) // tworzenie ramki
{
	Plansza [0][i] = 'X'; // góra
	Plansza [23][i] = 'X'; // dół
	if (i > 0 && i < 79)
	{
		Plansza [i][0] = 'X'; // lewo
		Plansza [i][79] = 'X'; // prawo
	}
}

Problem przestał się pojawiać. Nie mam bladego pojęcia w jaki sposób ten fragment powodował błąd...

IDIOTA ZE MNIE.
FACEPALM
ARRRRRRRRR...
Przecież moja plansza ma tylko 24 wysokości... :(
Przepraszam za zbędny wątek...

0

Dlatego powinienes:

  • unikac magic numbers. Zadeklaruj int const sizeOfBoardWidth = 24; i juz bedzie lepiej
  • uzywac kolekcji a nie tablic (np vector)
  • uzywac debuggera.
0
const int TableHeight=24;
const int TableWdth=80;
for(int y=0;y<TableHeight;++y) for(int x=0;x<TableWidth;++x) Plansza[y][x]=(0<y&&y<TableHeight-1&&0<x&&x<TableWdth-1)?' ':'X';

I nie ma żadnej możliwości się pomylić.

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