Wingsun、TR@SOE诸位高手老大帮忙看看吧!

ajun21century 2001-09-03 09:32:52
各位大虾,小弟编程试遇到一个问题,程序编译通过一点问题没有,但是关闭窗体的时候提示某段指令引用的某段内存不能为read,我在formclose事件里已经释放了数组的内存和应该释放的对象变量,为什么会这样呢?
问题不是出在关闭窗口时的代码,我把它屏蔽掉以后一样出毛病,我把代码贴出来吧,大家帮我看看。是一个五子棋程序。
#include <vcl.h>
#pragma hdrstop

#include "five_f.h"
#include "mem.h"
#include "string.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//画棋盘
void TForm1::DrawGame()
{
int step,width;
step=20;
width=280;
PaintBox1->Canvas->Pen->Color=clBlack;
PaintBox1->Canvas->Brush->Color=clBlack;
for(int i=0;i<15;i++)
{
PaintBox1->Canvas->MoveTo(0,step*i);
PaintBox1->Canvas->LineTo(width,step*i);
PaintBox1->Canvas->MoveTo(step*i,0);
PaintBox1->Canvas->LineTo(step*i,width);
if(i==3¦¦i==7¦¦i==11) //画要点
{
for(int j=3;j<12;j+=4)
{
PaintBox1->Canvas->MoveTo(j*20,i*20);
PaintBox1->Canvas->Ellipse(j*20-3,i*20-3,j*20+3,i*20+3);
}
}
}
}
//----------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
DrawGame();
if(Stepnum>=1)
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
if(qizi[i][j])
DrawQizi(qizi[i][j],i,j);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int step,hang,lie;
step=Stepnum%2==0?1:2;
hang=Y%20<10?Y/20:Y/20+ 1;
lie=X%20<10?X/20:X/20+1;
if(SetQizi(step,hang,lie))
{
DrawQizi(step,hang,lie);
Stepnum++;
}
else
Application->MessageBoxA("落子错误!","提示!",MB_OK);
if(Iswin(step,hang,lie))
{
Application->MessageBoxA("赢了!","提示!",MB_OK);
PaintBox1->Canvas->Brush->Color=clBtnFace;
PaintBox1->Canvas->FillRect(Form1->Canvas->ClipRect);
DrawGame();
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
qizi[i][j]=0;
Stepnum=0;
}
}
//---------------------------------------------------------------------------
//判断是否5子连成一线
bool TForm1::Iswin(int player,int hang,int lie)
{
for(int i=4;i>=0;i--)
//遍历行
{
if(qizi[hang][lie-i]==player&&
qizi[hang][lie-i+1]==player&&
qizi[hang][lie-i+2]==player&&
qizi[hang][lie-i+3]==player&&
qizi[hang][lie-i+4]==player)
return(true);
//遍历列
if(qizi[hang-i][lie]==player&&
qizi[hang-i+1][lie]==player&&
qizi[hang-i+2][lie]==player&&
qizi[hang-i+3][lie]==player&&
qizi[hang-i+4][lie]==player)
return(true);
//遍历两对角线
if(qizi[hang-i][lie+i]==player&&
qizi[hang-i+1][lie+i-1]==player&&
qizi[hang-i+2][lie+i-2]==player&&
qizi[hang-i+3][lie+i-3]==player&&
qizi[hang-i+4][lie+i-4]==player)
return(true);
//*************
if(qizi[hang-i][lie-i]==player&&
qizi[hang-i+1][lie-i+1]==player&&
qizi[hang-i+2][lie-i+2]==player&&
qizi[hang-i+3][lie-i+3]==player&&
qizi[hang-i+4][lie-i+4]==player)
return(true);
}
return(false);
}
//-------------------------------------------------------------------------
//将棋子信息赋值给数组
bool TForm1::SetQizi(int player,int hang,int lie)
{
if(!qizi[hang][lie])
{qizi[hang][lie]=player;
return(true);
}
return(false);
}
//--------------------------------------------------------------------------
//画棋子
void TForm1::DrawQizi(int player,int hang,int lie)
{
if(player==1)
PaintBox1->Canvas->Brush->Color=clBlack;
else
PaintBox1->Canvas->Brush->Color=clWhite;
PaintBox1->Canvas->Ellipse(lie*20-10,hang*20-10,lie*20+10,hang*20+10);}
//-----------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//初始化步数和棋子数组
Stepnum=0;
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
qizi[i][j]=0;
Edit1->Text="";
Edit1->Enabled=false;
}
//---------------------------------------------------------------------------
//按理说问题出在下面的代码,但是我已经屏蔽掉了,也一样出错!!!
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//memset(qizi,0,sizeof(short)*225);
//Application->Terminate();
}
//---------------------------------------------------------------------------
//监视鼠标位置
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
Edit1->Text=IntToStr(X)+","+IntToStr(Y)+","+IntToStr(Stepnum);
}
//---------------------------------------------------------------------------

...全文
52 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajun21century 2001-09-04
  • 打赏
  • 举报
回复
哦,对对对!谢谢TR@SOE老大!
  • 打赏
  • 举报
回复
关键在于qizi的定义...
TR@SOE 2001-09-03
  • 打赏
  • 举报
回复
if(qizi[hang][lie-i]==player&&
qizi[hang][lie-i+1]==player&&
qizi[hang][lie-i+2]==player&&
qizi[hang][lie-i+3]==player&&
qizi[hang][lie-i+4]==player

你的qizi数组是如何定义的?如果i=4,而lie=3,那么lie-i=-1,不是已经越过了数组的边界?这里肯定是有问题的啊。对列和对角的判断,也存在类似的问题。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