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

Warunek z tablica dwuwymiarowa przestaje rysowac plansze o prostokatnych wymiarach

Ostatnio zmodyfikowano 2017-01-06 15:00
Autor Wiadomość
Hashiyan
Temat założony przez niniejszego użytkownika
Warunek z tablica dwuwymiarowa przestaje rysowac plansze o prostokatnych wymiarach
» 2017-01-06 15:00:37
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.

C/C++
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;
}

C/C++
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;
}

C/C++
#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.


C/C++
// 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;

[EDIT]
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.
P-156098
« 1 »
  Strona 1 z 1