VS编程出现debug assertion failed怎么办?

XURUIHU 2013-04-29 07:01:53
编译运行出现如下情况:


winocc的代码如下:


我的程序代码如下:
// MaintenanceDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Course.h"
#include "MaintenanceDlg.h"
#include "afxdialogex.h"
#include"CourseSelectDlg.h"

// CMaintenanceDlg dialog
CCourseSet m_courseSet;
CCourseLimitSet m_courseLimitSet;
CCourseSet m_courseSelRecSet;
CCourseSelSet m_courseSelSet;
CStudentSet m_studentSet;
CMsflexgrid1 m_flexgrid;

IMPLEMENT_DYNAMIC(CMaintenanceDlg, CDialog)

CMaintenanceDlg::CMaintenanceDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMaintenanceDlg::IDD, pParent)
{

}

CMaintenanceDlg::~CMaintenanceDlg()
{
}

void CMaintenanceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON_DELETE, m_bDelete);
DDX_Control(pDX, IDC_BUTTON_INSERT, m_bInsert);
DDX_Control(pDX, IDC_BUTTON_MODIFY, m_bModify);
DDX_Control(pDX, IDC_COMBO_SELECTCOURSE, m_comboList);
DDX_Control(pDX, IDC_EDIT1, m_edit);
}


BEGIN_MESSAGE_MAP(CMaintenanceDlg, CDialog)
ON_CBN_SELCHANGE(IDC_COMBO_SELECTCOURSE, &CMaintenanceDlg::OnSelchangeComboSelectcourse)
ON_EN_CHANGE(IDC_EDIT1, &CMaintenanceDlg::OnChangeEdit1)
ON_COMMAND(IDC_MSFLEXGRID_MAINTENANCE, &CMaintenanceDlg::OnMsflexgridMaintenance)
ON_BN_CLICKED(IDC_BUTTON_INSERT, &CMaintenanceDlg::OnClickedButtonInsert)
ON_BN_CLICKED(IDC_BUTTON_MODIFY, &CMaintenanceDlg::OnClickedButtonModify)
ON_BN_CLICKED(IDC_BUTTON_DELETE, &CMaintenanceDlg::OnClickedButtonDelete)
ON_BN_CLICKED(IDC_OK, &CMaintenanceDlg::OnClickedOk)
END_MESSAGE_MAP()


// CMaintenanceDlg message handlers

//选择表
void CMaintenanceDlg::OnSelchangeComboSelectcourse()
{
CString strSelected;
// m_comboList.GetWindowTextW(strSelected);
CString sql;
CString strGridItem;
CString strTab=_T("");
strTab.Replace(' ',0x9);
VARIANT vIndex;
vIndex.vt=VT_I2;
int iIndex=1;
m_comboList.GetLBText(m_comboList.GetCurSel(),strSelected);
m_flexgrid.Clear();
if(strSelected=="学生表")
{
sql="select*from student";
tableType=1;
m_flexgrid.put_Cols(4);
m_flexgrid.put_FormatString(L">|<学号|<学生姓名|<性别");
m_flexgrid.put_ColWidth(0,300);
m_flexgrid.put_ColWidth(1,1000);
m_flexgrid.put_ColWidth(2,1000);

m_studentSet.Open();
if(m_studentSet.IsBOF())
return;
m_studentSet.MoveFirst();
while(!m_studentSet.IsEOF())
{
vIndex.iVal=iIndex;
iIndex++;
strGridItem=strTab+m_studentSet.m_sNo+strTab+m_studentSet.m_sName+strTab+m_studentSet.m_sex;
m_flexgrid.AddItem(strGridItem,vIndex);
m_studentSet.MoveNext();
}
m_studentSet.Close();
}
else if(strSelected==_T("课程表"))
{
sql=L"select*from course_rec";
tableType=2;
m_flexgrid.put_Cols(6);
m_flexgrid.put_FormatString(L">|<课程号|<课程名称|<学分|<学时|<时间");
m_flexgrid.put_ColWidth(0,300);
m_flexgrid.put_ColWidth(1,1000);
m_flexgrid.put_ColWidth(2,2200);

m_courseSet.Open();
if(m_courseSet.IsBOF())
return;
m_courseSet.MoveFirst();

while(!m_courseSet.IsEOF())
{
vIndex.iVal=iIndex;
iIndex++;
strGridItem=strTab+m_courseSet.m_cNo+strTab+m_courseSet.m_cName+strTab+m_courseSet.m_cCredit
+strTab+m_courseSet.m_cNum+strTab+m_courseSet.m_cTime;
m_flexgrid.AddItem(strGridItem,vIndex);
m_courseSet.MoveFirst();
}
m_courseSet.Close();
}
else if(strSelected==_T("选课限定表"))
{
sql=L"select*from course_lim";
tableType=3;
m_flexgrid.put_FormatString(L">|<可选课程数|<可选学分数");
m_flexgrid.put_ColWidth(0,300);
m_flexgrid.put_ColWidth(1,2000);
m_flexgrid.put_ColWidth(2,2000);

m_courseLimitSet.Open();
if(m_courseLimitSet.IsBOF())
return;
m_courseLimitSet.MoveFirst();

while(!m_courseLimitSet.IsEOF())
{
vIndex.iVal=iIndex;
iIndex++;
strGridItem=strTab+m_courseLimitSet.m_courseNum+strTab+m_courseLimitSet.m_creditNum;
m_flexgrid.AddItem(strGridItem,vIndex);
m_courseLimitSet.MoveFirst();
}
m_courseLimitSet.Close();
}
SetButtonCrl();
}


