Tablice dynamiczne, błąd przy kompilacji (gra saper)

0

Witam, mam problem z tablicami dynamicznymi. Mianowicie przy kompilacji wyskakuje błąd: http://www.fotoload.pl/index.[...]d072a4de5a17957a1908b9b31c102

W załączniku cały program.
Jakieś pomysły?
Pozdrawiam
Unit1.h :

private:    // User declarations
        int **TabCase;
        int **TabVal;
        int NbMine;
        int RozPola;
        bool wygrana;
        void __fastcall Initialisation();
        void __fastcall Odkrywaj(int x,int y);

Kod:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Initialisation()
{
int x, y;
wygrana = false ;
TabCase = new int *[RozPola];
TabVal = new int *[RozPola];
for ( int i = 0; i < RozPola; ++i )
{
   TabCase[i] = new int [RozPola];
   TabVal[i] = new int [RozPola];
}
randomize();
for (int z=0 ; z < NbMine ; z++)
{
    x = rand() % RozPola ;
    y = rand() % RozPola ;
    TabVal[x][y] = 10;
}
for (x=0 ; x < 16; x++)
    for (y=0 ; y < 16; y++)
        if (TabVal[x][y] >= 10)
        {
            if(y<=14)
                TabVal[x][y+1]++;
            if(y>0)
                TabVal[x][y-1]++;
            if(x<=14)
                TabVal[x+1][y]++;
            if(x<=14 && y<=14)
                TabVal[x+1][y+1]++;
            if(x<=14 && y>0)
                TabVal[x+1][y-1]++;
            if(x>0)
                TabVal[x-1][y]++;
            if(x>0 && y<=14)
                TabVal[x-1][y+1]++;
            if(x>0 && y>0)
                TabVal[x-1][y-1]++;
        }
DrawGrid1->Invalidate();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
NbMine = Edit1->Text.ToInt();
RozPola = Edit2->Text.ToInt();
DrawGrid1->ColCount=RozPola;
DrawGrid1->RowCount=RozPola;
Initialisation();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
DrawGrid1->Canvas->Font->Style = DrawGrid1->Canvas->Font->Style << fsBold;
if(TabCase[ACol][ARow]==0)  //wypełnia tapeblę zakrytymi miejscami
{
    DrawGrid1->Canvas->Brush->Color = clBtnFace;
    DrawGrid1->Canvas->FillRect(Rect);
    DrawEdge(DrawGrid1->Canvas->Handle,&Rect,EDGE_RAISED,BF_RECT);
}
else
{
    DrawGrid1->Canvas->Brush->Color = clWindow;
    DrawGrid1->Canvas->FillRect(Rect);
    if (TabVal[ACol][ARow] >= 10)
        DrawGrid1->Canvas->TextRect(Rect, Rect.Left+7, Rect.Top+7, "M");
    if(TabVal[ACol][ARow]==1)
        DrawGrid1->Canvas->Font->Color = clGreen;
    if(TabVal[ACol][ARow]==2)
        DrawGrid1->Canvas->Font->Color = clBlue;
    if(TabVal[ACol][ARow]>2 && TabVal[ACol][ARow]<9)
        DrawGrid1->Canvas->Font->Color = clRed;
    if (TabVal[ACol][ARow] >= 0 && TabVal[ACol][ARow] < 9)
        DrawGrid1->Canvas->TextRect(Rect, Rect.Left+7, Rect.Top+7,IntToStr(TabVal[ACol][ARow]));
    if (TabVal[ACol][ARow] == 0 )
        DrawGrid1->Canvas->TextRect(Rect, Rect.Left+7, Rect.Top+7, "");   // kasowanie zer w miejscach bez bomb.
}
if(State.Contains(gdFocused))
    DrawGrid1->Canvas->DrawFocusRect(Rect);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::DrawGrid1Click(TObject *Sender)
{
if (wygrana == true)
    return;
bool koniec=true;
int x=DrawGrid1->Col;
int y=DrawGrid1->Row;
TabCase[x][y]=1;
if (TabVal[x][y] >=10)
{
    for (int x=0 ; x < RozPola; x++)
        for (int  y=0 ; y < RozPola; y++)
            TabCase[x][y]=1 ;
    wygrana = true;
    DrawGrid1->Invalidate();
    ShowMessage("Przegrałeś");
        for ( int i=0; i < RozPola; ++i )
        {
            delete [] TabVal[i];
            delete [] TabCase[i];
        }
    delete [] TabVal;
    delete [] TabCase;
    return;
}
if (TabVal[x][y] == 0)
    Odkrywaj(x,y);
do
{
    koniec = false;
    x=0;
    while (x<RozPola)
    {
        y=0;
        while (y<RozPola)
        {
            if (TabCase[x][y] == 2)
            {
                TabCase[x][y] = 1;
                Odkrywaj(x,y);
                koniec = true;
            }
            y++;
        }
        x++;
    }
}
while (koniec);
    DrawGrid1->Invalidate();
wygrana=true;
for (int x=0 ; x < RozPola; x++)
    for (int  y=0 ; y < RozPola; y++)
if(TabCase[x][y]==0 && TabVal[x][y]<10)
    wygrana = false;
if (wygrana == true)
{
    ShowMessage("Gratulacje, wygrałeś!");
    for ( int i=0; i < RozPola; ++i )
    {
        delete [] TabVal[i];
        delete [] TabCase[i];
    }
    delete [] TabVal;
    delete [] TabCase;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Odkrywaj(int x,int y)
{
if(y<=RozPola)
    if (TabVal[x][y+1]>0 || TabCase[x][y+1]==1)
        TabCase[x][y+1]=1;
    else
        TabCase[x][y+1]=2;
if(y>0)
    if (TabVal[x][y-1]>0 || TabCase[x][y-1]==1)
        TabCase[x][y-1]=1;
    else
        TabCase[x][y-1]=2;
if(x<=RozPola)
    if (TabVal[x+1][y]>0 || TabCase[x+1][y]==1)
        TabCase[x+1][y]=1;
    else
        TabCase[x+1][y]=2;
if(x<=RozPola && y<=14)
    if (TabVal[x+1][y+1]>0 || TabCase[x+1][y+1]==1)
        TabCase[x+1][y+1]=1;
    else
        TabCase[x+1][y+1]=2;
if(x<=RozPola && y>0)
    if (TabVal[x+1][y-1]>0 || TabCase[x+1][y-1]==1)
        TabCase[x+1][y-1]=1;
    else
        TabCase[x+1][y-1]=2;
if(x>0)
    if (TabVal[x-1][y]>0 || TabCase[x-1][y]==1)
        TabCase[x-1][y]=1;
    else
        TabCase[x-1][y]=2;
if(x>0 && y<=RozPola)
    if (TabVal[x-1][y+1]>0 || TabCase[x-1][y+1]==1)
        TabCase[x-1][y+1]=1;
    else
        TabCase[x-1][y+1]=2;
if(x>0 && y>0)
    if (TabVal[x-1][y-1]>0 || TabCase[x-1][y-1]==1)
        TabCase[x-1][y-1]=1;
    else
        TabCase[x-1][y-1]=2;
}
1

próbujesz coś odczytać lub zapisać do wskaźnika który jest ustawiony na NULL. Przedebugguj swój program i zobaczysz w której linijce Ci wypieprza błąd.

0

EDIT:
Znalazłem rozwiązanie, trzeba było przypisać wartości NULL do każdego stworzonego elementu

(...)
TabCase = new char *[RozPola];
TabVal = new char *[RozPola];
for ( int i = 0; i < RozPola; ++i )
{
    TabCase[i]="";
    TabVal[i]="";
}
for ( int i = 0; i < RozPola; ++i )
{
    TabCase[i] = new char [RozPola];
    TabVal[i] = new char [RozPola];
}
for ( int i = 0; i < RozPola; ++i )
    for (int k = 0; k < RozPola; ++k)
    {
        TabCase[i][k]=NULL;
        TabVal[i][k]=NULL;
    }

(...)

PS. fasadin, dzięki za sugestię ;)

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