??xml version="1.0" encoding="utf-8" standalone="yes"?> 很好用哦 代码 // The pointer to my combo box. // Set the height of every item so the item // Only want to set the item height if the current height // Only want to set the item width if the current width 效果图: 2. 把你虚拟Z操作pȝ?font face="Times New Roman">Editing Auto Ethernet->IPV4 Setting 讄成如上图所C?/p>
有些Linux可以如下讄Q?#8220;本地q接”也设|ؓ自动获得IP、自动获?font face="Times New Roman">DNS服务器(在虚拟机中,右键“本地q接”Q双?#8220;Internet 协议”,看看是不是自动的吧!固定IP的也在这里改Q) 3.当然是将虚拟机的上网方式选ؓNAT咯?/p>
右键你要讄的虚拟机?#8220;讄”Q因为有的不止虚拟一収ͼQ在“g”中?#8220;以太|?#8221;Q?右边的|络q接改ؓNATQ确定?/p>
4.点菜单栏里的“~辑”Q?#8220;虚拟|络讄”Q先?#8220;自动桥接”l去掉(L钩钩Q,再?#8220;DHCP”开?font face="Times New Roman">DHCP服务Q点“开?#8221;Q应用,再按同样的方法开?#8220;NAT”的功能?/p>
5.最重要的是你的两个服务必须开启:VMware DHCP Service ?font face="Times New Roman">VMware NAT Service?/p>
具体操作如下: 开?font face="Times New Roman">---讄--控制面板---理工具---服务Q确?VMware DHCP Service ?font face="Times New Roman">VMware NAT Service 服务已经启动 //====================================另外的方?/p>
Ubuntu虚拟机共享主Z|?br />WinXP+VMware WorkStation+Ubuntu7.10
]]>
ShowDropDown();之后SetCursor(LoadCursor(NULL, IDC_ARROW));卛_
]]>
http://www.tuicool.com/topics/11020052?st=0&lang=1&pn=1
OpenCV_Z局部自适应阈值的囑փ二值化
http://www.tuicool.com/articles/Mvqeui
一个很好的快速小波变换(FWTQ源?C++?http://www.codeproject.com/KB/graphics/2D_FWT_lib.aspx
]]>
extern CComboBox* pmyComboBox;
// is completely visible.
CString str;
CSize sz;
int dx=0;
CDC* pDC = pmyComboBox->GetDC();
for (int i=0;i < pmyComboBox->GetCount();i++)
{
pmyComboBox->GetLBText( i, str );
sz = pDC->GetTextExtent(str);
// is not big enough.
if (pmyComboBox->GetItemHeight(i) < sz.cy)
pmyComboBox->SetItemHeight( i, sz.cy );
// is not big enough.
if (pmyComboBox->GetDroppedWidth() < sz.cx)
{
pmyComboBox->SetDroppedWidth(sz.cx + 20);
}
}
pmyComboBox->ReleaseDC(pDC);
]]>
q里我用到的q_?Microsoft Visual Studio 2008 和OpenCV2.0
OpenCV2.0下蝲地址 http://www.opencv.org.cn/index.php/Download。安装OpenCV2.0Q假定安装目录ؓQD:Program FilesOpenCV2.0
CMake下蝲地址 http://www.cmake.org/cmake/resources/software.html (选择 Win32 Installer 安装版本Q?br />
二、编译OpenCV
1. 用CMake导出VC++ 目文g
■ q行cmake-guiQ设|\径ؓOpenCV安装路径Q例如:D:\Program Files\OpenCV2.0Q,q创建子目录 D:\Program Files\OpenCV2.0\vc2008Q用于存攄译结果?br />■ 然后?configureQ在弹出的对话框内选择 Visual Studio 9 2008?br />■ Microsoft Visual Studio 2008 正式版支持OpenMPQ所以ENABLE_OPENMPq个选项要勾上;如果是Express版本Q则不支持OpenMPQ所以需要取消ENABLE_OPENMP选项?br />■ 最后再点击Generate?br />
2. ~译 OpenCV Debug ?Release版本?/span>
完成上一步骤后,在D:\Program Files\OpenCV2.0\vc2008目录下生成OpenCV.sln的VC Solution FileQ请用VC++ 2008 Express打开OpenCV.slnQ然后执行如下操作:
■ 在Debug下,选择Solution Explorer里的 Solution OpenCVQ点右键Q运?Rebuild Solution"Q如~译无错误,再选择INSTALL目Q运?Build"?br />■ 在Release下,选择Solution Explorer里的 Solution OpenCVQ点右键Q运?Rebuild Solution"Q如~译无错误,再选择INSTALL目Q运?Build"?
此时QOpenCV?d.dll文gQfor debugQ和*.dll文gQfor releaseQ将出现在D:\Program Files\OpenCV2.0\vc2008\bin目录中;OpenCV?d.lib文gQfor debugQ??.lib文gQfor releaseQ将出现在D:\Program Files\OpenCV2.0\vc2008\lib目录Q头文g*.h出现在D:\Program Files\OpenCV2.0\vc2008\include\opencv中?br />xMicrosoft Visual Studio 2008 调用的OpenCV动态库生成完毕?/p>
三、配|Windows环境变量Path
D:\Program Files\OpenCV2.0\vc2008\bin加入Windowspȝ环境变量Path中?br />加入后,必须注销当前用户或者重新启动才能生效?br />
四、ؓMicrosoft Visual Studio 2008 配置OpenCV环境
打开Microsoft Visual Studio 2008Q菜?Tools -> Options -> Projects and Solutions -> VC++ Directories?br />■ Show directories for选择include filesQ加入目?D:\Program Files\OpenCV2.0\vc2008\include\opencv
■ Show directories for选择library filesQ加入目?D:\Program Files\OpenCV2.0\vc2008\lib
五、用OpenCV 2.0 ~程
以后每创Z个OpenCV 的Win32 控制台程序,都需要添加依赖的?br />■ 选择Solution Explorer里的 “目名称”Q点击鼠标右键,选择PropertiesQ?br />■ 为项目的Debug配置增加依赖的库Qcxcore200d.lib cv200d.lib highgui200d.libQ?br />■ 为项目的Release配置增加依赖的库Qcxcore200.lib cv200.lib highgui200.lib
]]>
一.Bridged方式׃n上网
1.讄Ubuntu的网l连接方式ؓBridged
2.׃nADSLq接
ADSLq接属性中选中“Internetq接׃n”Q下拉列表中然后选择“本地q接”Q系l会自动?#8220;本地q接”讄?92.168.0.1。注意此讄会在断开q接q启后才生?br />
3.Ubuntu|络讄
IP:192.168.0.X
|关:192.268.0.1
DNS:192.168.0.1(pȝ->pȝ理->|络->DNS)
?NAT方式׃n上网
1.讄Ubuntu的网l连接方式ؓNAT
2.开启VMware DHCP Service和VMware NAT Service两个服务
3.Ubuntu中网l设|ؓ自动配置(DHCP)或者手动设|IP及DNS
手动讄ҎQ?br />
1.XP中ipconfigQ得到VMnet8的IP?92.168.93.1
2.Ubuntu中设|网lIP?92.168.93.X(X?-254Q网上很多h说只能是128-254Q自动分配时一般也?28Q但l验?-254都行QDNS讄?92.168.93.2
以上Ҏ均经验证Q绝无多余步骤?/p>
Dump文g不用非要攑֜你编译出来的位置Q你完全可以建立一个新的文件夹来放它。但若不是存攑֜~译出来的位|,需要将~译生成的PDB文g拯到Dump文g目录Q或是利用VS2005打开Dump文g后,讄PDB文g路径?br />
2?如何恢复当时的现场?
可能你要问,怎么可能Q这个dump文g可是用户发给我的Q我不可能去用户安调试吧?q个恢复现场可不是指的非要到那台机器上去Q而是要把产生dump文g对应的二q制文g拿到?br />
但是恢复现场需要所有的二进制文仉要对应,你一定要有导致用户崩溃的那些Exe和DLL。既然是你发布的E序QExe文g当然你会有。所以这里只考虑DLLp了?br />
Dump文g中记录了所有DLL文g的版本号和时间戳Q所以你一定可以同q某U途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们q_不常用的操作pȝQ所以找个有对应pȝ的机器一般都会有。但是记住不仅是文g名称要一_q要核对版本和时间戳Q如果不同一h有办法用?br />
如果客户用了某个Ҏ的补丁怎么办?
其实q个问题也很好解冻I只要它不ȝ阅读堆栈Q就不用它Q调试Dump和运行程序不一P~少一两个DLL没有M问题?br />
3?如果真的需要怎么办?
W号文g现在主要是指PDB文g?br />
如果没有W号文gQ那么调试的时候可能导致堆栈错误?br />
如果你丢׃q个发布版本中你~译出来的那些exe和DLL的PDBQ那么这个损失是严重的,重新~译出来的版本是不能使用的?br />
我自qDLL都有了,可是~的是系l的DLL的对应PDB文g怎么办??.4中已l介l了Ҏ。微软在它的W号数据库上为我们提供了所有的PDB文gQ还有部分非关键DLL。设|好后程序将自动下蝲需要的PDB及DLL文g?br />
4?拿到需要的文g了,q些文g应该攑֜哪里Q?/strong>
W号数据库中的文件不用动Q把其它的exe和DLL、PDB文g攑֜dump文g目录里就行了?br />
5?我用的是VS2005Q明明有源代码,Z么显CZ了?
q个是dump调试的最头痛问题Q代码可能已l改q了Q即使你从SVN拿到当时的版本,旉戳也是错的,VS2005是不让你显CZ码。其实只要在
Tools/OptionsQDebugging/General中去?br />
Require source files to exactly match the original version的复选就行了?
]]>
1?/span> E序~译选项
2?/span> 利用VS2005 分析dump文g
3?/span> 常见问题讨论
一?/span> E序~译选项
PDB files contains all debug information like type definition and function prototype. When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it. You must do the following setting:
C/C++/General/Debug Information Format=Program Database (/Zi).
?/span>1.1 调试信息格式
Linker/Debugging/Generate Program Database File=”Name and location of your PDB files”
?/span>1.2 PDB文g输出路径
PDB文g路径最好设|在同一个文件夹中,q样方便dmp文g调试时调用?/span>
调试Ӟ所有的PDB文g和源文g必须严格匚wQ?/span>the PDB files should be the one generated by build the source codeQ,q存储在一个安全的位置。当客户报告了一个错误时Q你需要这些文件来帮忙以便定位错误于源代码中ƈ解决问题?/span>
二?/span> VS2005 分析dump文g
In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it’s used directly without NULL pointer checking.
?/span>1.3 演示代码
利用Release模式~译该测试程序,在客h上运行该E序Q将ҎNTSD讄生成相对应的DMP格式文g?/span>
可以使用Visual Studio.Net?/span>NTSD或是其他的调试工具对DMP格式文gq行分析?/span>
l Start Visual Studio.Net
Click File/Open Solution and make sure the files of type is *.dmp then click Open.
?/span>1.3 Open Dump File (GUI)
l Set Symbol Path
Click Tools/Options, Debugging/SymbolsQ增?/span>PDB文g路径。若调试的程序需要微软基库的PDB信息Q可以增加一个\径ؓQ?/span>
http://msdl.microsoft.com/download/symbols
在界面下?/span>Cache Symbol From symbol…选择本地存储q些Symbols的\径?/span>
?/span>1.4 Symbol Path
如果DMP文g没有攑օ本nPDB文g所在目录,也可以在此处增加一个本地目录。点OK后,VS2005从|络中下载所需要的SymbolsQ需要等待一D|间。如果是多次调试同一个程序错误所生成?/span>DMP文gQ可以在对话框中选择“Search the above locations only when symbols are loaded manually”。从而可以节省网l带宽?/span>
l Set Source code path
Open Solution Property Pages and set the source code path.
?/span>1.5 属性菜?/span>
?/span>1.6 Debug Source Files
l Start to Debug the Dump File
Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.
?/span>1.7 调试H口Q定位到源代?/span>
三?/span> 常见问题讨论
1?/span> Dump文g攑֜哪里Q?/span>
Dump文g不用非要攑֜你编译出来的位置Q你完全可以建立一个新的文件夹来放它。但若不是存攑֜~译出来的位|,需要将~译生成?/span>PDB文g拯?/span>Dump文g目录Q或是利?/span>VS2005打开Dump文g后,讄PDB文g路径。参照图1.4?/span>
2?/span> 如何恢复当时的现场?
可能你要问,怎么可能Q这?span lang="EN-US">dump文g可是用户发给我的Q我不可能去用户安调试吧?q个恢复现场可不是指的非要到那台机器上去Q而是要把产生dump文g对应的二q制文g拿到?span lang="EN-US">
但是恢复现场需要所有的二进制文仉要对应,你一定要有导致用户崩溃的那些Exe?span lang="EN-US">DLL。既然是你发布的E序Q?span lang="EN-US">Exe文g当然你会有。所以这里只考虑DLLp了?span lang="EN-US">
Dump文g中记录了所?span lang="EN-US">DLL文g的版本号和时间戳Q所以你一定可以同q某U途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们q_不常用的操作pȝQ所以找个有对应pȝ的机器一般都会有。但是记住不仅是文g名称要一_q要核对版本和时间戳Q如果不同一h有办法用?span lang="EN-US">
如果客户用了某个Ҏ的补丁怎么办?
其实q个问题也很好解冻I只要它不ȝ阅读堆栈Q就不用它Q调?span lang="EN-US">Dump和运行程序不一P~少一两个DLL没有M问题?span lang="EN-US">
3?/span> 如果真的需要怎么办?
W号文g现在主要是指PDB文g?span lang="EN-US">
如果没有W号文gQ那么调试的时候可能导致堆栈错误?span lang="EN-US">
如果你丢׃q个发布版本中你~译出来的那?/span>exe?/span>DLL?/span>PDBQ那么这个损失是严重的,重新~译出来的版本是不能使用的?/span>
我自qDLL都有了,可是~的是系l的DLL的对?/span>PDB文g怎么办??/span>1.4中已l介l了Ҏ。微软在它的W号数据库上为我们提供了所有的PDB文gQ还有部分非关键DLL。设|好后程序将自动下蝲需要的PDB?/span>DLL文g?/span>
4?/span> 拿到需要的文g了,q些文g应该攑֜哪里Q?/span>
W号数据库中的文件不用动Q把其它?/span>exe?/span>DLL?/span>PDB文g攑֜dump文g目录里就行了?/span>
5?/span> 我用的是VS2005Q明明有源代码,Z么显CZ了?
q个?/span>dump调试的最头痛问题Q代码可能已l改q了Q即使你?/span>SVN拿到当时的版本,旉戳也是错的,VS2005是不让你显CZ码。其实只要在
Tools/OptionsQ?/span>Debugging/General中去?/span>
Require source files to exactly match the original version的复选就行了?/span>
其实Q我一直认为CMap是最单的一个数据类型,如果_大家对这个数据类型生不良感觉的话,大多是因为对Hash表的陌生?/span>
昄QCMap是对Hash表的一U实现。对于Hash表来_我们需要提供成对的Key与Valueq行操作Q其实,也就是将我们日常使用的数l下标替换成现在KeyQ至于MFC是采用了什么样的散列函敎ͼ我们不必知道?/span>
Hash表可以认为是数组的一U优化,或者说是对数组~陷的一UI补,因ؓ我们知道Q数l在具备了高效存取性能的同Ӟ无法动态的调整自n的大,又严重的影响了它的用效果。这l了Hash表可乘之机,Hash表L使用了某U算法尽可能的来辑ֈ成对的元素存储C个额定的L的内存空_它既l承了链表对自n的动态调_又尽可能的dl持在高速的水^Q当然无论如何还是要比数l慢的多?/span>
如果你非要让我告诉你QHash表是什么样的一个数据结构的话,很遗憾,我无法准的描述Q这q当于你问?#8220;凤凰是什么样?#8221;Q不q我可以告诉你孔雀的样子。常用的Hash表非常像一个十字数l,g十字数组又成Z众多读者的障碍Q如果你暂时q不能理解的话,请你ȝ阅Hash表的详细Q当然你也可以在不久之后Q在本处看到q些l典数据l构的精讌Ӏ?/span>
现在Q我们来看一个CMap的用法,至于它的参数Q你可以看本I间一专门描qCArrayQCList以及CMap参数用法的文章《CArrayQCListQCMap如何实化Q实例化Q》。下面是我自q写的例子Q?/span>
class Point
{
public:
Point()
{
m_x = 0;
m_y = 0;
}
Point(int x, int y)
{
m_x = x;
m_y = y;
}
public:
int m_x;
int m_y;
};
typedef CMap<const char*, const char*, Point, Point&> CMapPnt; //请在使用之前定义
int main()
{
Point elem1(1, 100), elem2(2, 200), elem3(3, 300), point;
CMapPnt mp;
// insert 3 elements into mapQ?span> #1
mp.SetAt("1st", elem1);
mp.SetAt("2nd", elem2);
mp.SetAt("3th", elem3);
// search a point named "2nd" from map #2
mp.Lookup("2nd", point);
printf("2nd: m_x: %d, m_y: %d\n", point.m_x, point.m_y);
// insert a new pair into map #3
Point elem4(4, 400);
mp["4th"] = elem4;
cout<<"count: "<<mp.GetCount()<<endl;
// traverse the entire map #4
size_t index = 0;
const char* pszKey;
POSITION ps = mp.GetStartPosition();
while( ps )
{
mp.GetNextAssoc(ps, pszKey, point);
printf("index: %d, m_x: %d, m_y: %d\n", ++index, point.m_x, point.m_y);
}
return 0;
}
代码中,我已l给Z一些注释,我同样徏议读者们Q用英文在代码中注释Q这L好处实在是太多了。尤其在代码需要在不同~码的操作系l上调试的时候?/span>
对于CMapq个c,我不得不着重啰嗦一下的是:遍历操作以及取下标【】操作,当然q有那个令很多h困惑不已的ARG_KEY到底应该如何选择的问题?/span>
遍历Q看注释#4Q至于POSITION的含义,请在本空_查看其它文章。先使用GetStartPosition()函数获得表头的位|,然后Q我们可以用GetNextAssoc函数来遍历。GetNextAssoc(POSITION& rNextPosition, KEY& rKey, VALUE& rValue)函数的参数值得说明一下,大家看到Q?个参数都是引用,而第一个是rNextPositionQ顾名思义Q在函数q回之后Q它会指像下一个元l,当然q是在表q未遍历完的时候,否则Q它被|ؓI(NULLQ?/span>
【】,利用下标取元素的q个操作W,在CMap中被重蝲Q用来返回指定Key值数据的引用Q不q在注释#3处,对于先取"4th"q个Point的引用然后赋值的用法Q看hQ似乎有点聪明过了头Q因为在q之前,我们q没有插?4th"所对应的元l,但是Q程序却能正常的q行Qؓ什么?其实Q这L用法是十分正的Q因为CMap毕竟不是数组Q它是没有边界的Q当CMap在获得一个它无法查询到的Key值的时候,它会这个Key以及一个空的数据类型追加到Hash表中去,从而保证了上面的程序可以无误的q行?/span>
我们已经说过QARG_KEY是作为类型参C入CMap的,但ƈ不是Mcd都可以作为ARG_KEY传入的。ؓ什么?看样子,q次不得不简单的说说Hash表的散列函数了。每个Hash表,M使用一些散列函敎ͼ用来查找Key所对应的ValueQ理想状态下Q我们当然希望Hash表,是一个数l,虽然q不可能Q不q这L解,可以帮助我们更好的理解Hash表的物理l构Q就让我们暂时把它看成一个数l吧。数lL使用下标来直接获取元素的存储地址Q而下标,昄应该是个非负整数Q从而Hash表,也应该具备这LҎ,臛_必须存在某种法可以使传入的Key可以直接的{化ؓ一个非负的整数Q这也就是ARG_KEY的选择标准。从而对象、引用无论如何都不应该作为ARG_KEY成ؓCMap的类型参敎ͼ而int、unsigned int、指针以及地址成ZARG_KEY的常用类型参敎ͼ其实也就是那些类g整型的数据类型。常常看C些h在用CMap的时候,试图使用CString作ؓCMap中ARG_KEY的类型参敎ͼq是应该被纠正的方向性错误,但有些hg会理直气壮的反驳我,因ؓ他们发现cd参数KEY是可以用CString的,q很奇怪吗Q我说过KEY不能使用CString吗?之所以KEY可以使用CString而ARG_KEY却用的是LPCTSTRQ那是因为CString重蝲了operator==(const char*)q个判等操作W,当CMap从Hash表中获得KEY之后Q它会将ARG_KEY与KEY直接相比较。真正存于CMap内部的是KEYQ也是CString。这也就是ؓ什么,我们l常会看到CMap被实化成CMap<CString, LPCTSTR/*相当于const char*Q非Unicode情况?/, CStringQCString&>q样的一个四不像实化cȝ原因Q至于CMap的效率优化问题,我们会在以后的文章中l箋与大家探讨?/span>
CMap的确是个很不错的数据l构Q尤其在你徏立一个字典的时候。比如idealsoft的含义是"曛_U技"Q这是一个元l,也就是一个PairQKey?idealsoft"Q而Value?曛_U技"?/span>
====================================================================