void CMaintenanceDlg::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here
CString strText;
GetDlgItemText(IDC_EDIT1,strText);
m_flexgrid.put_Text(strText);
}


void CMaintenanceDlg::OnMsflexgridMaintenance()
{
SetDlgItemTextW(IDC_EDIT1,m_flexgrid.get_Text());
}


void CMaintenanceDlg::OnClickedButtonInsert()
{
VARIANT vIndex;
CString vValue[6];
switch(tableType)
{
case 1:
m_studentSet.Open();
m_studentSet.AddNew();
for(long i=0;i<3;i++)
{
m_flexgrid.put_Col(i+1);
vValue[i]=m_flexgrid.get_Text();
}
m_studentSet.m_sNo=vValue[0];
m_studentSet.m_sName=vValue[1];
m_studentSet.m_sex=vValue[2];
if(m_studentSet.Update())
AfxMessageBox(L"添加成功!");
m_studentSet.Close();
break;
case 2:
m_courseSet.Open();
m_courseSet.AddNew();
for(long i=0;i<5;i++)
{
m_flexgrid.put_Col(i+1);
vValue[i]=m_flexgrid.get_Text();
}
m_courseSet.m_cNo=vValue[0];
m_courseSet.m_cName=vValue[1];
m_courseSet.m_cCredit=vValue[2];
m_courseSet.m_cNum=vValue[3];
m_courseSet.m_cTime=vValue[4];
if(m_courseSet.Update())
AfxMessageBox(L"添加成功!");
m_courseSet.Close();
break;
case 3:
AfxMessageBox(L"限定表不能添加,只能修改!");
return;
default:
AfxMessageBox(L"必须首先选择数据表");
}

long m_selectedRow=m_flexgrid.get_Row();
vIndex.vt=VT_I2;
vIndex.iVal=(short)m_flexgrid.get_Rows();
m_flexgrid.AddItem(L"",vIndex);
m_flexgrid.put_Col(0);
m_flexgrid.put_Row(m_flexgrid.get_Rows()-1);
}


void CMaintenanceDlg::OnClickedButtonModify()
{
if(tableType==0)
return;
m_courseLimitSet.Open();
m_courseLimitSet.MoveFirst();
m_courseLimitSet.Edit();
m_flexgrid.put_Col(1);
m_courseLimitSet.m_courseNum=m_flexgrid.get_Text();
m_flexgrid.put_Col(2);
m_courseLimitSet.m_creditNum=m_flexgrid.get_Text();
if(m_courseLimitSet.Update())
AfxMessageBox(L"修改成功!");
m_courseLimitSet.Close();
}


void CMaintenanceDlg::OnClickedButtonDelete()
{
if(tableType==0)
return;
if(tableType==1)
{
m_studentSet.Open();
m_studentSet.MoveFirst();
m_studentSet.Move(m_flexgrid.get_Row()-1);
m_studentSet.Delete();
m_studentSet.MoveNext();
m_studentSet.Close();
OnSelchangeComboSelectcourse();
}
else if(tableType==2)
{
m_courseSet.Open();
m_courseSet.MoveFirst();
m_courseSet.Move(m_flexgrid.get_Row()-1);
m_courseSet.Delete();
m_courseSet.MoveNext();
m_courseSet.Close();
OnSelchangeComboSelectcourse();
}
else if(tableType==3)
{
m_courseLimitSet.Open();
m_courseLimitSet.MoveFirst();
m_courseLimitSet.Move(m_flexgrid.get_Row()-1);
m_courseLimitSet.Delete();
m_courseLimitSet.MoveNext();
m_courseLimitSet.Close();
OnSelchangeComboSelectcourse();
}
}


void CMaintenanceDlg::SetButtonCrl(void)
{
// CButton *button;
switch(tableType)
{
case 1:
case 2:
m_bInsert.EnableWindow(TRUE);
m_bModify.EnableWindow(FALSE);
m_bDelete.EnableWindow(TRUE);
break;
case 3:
m_bInsert.EnableWindow(FALSE);
m_bModify.EnableWindow(TRUE);
m_bDelete.EnableWindow(FALSE);
break;
default:
return;
}
return;
}



void CMaintenanceDlg::OnClickedOk()
{
CDialog::OnCancel();
}
求高手指教
...全文
1023 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
马sang 2015-01-09
  • 打赏
  • 举报
回复
楼主解决了没,我也遇到了同样的问题
e3internet 2013-05-02
  • 打赏
  • 举报
回复
你项目问题出在你运行的程序的电脑上没有成功注册Msflxgrd.ocx ActiveX组件,你工程里面的Msflxgrd.ocx在高于XP版本上无法注册成功、在XP上面能够注册成功.现在在网上上找找适用于高于XP系统的Msflxgrd.ocx版本.下面是我在XP上面跑起来的截图:
1.
2.
3.
Eleven 2013-04-29
  • 打赏
  • 举报
回复
Debug模式下打开call stack窗口,看函数调用堆栈,找到出错的函数调用先~
e3internet 2013-04-29
  • 打赏
  • 举报
回复
整个工程放上来.或者到228330140@qq.com
关于龙书第13章地形绘制的terrain项目运行出错问题 (注:龙书即:《DirectX9.0 3D游戏开发编程基础》) 在学习该教材时,当我们试着编译并运行13章地形绘制的terrain项目时,发现运行出错,并弹出了一个出错提示窗口,提示我们::访问vector 越界了 提示窗口的内容如下: -------------------------------------------------------------------- Microsoft Visual C++ Debug Library Debug Assertion failed! Program:...cuments and Settings\Administrator\Terrain\Debug\Terrain.exe File: d:\microsoft visual studio 10.0\vc\include\vector Line:932 Expression : vector subscript out of range For information on how your program can cause an assertion Failure , see the Visual C++ documentation on asserts. (Press Retry to debug the application) [终止(A)] [重试(R)] [忽略(I)] ---------------------------------------------------------------------------------- 问题主要出现在terrain.cpp 文件中的几个函数内部传递参数最终作为了vector的索引值,得到的索引值没有经过限定,导致超出了vector的界限-----最终访问越界. 修改的地方在下面这几处: 在terrain.cpp文档里搜索”//修改过!!!” bool Terrain::genTexture(D3DXVECTOR3* directionToLight) float Terrain::computeShade(int cellRow, int cellCol, D3DXVECTOR3* directionToLight) float Terrain::getHeight(float x, float z) 在terrain.cpp文档里搜索”//注意这里!!!” /int Terrain::getHeightmapEntry(int row, int col) bool Terrain::lightTerrain(D3DXVECTOR3* directionToLight) 在terrainDriver.cpp文档里搜索”//注意这里!!!” float height = TheTerrain->getHeight( pos.x, pos.z ); 我的修改主要是通过在传递索引值的地方,限定索引值的范围,这样就避免了vector访问越界,这也是龙书作者在写该13章的代码时一时所忽略掉的. 只修改过terrain.cpp文件中的内容,其他的都没动.所以可以只将terrain.cpp拷贝到工程中替换掉原来的就可以了.

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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