none
十万火急求帮助啊 Dubug assertion failed line146 RRS feed

  • 问题

  • 用vs2010仿照别人代码写了一个程序 结果运行之后 就出错了 debug assertion failed  

    f:\dd\vctools\vc7libs\ship\almfc\include\afxwin2.ini line146

    之后又用VC6重新写了一遍 还是一样的错误 后来又在project里面的setting里面在C/C++的preprocessor的undefined symbols添加了_DEBUG 能消去了 但是每次消屏幕都在闪 不知道为什么

    // llkDlg.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "llk.h"
    #include "llkDlg.h"
    #include "afxdialogex.h"
    
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endifa
    
    #define IDC_BLOCK 2000
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
    
    class CAboutDlg : public CDialogEx
    {
    public:
        CAboutDlg();
    
    // 对话框数据
        enum { IDD = IDD_ABOUTBOX };
    
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    // 实现
    protected:
        DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // CllkDlg 对话框
    
    
    
    
    CllkDlg::CllkDlg(CWnd* pParent /*=NULL*/)
        : CDialogEx(CllkDlg::IDD, pParent)
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CllkDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CllkDlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
    END_MESSAGE_MAP()
    
    
    // CllkDlg 消息处理程序
    
    BOOL CllkDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
    
        // 将“关于...”菜单项添加到系统菜单中。
    
        // IDM_ABOUTBOX 必须在系统命令范围内。
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);
    
        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
            BOOL bNameValid;
            CString strAboutMenu;
            //bNameValid = 
                strAboutMenu.LoadString(IDS_ABOUTBOX);
            //ASSERT(bNameValid);
            if (!strAboutMenu.IsEmpty())
            {
                pSysMenu->AppendMenu(MF_SEPARATOR);
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
            }
        }
    
        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);            // 设置大图标
        SetIcon(m_hIcon, FALSE);        // 设置小图标
    
        // TODO: 在此添加额外的初始化代码
    
        //地图大小1000*625
        Start(1);
        MoveWindow(0,0,1000,625);
        CenterWindow();
    
        //m_isStart = FALSE
    
    
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CllkDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
            CAboutDlg dlgAbout;
            dlgAbout.DoModal();
        }
        else
        {
            CDialogEx::OnSysCommand(nID, lParam);
        }
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CllkDlg::OnPaint()
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // 用于绘制的设备上下文
    
            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
            // 使图标在工作区矩形中居中
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
    
            // 绘制图标
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            //CDialogEx::OnPaint();
            //CDialog::OnPaint();
            CPaintDC  dc(this);   
            CRect  rect;   
            GetClientRect(&rect);   
            CDC  dcMem;   
            dcMem.CreateCompatibleDC(&dc);   
            CBitmap  bmpBackground;   
            bmpBackground.LoadBitmap(IDB_BITMAP1);  
            //IDB_BITMAP是你自己的图对应的ID
            BITMAP  bitmap;   
            bmpBackground.GetBitmap(&bitmap);   
            CBitmap  *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   
                bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); 
        }
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CllkDlg::OnQueryDragIcon()
    {
        return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    //////////开始游戏////////////
    void CllkDlg::Start(int level)
    {
            ;
        m_level = level;
        
        m_time = 90;
    
        InitMap(map);
    
        ShowMap(map);
    
        m_p = NULL;
        CRgn rgn;
        rgn.CreateRectRgn(420, 0, 560, 160);
        m_isStart = TRUE;
    
    }
    
    //////////初始化棋盘数组////////////
    void CllkDlg::InitMap(int map[][MAXY])
    {
        //初始化边界
        int x,y;
        int i,j;
        for (i=0;i<MAXX;i++)
        {
            for (j=0;j<MAXY;j++)
            {
                if (i==0 || i==MAXX-1 || j==0 || j==MAXY-1)
                {
                    map[i][j] = -1;
                } 
                else
                {
                    map[i][j] = 0;
                }
            }
        }
    
        srand((unsigned int)time(NULL));
        //初始化地图
        for (i = 0 ; i<SAME ; i++)
        {
            for (j = 1 ; j<=TYPENUM ; j++)
            {
                x = rand()%MAXX;
                y = rand()%MAXY;
                if (map[x][y])
                {
                    j--;
                } 
                else
                {
                    map[x][y] = j;
                }
            }
        }
    
    }
    
    
    //////////转换棋盘数组中数据为图片显示////////////
    void CllkDlg::ShowMap(int map[][MAXY])
    {
        this->Invalidate();
        int i,j;
        POINT p;
        CString str;
    
        //清除所有按钮
        for(i=0; i<m_cmGroup.GetSize(); i++)
            delete (ChessMan *)m_cmGroup.GetAt(i);
    
        m_cmGroup.RemoveAll();
        for(i=1; i<MAXX-1; i++)
        {
            for(j=1; j<MAXY-1; j++)
            {
                p.x = i;
                p.y = j;
                m_cmGroup.Add(new ChessMan(map[i][j], p));
            }
        }
        for(i=0; i<(MAXX-2)*(MAXY-2); i++)
        {
            ChessMan *btn = (ChessMan *)m_cmGroup.GetAt(i);
    
            btn->Create(str, WS_CHILD|BS_BITMAP, //注意属性!!!
                //游戏区位
                CRect(160+(i%(MAXY-2))*48, 70+(i/(MAXY-2))*48, 208+(i%(MAXY-2))*48, 118+(i/(MAXY-2))*48), this, IDC_BLOCK+i);
            if(btn->m_id)//如果为0则不显示
            {
                str.Format("res\\%d.bmp", btn->m_id);
                HBITMAP m_fkBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), str, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
                if(m_fkBmp == NULL) 
                {
                    if(MessageBox("缺少图片资源!", "错误", MB_ICONERROR|MB_OK) == IDOK)
                    {
                        CDialog::OnCancel();
                        return;
                    }
                }    
                btn->SetBitmap(m_fkBmp);
                btn->ShowWindow(SW_SHOW);
            }
            else
            {
                btn->ShowWindow(SW_HIDE);
            }
        }
    
    
    
    }
    
    void CllkDlg::RefreshMap()
    {
        CRgn resultRgn;
        resultRgn.CreateRectRgn(90,30,690,430);
        CRgn tmpRgn;
        tmpRgn.CreateRectRgn(0,0,0,0);
        for(int i=0; i<MAXX; i++)
        {
            for(int j=0; j<MAXY; j++)
            {
                CRect rect;
                CRgn srcRgn;
    
                if(map[i][j]==-1 || map[i][j]==0)
                {
                    rect.top = 60 + i*48;
                    rect.bottom = 108 + i*48;
                    rect.left = 90 + j*48;
                    rect.right = 138 + j*48;
    
                    srcRgn.CreateRectRgnIndirect(&rect);
                    //把消去的区域加进来(覆盖原有区域),以便刷新
                    resultRgn.CombineRgn(&srcRgn,&tmpRgn,RGN_OR);
                    tmpRgn.CopyRgn(&resultRgn);
                }
            }
        }
        //只刷新被消去的区域,防止界面闪烁
        this->InvalidateRgn(&resultRgn);
    }
    

    2012年8月25日 1:09

答案

  • 出现ASSERT断言错误,您应该Debug调试,打开call stack看函数调用堆栈,可以找到出错的函数调用

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年8月25日 2:13
    版主