您的位置:首页 > 编程语言 > C语言/C++

open cv+C++错误及经验总结(十)

2014-03-24 20:26 260 查看
1.DicomTest.exe 中的 0x536c437b (mfc100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x6131314c 时发生访问冲突

0xC0000005 应用程序初始化错误
0x00000004 内存地址
请查看

否存

内存分配错误

建议你调试运行,看调用栈,然后就知道了

2.error C2666: 'ATL::CStringT<BaseType,StringTraits>::operator +' : 3 overloads have similar conversions
1>          with
1>          [
1>              BaseType=char,
1>              StringTraits=StrTraitMFC_DLL<char>
1>          ]

下面是关于c2666的解释
编译器错误 C2666
“identifier”: number 个重载有相似的转换
重载函数运算符不明确。
形参列表可能太相似,编译器无法解析多义性。
若要消除此错误,请显式强制转换一个或多个实参。

3.fatal error LNK1120: 2 unresolved externals error LNK2001: unresolved external symbol _main

lnk2001:unresolved external symbol。。。为不确定的外部符号,如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
lnk1120 你可以尝试在[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows
4.Windows has triggered a breakpoint in DCMDemolDlg.exe.
This may be due to a corruption of the heap, which indicates a bug in DCMDemolDlg.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while DCMDemolDlg.exe has focus.
The output window may have more diagnostic information.

对内存破坏。就是说已经释放的堆内存被修改了,一般就是new/malloc 后的内存,在被delete/free后又被使用了

5.0xC0000005: Access violation reading location

访问违规。你访问里你没有权限访问的区域

比如
char *p = "aaa";
*p = 'b'; p是字符串常量,在只读区域,没有写的权限。而这里你已写的方式访问了,就会出访问违规。

看到一个很小的地址比如这里的0x00000004,一般来说肯定是空指针问题。
用调试器看看,单步走下,一般说问题比较容易处理。

指针在使用前没有初始化或者指向的对象被delete了


6.调试技巧之调用堆栈

栈用来传递函数参数,存储返回值信息,保存寄存器以供恢复调用前处理机状态。

为单个函数分配的那部分栈空间就叫做 stack frame,也就是说,stack frame 这个说法主要是为了描述函数调用关系的。

Stackframe 组织方式的重要性和作用体现在两个方面:第一,它使调用者和被调用者达成某种约定。这个约定定义了函数调用时函数参数的传递方式,函数返回值的返回方式,寄存器如何在调用者和被调用者之间进行共享;第二,它定义了被调用者如何使用它自己的 stack frame 来完成局部变量的存储和使用。






disassembly

生词本

[ˌdɪsə'semblɪ]


[ˌdɪsə'sembəlɪ]

n.拆卸,分解,解体; 拆开


Exception






异常处理;

违例页;

例外;

异议

CDialogEx是VS2003之后出现的,VC6没有。
这个类是CDialog的扩展类,基类就是CDialog,具备基类全部功能,并根据新系统需要增加了一些界面美化的功能。比如修改对话框的背景颜色,标题栏的颜色,标题栏的位图,标题栏字体的位置和颜色,包括激活和非激活状态,对话框边界的颜色,对话框字体等。
如果使用的是VS2005之后的版本,推荐使用CDialogEx,好看一些,VC6就不要想了,老实用CDialog。两个在基础功能上没什么区别,但因为版本不同,MFC向导生成的类模板差异较大。

CFile fp; //
if(!fp.Open(lpszPathName, CFile::modeRead))
return ;
char ext[5] = ".dcm"; //方式1,判断读入文件的后缀
int length = strlen(lpszPathName);
if (strcmp((const char*)(lpszPathName+length-4),ext) != 0)
{  return ;  }
char *temp = new char[128]; //方式2,判断读入文件的后缀	fp.Read(temp, 128);
fp.Read(temp, 5);
fp.~CFile();
if (*temp =='D' && *(temp+1)=='I'&&*(temp+2)=='C'&&*(temp+3)=='M')
{ ..... }








delimiter英 [dɪ'lɪmɪtə]
美 [dɪ'lɪmɪtə]

n.定界符,分隔符

is subclassed.

1. As an abstract class, it is meant to be subclassed with a specific, protocol dependent, implementation.
作为一个抽象类,其意味着要由具体的定义、独立协议和实现来子类化。


subclassing






子类别化;

继承;

继承子类来;

子分类

CStdioFile继承自CFile,一个CStdioFile 对象代表一个用运行时函数fopen 打开的C 运行时流式文件。

CStdioFile继承自CFile,一个CStdioFile 对象代表一个用运行时函数fopen 打开的C 运行时流式文件。

流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。

CStdioFile 不支持Duplicate,LockRange,和UnlockRange 这几个CFile 函数。如果在CStdioFile 中调用了这几个函数,将会出现CNoSupported 异常。

CStdioFile::ReadString(LPTSTR lpsz, UINT nMax);

afx_msg 是一个宏 标识是消息映射函数,增加可读性。

afx_msg 什么都没定义,是为以后扩充保留的。

它的定义如下:(具体在哪个文件里,我忘记了)

#define afx_msg

可以看出来它实际上是一个空定义!

这些消息处理函数的说明一般都有“afx_msg”的前缀,用于把处理函数与其他的窗口成员函数区分开来,这些函数都是通过消息映射实现的。比如,消息 WM_CHAR 的处理函数在 CWnd 中声明成:

afx_msg void OnChar();


advanced英 [ədˈvɑ:nst]

[ædˈvænst]



adj.先进的; 高等的,高深的; 年老的; 晚期的

v.前进(advance的过去式和过去分词); 增加; 上涨

Overridable

指定属性或过程可由派生类中同名的属性或过程进行重写。


备注
Overridable 是可重写基类属性或过程的属性或过程的默认设置。

可以通过隐藏或重写来重新定义继承的元素,但是这两种方法之间存在重大差异。有关更多信息,请参见Visual
Basic 中的隐藏。

可被重写的元素有时称为“虚拟”元素。如果它可被重写,但是无需重写,有时又称为“具体”元素。


规则

声明上下文。 只能在属性或过程的声明语句中使用 Overridable。

组合修饰符。 不能在一个声明语句中将 Overridable 与 MustOverride、NotOverridable 或 Shared同时指定。因为重写元素是可隐式重写的,所以您不能组合使用 Overridable 与 Overrides。


CWnd::OnKillFocus

Visual Studio 2013

其他版本



此主题尚未评级 - 评价此主题

框架调用在失去输入焦点之前的此成员函数。

afx_msg void OnKillFocus(
CWnd* pNewWnd
);


参数

pNewWnd

指定指向接收输入焦点的窗口(可能为 NULL 也可能是瞬态的)。

备注

如果 CWnd 对象显示插入符号,应此时销毁插入符号。


说明
此成员函数由框架调用提供您的应用程序处理Windows消息。 当接收消息,参数传递给函数以反映结构接收的参数。 如果调用此函数的基类实现,该实现将使用参数最初用消息您提供给函数而非参数。


CWnd::PreSubclassWindow

Visual Studio 2013

其他版本



此主题尚未评级 - 评价此主题

This member function is called by the framework to allow other necessary subclassing to occur
before the window is subclassed.

在窗口中,它之前,此成员函数由框架调用允许其他必需subclassing发生。

virtual void PreSubclassWindow( );


备注

Overriding this member function allows for dynamic subclassing of controls. It is an advanced
overridable.

重写该成员函数允许动态subclassing控件。 它是一个高级可重写。

字符指针申请内存:

方式1:

char *value = new char[1000];

delete []value; value = NULL;

方式2:

char
*value = (char *)malloc(sizeof(char) * 1000);

free(value); value
= NULL;

命令按钮弹出打开文件对话框,并保存打开文件路径(MFC对话框应用程序)

// TODO: Add your control notification handler code here
CFileDialog *lpszOpenFile;    //定义一个CfileDialog对象

CStdioFile file;
CString lpszPathName;

//生成一个对话框
lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST |OFN_HIDEREADONLY , "文件类型(*.dcm)|*.dcm|所有文件(*.*)|*.*|");
if(lpszOpenFile->DoModal() == IDOK )//假如点击对话框确定按钮
{
lpszPathName = lpszOpenFile->GetPathName();//得到打开文件的路径
SetWindowText(lpszPathName);//在窗口标题上显示路径
}
if(lpszPathName == "")  return;

if(!file.Open(lpszPathName,CFile::modeRead))
{
MessageBox("can not open file!");
return;
}
file.Close();
delete lpszOpenFile;//释放分配的对话框
BOOL CDCMDemolDlgDlg::OnInitDialog()
{
。。。。
// TODO: Add extra initialization here
m_EditListCtrl.InsertColumn(0, "GTag", LVCFMT_LEFT, 200);
m_EditListCtrl.InsertColumn(1, "ETag", LVCFMT_LEFT, 200);
m_EditListCtrl.InsertColumn(2, "Value", LVCFMT_LEFT, 200);

return TRUE;  // return TRUE  unless you set the focus to a control
}
{
do{。。。。。
m_EditListCtrl.InsertItem(num,"a");
m_EditListCtrl.SetItemText(num,1,value);
m_EditListCtrl.SetItemText(num,2,value);
num++;
} while((Gtag != LastGTag)||(Etag != LastETag));

UpdateData(); //显示数据
}




CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。

可以用构造函数提供的方式使用CFileDialog,也可以从CFileDialog派生出自己的对话类并编写一个构造函数来适应你的需要。每种情况下,对话框都与标准MFC对话框一样工作。因为它们都是CCommonDialog类的派生类。

要使用CFileDialog,先用CFileDialog构造函数构造一个对象,当创建了一个对话框后,可以设置或修改m_ofn结构中的任何值,以初始化对话框控件的值或状态。m_ofn结构是OPENFILENAME类型的。要了解更多信息,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。

初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。DoModal返回不论是用户选择了OK(IDOK)还是取消(IDCANCEL)按钮。

当DoModal返回IDOK,可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。

CFileDIalog包含许多保护成员,使你可以处理常用的共享冲突、文件名合法性检查、列表框改变通知。这些保护成员对许多应用来说用处不大,因为缺省处理是自动的。对这些函数来说,消息映射入口是不必要的,因为它们是标准虚函数。

可以使用Windows CommDlgExtendError函数判断在初始化对话框时是否是发生了错误,并获取关于错误的更多信息。

析构一个CFileDialog对象是自动,无须调用CDialog::EndDialog。

要使用户选用多个文件,可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表,这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现,要在创建了CFileDialog之后调用DoModal之前进行此操作。另外,必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile。

CFileDialog依赖于Windows3.1及以后版本中的COMMDLG.DLL。

如果从CFileDialog中派生出一个新类,可用消息映射处理。要扩展消息处理,从CWnd中派生一个类,向新类中加入一个消息映射并为新消息提供成员函数,无须提供一个钩子函数来定制对话框。

要定制对话框,从CFileDialog中派生一个对象,提供一个定制对话模板,从扩展控件中加入一个消息映射,处理通知消息。任意未处理的消息将传递给基类。

CCtrllist显示数据后要调用updataData();才能显示数据在控件上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: