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.php?id=e4d0f1d072a4de5a17957a1908b9b31c102

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