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

wrhjyx 2010-12-07 05:08:46
先看我的程序吧
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。的错误。貌似是非法访问了。。。可是我不知道为什么。。。请大家指教。。。我的分不多了:(
不知道我说清楚了没有

...全文
232 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrhjyx 2010-12-08
  • 打赏
  • 举报
回复
我明明在构造函数中初始化了m_pGridCtrl=NULL;,但是我单步运行到函数中,当判断if (m_pGridCtrl == NULL)的时候发现m_pGridCtrl并不是空,而是有一个值,这是怎么赋进去的呢?很迷惑。。。
wrhjyx 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jacklzw88 的回复:]
初始化了还出错?你是多线程吗?
[/Quote]
我用的是静态分割子窗口,按照侯捷的书讲的做的~
wrhjyx 2010-12-08
  • 打赏
  • 举报
回复
楼上两位,我按照你们的方法去掉了这个,但是仍然不行。。。。
wrhjyx 2010-12-08
  • 打赏
  • 举报
回复
谢谢各位~我的问题解决了。我的解决办法是把表格的初始化写在了CDataView::OnInitialUpdate() 中,然后把填充数据的内容,就是我一开始写的那个InData的函数里的for (int h=0; h<GroupCount; h++)这句话开始的内容写在了OnDraw函数中(稍作了更改)。然后在OnFileOpen()的最下面写了这么两句
CLbchDoc* pDc= (CLbchDoc*)GetActiveDocument();
pDc->UpdateAllViews(NULL);
反正最后是可以运行了,界面也能正常显示了。以前错误的具体原因我还是没有找到。反正肯定是指针用错了,我觉得。
谢谢各位的指导!
蒙飞鸿 2010-12-08
  • 打赏
  • 举报
回复
看看你都是在哪个构造函数里给赋的NULL,要不就一直追踪m_pGridCtrl,要不就在那个构造函数赋NULL处下断点看断到没
Forcy 2010-12-08
  • 打赏
  • 举报
回复
检查一下在构造函数中的赋值语句 m_pGridCtrl =NULL;
是不是写成了 CGridCtrl *m_pGridCtrl =NULL;
smokingchen 2010-12-08
  • 打赏
  • 举报
回复
以前遇到过类似问题,但是是在异步通信的时候遇到的,不确定是不是一样。你把m_pGridCtrl=NULL,实际上它还会是一个很长的乱码一样的数值,也许就是这导致它在运行时的不确定性。结果类似于野指针那样。我后来是在if之前就把它指定到某个具体的对象上(临时性),来代替NULL,就没问题了。不知道适不适合你这问题。
  • 打赏
  • 举报
回复
if(m_pGridCtrl!=NULL)
{
delete m_pGridCtrl;
m_pGridCtrl=NULL;
}

这段没必要,如果在线程中操作CGridCtrl会有问题
yihandrensunyong 2010-12-07
  • 打赏
  • 举报
回复
if(m_pGridCtrl!=NULL)
{
delete m_pGridCtrl;
m_pGridCtrl=NULL;
}
如果你的m_pGridCtrl开始不是NULL 你delete就会出错。因为你是后面才NEW的 你可以单步查一下
建议将这段去掉,在if (m_pGridCtrl == NULL)后面加else判断
wrhjyx 2010-12-07
  • 打赏
  • 举报
回复
有没有大侠给我讲讲啊~~~~~~
wrhjyx 2010-12-07
  • 打赏
  • 举报
回复
补充一下,我在构造函数中初始化过了m_pGridCtrl=NULL;
jacklzw88 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wrhjyx 的回复:]
引用 1 楼 jacklzw88 的回复:
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧

恩,有这句。我忘了粘贴了。初始化成NULL了。
[/Quote]
初始化了还出错?你是多线程吗?
fandh 2010-12-07
  • 打赏
  • 举报
回复
在构造函数里面初始化一下就OK了!
xiaohuh421 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jacklzw88 的回复:]
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧
[/Quote]
顶,楼主要记住,指针变量都要初始化为NULL,不然容易出问题.
其实所用变量都应该被初始化,这是一个好习惯.
tigerMayDo 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jacklzw88 的回复:]
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧
[/Quote]
对的
wrhjyx 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jacklzw88 的回复:]
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧
[/Quote]
恩,有这句。我忘了粘贴了。初始化成NULL了。
jacklzw88 2010-12-07
  • 打赏
  • 举报
回复
CGridCtrl *m_pGridCtrl =NULL;
初始化一下吧

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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