首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

各位!一个简单的windows api程序有关问题!

2012-11-03 
求助各位!!!一个简单的windows api程序问题!!!!初学api,在写这个扫雷游戏,提示错误啊啊啊啊啊!!!请问哪位

求助各位!!!一个简单的windows api程序问题!!!!
初学api,在写这个扫雷游戏,提示错误啊啊啊啊啊!!!请问哪位能帮我看看问题在哪里啊?实在感谢!!!




下面是代码,谢谢!!!

C/C++ code
/************************************************  MineSweeper Program ******************************************** ********************************************************************************************************************************/#include"stdafx.h"                                                     #include <windows.h>#include <stdio.h>#include"mineswepper.h"#define MineNum 10 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);struct Block {    bool ifOpened;  //if the block has been clicked    bool ifMined;   //if the block contains a mine    bool ifFlaged;  //if user has flgged the block as a mine    int surroundedMines; //How many mines around the target block };static Block blocks[20][20];int minesAround(int i,int l);void looping(int i,int l);static int bmX = 0;static int bmY = 0;static int mouseX;static int mouseY;static int row = 20;static int coloum = 20; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){   TCHAR szAppName[]=TEXT("Minesweeper");   TCHAR szClassName[]=TEXT("MinesweeperClassName");   HWND hwnd;   MSG msg;   WNDCLASS wndclass;   wndclass.style=CS_HREDRAW | CS_VREDRAW;   wndclass.lpfnWndProc =WndProc;   wndclass.cbClsExtra =0;   wndclass.cbWndExtra =0;   wndclass.hInstance =hInstance;   wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);   wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);   wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);   wndclass.lpszMenuName =NULL;   wndclass.lpszClassName =szClassName;   RegisterClass(&wndclass);   hwnd=CreateWindow(szClassName,TEXT("Mineswepper"), WS_OVERLAPPEDWINDOW &~ WS_SIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,                 CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);   ShowWindow(hwnd,nCmdShow);   UpdateWindow(hwnd);   while (GetMessage(&msg,NULL,0,0))   {        TranslateMessage(&msg);        DispatchMessage(&msg);   }   return msg.wParam ;} LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){      PAINTSTRUCT ps;   HDC hdc , hdcMem;   HBITMAP hBitmap;   BITMAP bm;   switch (message)    {       case WM_CREATE:      {                     for(int i=0;i<row;++i)         {            for(int l=0;l<coloum;++l)            {               blocks[i][l].ifMined=false;               blocks[i][l].ifFlaged=false;               blocks[i][l].ifOpened=false;            }         }         for(int i=0;i<10;++i)         {             int x=rand()%20;             int y=rand()%20;             blocks[x][y].ifMined=true;         }         hBitmap=(HBITMAP)LoadImage(NULL,TEXT("Blocks.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);         GetObject(hBitmap,sizeof(BITMAP),&bm);         bmX=bm.bmWidth;         bmY=bm.bmHeight;         return 0;      }      case WM_PAINT:      {                hdc=BeginPaint(hwnd,&ps);                hdcMem=CreateCompatibleDC(hdc);                for(int i=0;i<row;++i)                {                    for(int l=0;l<coloum;++l)                    {                                                if(blocks[i][l].ifOpened==true)                        {                            if(blocks[i][l].ifMined==true)                            {                                hBitmap=(HBITMAP)LoadImage(NULL,TEXT("openMneBlk.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                DeleteObject(SelectObject(hdcMem,hBitmap));                            }                            else                            {                                if(blocks[i][l].surroundedMines==0)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("mineKEYDOWN.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==1)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==2)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==3)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("3.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==4)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("4.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==5)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("5.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==6)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("6.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==7)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("7.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                                else if(blocks[i][l].surroundedMines==8)                                    {                                        hBitmap=(HBITMAP)LoadImage(NULL,TEXT("8.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                                        DeleteObject(SelectObject(hdcMem,hBitmap));                                    }                            }                        }                        else                        {                            hBitmap=(HBITMAP)LoadImage(NULL,TEXT("Blocks.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);                            DeleteObject(SelectObject(hdcMem,hBitmap));                        }                        BitBlt(hdc,(i*bmX),(l*bmY),bmX,bmY,hdcMem,0,0,SRCCOPY);                    }                }                EndPaint(hwnd,&ps);                DeleteDC(hdcMem);                return 0;      }      case WM_LBUTTONUP:      {         mouseX=LOWORD(lParam);         mouseY=HIWORD(lParam);         int box_Y = (mouseX/bmX);         int box_X = (mouseY/bmY);         if( (mouseX<(coloum*bmX)) && (mouseY<(row*bmY)) )         {             if(blocks[box_Y][box_X].ifOpened==true)             {return 0;}             else             {                 looping(box_Y,box_X);                 InvalidateRect(hwnd,NULL,true);                 return 0;             }         }         return 0;      }      case WM_CHAR:          switch(wParam)            {case 'x':                    for(int i=0;i<row;++i)                    {                        for(int l=0;l<coloum;++l)                        {                            blocks[i][l].ifOpened=true;                            blocks[i][l].surroundedMines=minesAround(i,l);                        }                    }                    InvalidateRect(hwnd,NULL,true);                    return 0;          }      case WM_DESTROY:         {             PostQuitMessage(0);             return 0;         }   } return DefWindowProc(hwnd,message,wParam,lParam);}int minesAround(int i,int l){    int MineNumCount=0;     //for counting the mines around    // They are the codes for counting the mines around the block(down)    if( (i != 0) && (l != 0) )    {        if(blocks[i-1][l-1].ifMined==true)            {++MineNumCount;}    }    if(i != 0)    {        if(blocks[i-1][l].ifMined==true)            {++MineNumCount;}        if( l<(coloum-1) )        {if(blocks[i-1][l+1].ifMined==true)            {++MineNumCount;}        }    }    if(l != 0)    {        if(blocks[i][l-1].ifMined==true)            {++MineNumCount;}        if( i<(row-1) )        {if(blocks[i+1][l-1].ifMined==true)            {++MineNumCount;}}    }    if( l<(coloum-1) )    {    if(blocks[i][l+1].ifMined==true)                {++MineNumCount;}        if( i<(row-1) )        {if(blocks[i+1][l+1].ifMined==true)                {++MineNumCount;}}    }    if( i<(row-1) )    {if(blocks[i+1][l].ifMined==true)                {++MineNumCount;}}    return MineNumCount;}void looping(int i,int l){    blocks[i][l].ifOpened=true;    if(minesAround(i,l)>0)    {        blocks[i][l].surroundedMines=minesAround(i,l);        return;    }    else    {        if(blocks[i-1][l-1].ifOpened==false)        {looping((i-1),(l-1));}        if(blocks[i-1][l].ifOpened==false)        {looping((i-1),l);}        if(blocks[i][l-1].ifOpened==false)        {looping(i,(l-1));}        if(blocks[i][l+1].ifOpened==false)        {looping(i,(l+1));}        if(blocks[i+1][l-1].ifOpened==false)        {looping((i+1),(l-1));}        if(blocks[i+1][l].ifOpened==false)        {looping((i+1),l);}        if(blocks[i+1][l].ifOpened==false)        {looping((i+1),l);}        if(blocks[i+1][l+1].ifOpened==false)        {looping((i+1),(l+1));}    }} 

提示错误:“Unhandled exception at 0x0019266a in mineswepper.exe: 0xC0000005: Access violation writing location 0x00197fa0.”

[解决办法]
调试运行,然后查看堆栈,看错误具体指向哪里
[解决办法]
好长。。。
[解决办法]
Debug下调试一下,看看哪里函数返回失败了?
[解决办法]
f5跟踪
[解决办法]
N多资源文件没有,本来帮你调试了。

根据错误来看,应该是内存操作问题。踩内存了。

崩溃后用callstack查看崩溃地点来定位。这里只能提供解决的思路。

细致定位需要一定环境条件。楼主加油

热点排行