Problem z coutem - exception 0xC0000005
Ostatnio zmodyfikowano 2016-02-16 20:48
Bonobo Temat założony przez niniejszego użytkownika |
Problem z coutem - exception 0xC0000005 » 2016-02-15 10:05:43 Witam Zacząłem pisać pewien program na laptopie, i przerzuciłem go na PC ponieważ na laptopie działy się dziwne rzeczy( skopiowany, działający kod nie działał poprawnie). No i o ile na laptopie chociaż plansza się rysowała na konsoli tak tutaj wywala mi debugger błąd Exception thrown at 0x6760AAAC (ucrtbased.dll) in Snake.exe: 0xC0000005: Access violation reading location 0x20202034. Nic by mnie nie zdziwiło gdyby nie to że debugger pokazuje mi to samo przy każdym "cout". Mogę wszystko wykomentować i dodać cout << endl; w konstruktorze - wyskoczy to samo. Nie wiem co się dzieję.. Tutaj kod: #include <iostream> #include "Plansza.h" #include "Waz.h"
using namespace std;
int main() { srand( time( NULL ) ); Plansza * mapa = new Plansza( 35, 35 ); mapa->rysowanieMapy(); while( true ) { mapa->jedzenie(); } return 0; }
#include "Plansza.h"
Plansza::Plansza( int szerokosc, int wysokosc ) { this->dostepneJedzenie = false; this->szerokosc = szerokosc; this->wysokosc = wysokosc; this->mapa = new char( szerokosc * wysokosc ); for( int i = 0; i < wysokosc; i++ ) { for( int j = 0; j < szerokosc; j++ ) { this->mapa[ i * szerokosc + j ] = ' '; } } this->hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); this->ccur.bVisible = false; this->ccur.dwSize = sizeof( CONSOLE_CURSOR_INFO ); }
void Plansza::rysowanieMapy() { BOOL WINAPI SetConsoleCursorInfo( HANDLE hConsoleOutput, const CONSOLE_CURSOR_INFO * lpConsoleCursorInfo ); SetConsoleCursorInfo( hStdOut, & ccur ); for( int i = 0; i < wysokosc; i++ ) { for( int j = 0; j < szerokosc; j++ ) { SetConsoleTextAttribute( hStdOut, BACKGROUND_GREEN ); cout << this->mapa[ i * szerokosc + j ]; } cout << endl; } }
#pragma once #include <iostream> #include <Windows.h> #include <time.h> #include <cstdlib> #include <conio.h> using namespace std;
class Plansza { public: int szerokosc, wysokosc, punktJadalny, x, y; char * mapa; bool dostepneJedzenie; COORD jedzonko; HANDLE hOut; HANDLE hStdOut; CONSOLE_CURSOR_INFO ccur; Plansza( int szerokosc, int wysokosc ); ~Plansza(); void jedzenie(); void rysowanieMapy(); };
|
|
Monika90 |
» 2016-02-15 10:17:20 this->mapa = new char( szerokosc * wysokosc );
Alokujesz tylko jeden znak. Używaj std::vector zamiast new. |
|
Bonobo Temat założony przez niniejszego użytkownika |
» 2016-02-15 11:27:47 Wystarczyło zamienić () na [].. Zastanawia mnie tylko dlaczego na laptopie działało z tymi nawiasami? Wynik na konsoli dokładnie ten sam. I czemu w przypadku takiego błędu podświetlało mi cout-y, zamiast pokazać jakiś błąd w konstruktorze? |
|
pekfos |
» 2016-02-16 20:48:39 czemu w przypadku takiego błędu podświetlało mi cout-y, zamiast pokazać jakiś błąd w konstruktorze? |
Jeśli komputer miałby być mądrzejszy od ciebie, to byłbyś dla niego zbędny. Błędnie użyłeś zaalokowanego obszaru. Kto ma ci stwierdzić, by błędnie użyłeś dobrego obszaru, czy dobrze użyłeś złego? Zawsze dostaniesz bezpośrednią przyczynę błędu, a nie dokładną, w zestawie z rachunkiem od prywatnego detektywa. |
|
« 1 » |