hur.cn - 华软网

 热门搜索

程序运行出错,貌似是说我非法访问。。。请帮忙看看吧,谢谢~

  作者:未知    来源:网络    更新时间:2010/12/7
先看我的程序吧
void CMainFrame::OnFileOpen() 
{
// TODO: Add your command handler code here
  CFileDialog openfile(TRUE);
  openfile.m_ofn.lpstrFilter="工程资料 (*.GLB)\0*.GLB";
  openfile.m_ofn.lpstrTitle="打开资料";

if (openfile.DoModal() == IDOK)
{
CString filepath;
filepath=openfile.GetPathName();//获得完整的资料名,包括目录名和扩展名如:c:\test\test1.txt 
if(filepath=="")
return;
SaveOrNot=TRUE;
  openProject(filepath);
}
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
void CMainFrame::openProject(CString filepath)//这个函数的内容是把我打开的资料的内容存到一个数组里。

{
//
.......中间是在存数据,存到一个数组中
//     
     GroupCount = DataNum;//在这儿我把全局变量GroupCount 赋上值,比如说是20

     CDataView *pView0=(CDataView *)GetActiveView();//CDataView 说明在下面
     pView0->InData();
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
CDataView是我试图分割中的一个视图类
CGridCtrl *m_pGridCtrl;
void CDataView::InData()
{

if ( GroupCount !=0)
{
int rownum;
if ((GroupCount %10) > 0)
{
rownum=GroupCount /10+2;
}
else rownum=GroupCount /10+1;
if(m_pGridCtrl!=NULL)
{
delete m_pGridCtrl;
m_pGridCtrl=NULL;
}
if (m_pGridCtrl == NULL)

{
m_pGridCtrl = new CGridCtrl;
CRect rect;
GetClientRect(rect);
m_pGridCtrl->Create(rect, this, 100);
m_pGridCtrl->SetEditable(false);
m_pGridCtrl->SetBkColor(m_pGridCtrl->GetTextBkColor());
m_pGridCtrl->EnableDragAndDrop(false);
try {
m_pGridCtrl->SetRowCount(rownum); //设置行数为k行
m_pGridCtrl->SetColumnCount(11);   //设置列数k列
m_pGridCtrl->SetFixedRowCount(1);   //题目行为一行
m_pGridCtrl->SetFixedColumnCount(1);  //题目列为1列
}
catch (CMemoryException* e)
{
e->ReportError();
e->Delete();
// return TRUE;
}
//填充列题目
int row=0;
int col=0;
m_pGridCtrl->SetRowHeight(0,30); //设置题目行高 
//--------------------------------设置列
for(col=0;col<11;col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
m_pGridCtrl->SetColumnWidth(col,(rect.Width()-20)/11); //设置11列的列宽
 if(col>0){
Item.nFormat = DT_CENTER|DT_WORDBREAK;//|DT_CALCRECT;
// |ES_NUMBER;
Item.strText.Format("%d",col);
}

m_pGridCtrl->SetItem(&Item);
}
// fill rows/cols with text
//----------------------------------------设置行
for (row = 1; row < rownum; row++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = 0;
Item.nFormat = DT_CENTER|DT_VCENTER
|DT_SINGLELINE|DT_END_ELLIPSIS
|DT_NOPREFIX;//|ES_NUMBER
//|DT_CALCRECT;
// Item.nFormat=Item.nFormat & ~DT_END_ELLIPSIS;
Item.strText.Format("%d",row);
m_pGridCtrl->SetRowHeight(row,30); //设置各行高 
m_pGridCtrl->SetItem(&Item);
}
//---------------------------------------------起头在单元格内增加内容

for (int h=0; h<GroupCount; h++)//k=20
{
CString lplbarray;
row=h/10+1;
col=h%10+1;

lplbarray.Format(_T("%d"),CoverL.GJContent.at(0).GJData.at(h));
m_pGridCtrl->SetItemText(row,col,lplbarray);
}
 }
}
// MessageBox("CDataView");
}
我利用CGridCtrl *m_pGridCtrl;制作一个电子表格,然后增加数据进去。增加的数据是在CMainFrame::OnFileOpen()中打开的原来存储好的数据。(读取的数据内容是没错的,我单步运行过。)只有运行到红色字体处会出现毛病。
unhandled exception in XXX.exe:0xc0000005:Access violation。的毛病。貌似是非法访问了。。。可是我不知道为什么。。。请大家指教。。。我的分不多了:(
不知道我说清楚了没有


---华软 网友回答---
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧
---华软网友回复---
引用 1 楼 jacklzw88 的回复:
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧

恩,有这句。我忘了粘贴了。初始化成NULL了。
---华软网友回复---
引用 1 楼 jacklzw88 的回复:
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧

对的
---华软网友回复---
引用 1 楼 jacklzw88 的回复:
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧

顶,楼主要记住,指针变量都要初始化为NULL,否则容易出问题.
其实所用变量都应该被初始化,这是一个好习气.
---华软网友回复---
在构造函数里面初始化一下就OK了!
---华软网友回复---
引用 2 楼 wrhjyx 的回复:
引用 1 楼 jacklzw88 的回复:
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧

恩,有这句。我忘了粘贴了。初始化成NULL了。

初始化了还犯错?你是多线程吗?
---华软网友回复---
增补一下,我在构造函数中初始化过了m_pGridCtrl=NULL;
---华软网友回复---
有没有大侠给我讲讲啊~~~~~~
---华软网友回复---
if(m_pGridCtrl!=NULL)
{
delete m_pGridCtrl;
m_pGridCtrl=NULL;
}
如果你的m_pGridCtrl起头不是NULL 你delete就会犯错。由于你是后面才NEW的 你能够单步查一下
建议将这段去掉,在if (m_pGridCtrl == NULL)后面加else判断

---华软网友回复---
if(m_pGridCtrl!=NULL)
{
delete m_pGridCtrl;
m_pGridCtrl=NULL;
}

这段没需要,如果在线程中操作CGridCtrl会有问题
---华软网友回复---
楼上两位,我按照你们的方法去掉了这个,然则依然不行。。。。
---华软网友回复---
引用 6 楼 jacklzw88 的回复:
初始化了还犯错?你是多线程吗?

我用的是静态分割子窗口,按照侯捷的书讲的做的~
---华软网友回复---
我明明在构造函数中初始化了m_pGridCtrl=NULL;,然则我单步运行到函数中,当判断if (m_pGridCtrl == NULL)的时候发现m_pGridCtrl其实不是空,而是有一个值,这是怎么赋进去的呢?很迷惑。。。
---华软网友回复---
以前遇到过类似问题,然则是在异步通讯的时候遇到的,不确定是否是一样。你把m_pGridCtrl=NULL,实际上它还会是一个很长的乱码一样的数值,也许就是这致使它在运行时的不确定性。结果类似于野指针那样。我后来是在if之前就把它指定到某个详细的对象上(临时性),来取代NULL,就没问题了。不知道适不适合你这问题。
---华软网友回复---
检查一下在构造函数中的赋值语句 m_pGridCtrl =NULL; 
是否是写成了 CGridCtrl *m_pGridCtrl =NULL;
---华软网友回复---
看看你都是在哪一个构造函数里给赋的NULL,要不就一直追踪m_pGridCtrl,要不就在那个构造函数赋NULL处下断点看断到没
---华软网友回复---
谢谢列位~我的问题解决了。我的解决措施是把表格的初始化写在了CDataView::OnInitialUpdate() 中,然后把填凑数据的内容,就是我一起头写的那个InData的函数里的for (int h=0; h<GroupCount; h++)这句话起头的内容写在了OnDraw函数中(稍作了更改)。然后在OnFileOpen()的最下面写了这么两句
CLbchDoc* pDc= (CLbchDoc*)GetActiveDocument();
pDc->UpdateAllViews(NULL);
横竖最后是能够运行了,界面也能正常显示了。以前毛病的详细原因我照旧没有找到。横竖肯定是指针用错了,我觉得。
谢谢列位的指导!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。