Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z coutem - exception 0xC0000005

Ostatnio zmodyfikowano 2016-02-16 20:48
Autor Wiadomość
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:
C/C++
#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 ]; // tutaj wyrzuca błąd po raz pierwszy, nic wspólnego z wartością,zmieniałem również na ""
        }
        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();
};
P-144885
Monika90
» 2016-02-15 10:17:20
C/C++
this->mapa = new char( szerokosc * wysokosc );
Alokujesz tylko jeden znak. Używaj std::vector zamiast new.
P-144886
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?
P-144889
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.
P-144938
« 1 »
  Strona 1 z 1