⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_23496.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:23496 发表者:高扬 发表日期:2002-12-04 16:26:17
<br>主题:那位大大知道比较两个结构是否相等的函数?我用MEMCMP怎么不管用呀?
<br>内容:我有个结构定义如下:<BR>typedef struct _ClientConf<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Tchar m_usrId;//该用户ID应该能恒定的标识某台计算机<BR>&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;&nbsp;m_confCol;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL m_bDelConfCol;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_ProxyServer;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_FTPAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_GOPHERAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_HTTPAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_SOCKSAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;_ClientConf()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_ProxyServer = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_FTPAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_GOPHERAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_HTTPAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_SOCKSAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}ClientConf,TmpConf;//定义该结构<BR><BR>然后在函数里<BR>func()<BR>{<BR> ClientConf ClientConf;<BR> TmpConf TmpConf;<BR> ...//ClientConf被赋予值<BR> TmpConf = ClientConf;<BR> ...//在这个过程里我可以保证两个STRUCT的值没有改变,我一项项比较过了<BR><BR>//然后在这,函数总是告诉我比较的结果是不等的<BR> if(memcmp(&amp;ClientConf,&amp;TmpConf,sizeof(ClientConf)) != 0)<BR>{<BR>&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;}<BR>}是因为memcmp比较了地址吗?还是什么原因,希望哪位大大赶快告诉我呀!<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-12-04 16:29:20
<br>内容:这是因为结构中有CString对象,所以不能这么比。在C++中struct和class是一回事。替你的结构实现一个operator==来做比较的工作。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:高扬 回复日期:2002-12-04 16:36:57
<br>内容:那么有什么好办法吗?可以用来比较的,总不是要我一项一项去做判断吧,挺烦的!嘿嘿
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:太平冰水 回复日期:2002-12-04 19:04:37
<br>内容:听楼上的吧,只能这样
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-12-04 21:16:16
<br>内容:只能一样样比较。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-12-04 22:01:07
<br>内容:澄清一下,结构中有CString对象不会引起不相等,因为ClientConf结构赋值时引起 CString::operator==(const CString&amp;)的调用。而CString::operator==(const CString&amp;)通常会导致 m_pchData的赋值,所以结构赋值会导致memcmp(..) == 0 .<BR><BR><BR>于是我这样做了<BR>typedef struct _ClientConf<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;TCHAR m_usrId;//该用户ID应该能恒定的标识某台计算机<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;m_confCol;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL m_bDelConfCol;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_ProxyServer;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_FTPAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_GOPHERAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_HTTPAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_SOCKSAddr;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;_ClientConf()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ProxyServer = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_FTPAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_GOPHERAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_HTTPAddr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_SOCKSAddr = "";<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}ClientConf,TmpConf;//定义该结构<BR><BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ClientConf ClientConf;<BR>&nbsp;&nbsp;&nbsp;&nbsp;TmpConf TmpConf;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;TmpConf = ClientConf;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(memcmp(&amp;ClientConf,&amp;TmpConf,sizeof(ClientConf)) == 0) ; // 是相等的<BR>}<BR><BR>我唯一改动的是struct _ClientConf中的U32改成int。<BR>你看着办吧。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:高扬 回复日期:2002-12-05 09:26:54
<br>内容:未出手的飞刀 老大:好象不成诶!呵呵,我跟了一下,确实m_pchData发生了变化来着,但cstring所存储的内容没有发生变化,是不是memcmp连着cstring 中的m_pchData一起比较呀,如果这样,那我想肯定是不相等了。因为在后面ClientConf有做取值的操作,但取的值和TmpConf中值相等,CString中指向存储这段内容的m_pchData却变了,于是memcmp比较得出不相等的结果!!<BR>谢谢您指点,诶!偶回去要多看看C++!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:凯凯 回复日期:2002-12-05 10:01:21
<br>内容:哈哈,我也来个再次澄清。<BR><BR>这里的关键是CString类,它是如果保存字符信息的。<BR><BR>CString str1 = _T("Hello!");<BR>CString str2 = _T("Hello!");<BR>bool bValue1 = (str1 == str2);<BR>bool bValue2 = (0 == memcmp(&amp;str1, str2, sizeof(CString)));<BR><BR>这段代码的结果是什么呢? bValue1为真,说明字符串是相等的。bValue2为假说明类对象在内存的内容是不等的。<BR>造成这一现象的原因是因为CString类没不直接保存实际的字符串,而是保存了一个指向字符串的指针。<BR>所以上面的问题只能是为结构写一个operator==自己来一项项对比。<BR>如果实在想用memcmp就不要用CString了,改用字符数组好了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-12-05 10:20:47
<br>内容:<BR>凯凯 ,你的之所以不相等是因为你没有str1=str2,那当然是不等了,因为m_pData不等。<BR><BR>如下<BR>CString str1 = _T("Hello!");<BR>CString str2 = _T("Hello!");<BR><BR>str1 = str2 ;<BR><BR>bool bValue1 = (str1 == str2);<BR>bool bValue2 = (0 == memcmp(&amp;str1, &amp;str2, sizeof(CString)));<BR>//明显现在bValue2为true<BR><BR>而<BR>////////////////////////////////////<BR>因为ClientConf结构赋值时引起 CString::operator==(const CString&amp;)的调用。而CString::operator==(const CString&amp;)通常会导致 m_pchData的赋值,所以结构赋值会导致memcmp(..) == 0 .<BR>//////////////////////////////////////<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-12-05 10:22:16
<br>内容:高扬,如果还解决不了问题,你把代码zip或rar上来我们看看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-12-05 10:46:29
<br>内容:这样使用CString是不行的,因为如果memcmp相等,也就意味着,两个CString操纵的是同一个字符串数组,这样如果改变了其中的一个,另一个也自动改变了。我想这不是设计这个结构的初衷。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:高扬 回复日期:2002-12-05 13:12:11
<br>内容:在函数里<BR>func()<BR>{<BR>ClientConf ClientConf;<BR>TmpConf TmpConf;<BR>...//ClientConf被赋予值<BR>TmpConf = ClientConf;<BR>...//在这个过程里我可以保证两个STRUCT的值没有改变,我一项项比较过了<BR>//但是跟进去,看到里面CLIENTCONF结构中的CString 成员的m_pchData的地址是改变了<BR><BR>//然后在这,函数总是告诉我比较的结果是不等的<BR>if(memcmp(&amp;ClientConf,&amp;TmpConf,sizeof(ClientConf)) != 0)<BR>{<BR>&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;}<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:高扬 回复日期:2002-12-06 08:59:42
<br>内容:总之,非常感谢两位对小弟的指教,我这里道谢了,可这分数,呵呵,我都不晓得给谁好
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -