﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-R.R.-随笔分类-C/C++</title><link>http://www.cppblog.com/wiisola/category/13046.html</link><description>愿我来世 身如琉璃</description><language>zh-cn</language><lastBuildDate>Fri, 22 Oct 2010 02:40:00 GMT</lastBuildDate><pubDate>Fri, 22 Oct 2010 02:40:00 GMT</pubDate><ttl>60</ttl><item><title>DN+的第一次亮相</title><link>http://www.cppblog.com/wiisola/archive/2010/09/26/127688.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Sat, 25 Sep 2010 17:44:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/09/26/127688.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/127688.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/09/26/127688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/127688.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/127688.html</trackback:ping><description><![CDATA[恩恩，这个小玩具（龙之谷加点模拟器）一个月前就开始做了，因为对GTK不熟悉，所以中间拖了很久，现在基本功能已经实现，界面如下，有不少按钮以及全部菜单都是假的，无所谓，基本的功能已经OK了，下一步应该会加上视频演示吧。。恩，自我感觉良好。（今天真开心。。啦啦啦）<br><br><img height=632 alt="" src="http://www.cppblog.com/images/cppblog_com/wiisola/2.JPG" width=806 border=0> 
<img src ="http://www.cppblog.com/wiisola/aggbug/127688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-09-26 01:44 <a href="http://www.cppblog.com/wiisola/archive/2010/09/26/127688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC依赖库顺序问题</title><link>http://www.cppblog.com/wiisola/archive/2010/05/18/115637.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Mon, 17 May 2010 18:01:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/05/18/115637.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/115637.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/05/18/115637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/115637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/115637.html</trackback:ping><description><![CDATA[今天在把linux下做的ipmsg移植到windows过程中，因为包含了一个开源库SimpleSocket，而这个库又引用了winsock2，没太注意就写下了下面的makefile：<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-FAMILY: Monaco; FONT-SIZE: 12px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">g++ -o tt tt.o <span style="COLOR: #000000">-</span><span style="COLOR: #000000">lws2_32&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">lclsocketd</span></div>
<br>结果报出了N多丑陋的undefined reference..之后尝试将-lws2_32和-lclsocketd交换位置后，编译通过。<br><br>上网查了下，发现gcc编译时依赖库的顺序是很重要的。比如说，liba.a依赖于libb.a，则必须写成-la -lb，似乎感觉这种顺序很奇怪。另外参考网上<a href="http://www.cppblog.com/findingworld/archive/2008/11/09/66408.html">http://www.cppblog.com/findingworld/archive/2008/11/09/66408.html</a>的内容，在库比较多依赖关系比较复杂或者相互依赖或者自己不清楚的情况下，可以采取下面2种办法：<br><br>1、-la -lb -la，丑陋，但是有效。<br>2、gcc有这样的选项，-Xlinker，写成如下格式可以强制gcc重复查找依赖库：<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-FAMILY: Monaco; FONT-SIZE: 12px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">g++ -o tt tt.o -Xlinker "-(" <span style="COLOR: #000000">-</span><span style="COLOR: #000000">lws2_32&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">lclsocketd "-)"</span></div>
<br>这样在括号中的库的依赖关系就不需要你操心啦，虽然会延长链接时间。不过本人在实际使用过程中，g++认不出"-)"，不加也可以链接成功。 
<img src ="http://www.cppblog.com/wiisola/aggbug/115637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-05-18 02:01 <a href="http://www.cppblog.com/wiisola/archive/2010/05/18/115637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS中为GUI程序添加console窗口</title><link>http://www.cppblog.com/wiisola/archive/2010/05/15/115474.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Sat, 15 May 2010 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/05/15/115474.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/115474.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/05/15/115474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/115474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/115474.html</trackback:ping><description><![CDATA[为了方便调试，需要在VS中为GUI程序添加console窗口。<br><br>项目 -&gt; 属性 -&gt; 配置属性 -&gt; 生成事件 -&gt; 生成后事件 -&gt; 命令行：<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-FAMILY: Monaco; FONT-SIZE: 12px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">editbin&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">SUBSYSTEM:CONSOLE&nbsp;$(OUTDIR)\ipmsg.exe</span></div>
<br>ipmsg.exe改为可执行代码的文件名。 
<img src ="http://www.cppblog.com/wiisola/aggbug/115474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-05-15 22:31 <a href="http://www.cppblog.com/wiisola/archive/2010/05/15/115474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于数组名的表示</title><link>http://www.cppblog.com/wiisola/archive/2010/03/18/110034.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Thu, 18 Mar 2010 11:35:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/03/18/110034.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/110034.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/03/18/110034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/110034.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/110034.html</trackback:ping><description><![CDATA[今天看到同事写的代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-FAMILY: Courier New; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;retcode[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">memset(&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">retcode,&nbsp;</span><span style="COLOR: #000000">0x00</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(retcode)&nbsp;);</span></div>
<br>因为以前没见过这样的写法，心想retcode本身就是指向字符数组的指针，再加个&amp;不是变成指向指向字符数组指针的指针了吗？结果他告诉我，这样写是可以的，而且可以防止retcode改变类型造成的coredump的情况。<br><br>带着怀疑的想法去查了下《C与指针》，还真发现了这种用法。根据书中描述我才知道，这个retcode一般情况下表示的是指向char的<span style="COLOR: red">常量指针</span>，只有两种情况，数组名所表示的不是指针常量：<br>&nbsp;&nbsp;&nbsp;1、当数组名作为sizeof操作符的操作数时。这时sizeof返回的是整个数组的长度，而不是指向数组的指针的长度；<br>&nbsp;&nbsp;&nbsp;2、当数组名作为单目操作符&amp;的操作数时。<span style="COLOR: #ff0000">取一个数组名的地址产生的是一个指向数组的指针</span>（和使用数组名效果相同），而不是指向某个指针常量值的指针。<br><br>这么一句memset把两种情况都用上了。 <br><br>------------------------------------------------------------------------------<br>2010.04.26<br><br>今天遇到一个问题，在调zlib的compress的函数的时候总是报Z_STREAM_ERROR，半天都没找到原因，最后发现，我写了下面的代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-FAMILY: Courier New; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">Byte</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;alObuf;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">alObuf = (Byte*)calloc(_MAX_ZMG_BUFFER, sizeof(Byte));</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">memset(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">alObuf,&nbsp;</span><span style="COLOR: #000000">0x00</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(alObuf));</span></div>
因为自从知道上面的数组memset的写法以后，就一直习惯在前面加个&amp;。然而，这一次，栽了。。<br>仔细看，这只是个unsigned char指针，加上了&amp;就完全不知道指哪儿去了。。。<br><br><span style="COLOR: red"><strong>所以，这个写法，只能用在数组前，千万别用在指针前。。。另外，这里的sizeof(alObuf)也只是4而已，指针的sizeof。。。数组和指针，别搞混了。</strong></span> 
<img src ="http://www.cppblog.com/wiisola/aggbug/110034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-03-18 19:35 <a href="http://www.cppblog.com/wiisola/archive/2010/03/18/110034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在ec中实现同时对两个数据库的操作</title><link>http://www.cppblog.com/wiisola/archive/2010/03/14/109690.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Sun, 14 Mar 2010 10:45:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/03/14/109690.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/109690.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/03/14/109690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/109690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/109690.html</trackback:ping><description><![CDATA[<p>需要用到对informix的两个库的操作，一个是本地库一个是远程库，因为要有交叉操作，所以如果不停的开关会影响效率。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">EXEC&nbsp;SQL&nbsp;connect&nbsp;to&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">db1@online7</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">db1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>EXEC&nbsp;SQL&nbsp;connect&nbsp;to&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">db2@online9</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">db2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;</span></div>
<p><br>用时指定当前的连接：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>EXEC SQL set connection 'db1'; </div>
<img src ="http://www.cppblog.com/wiisola/aggbug/109690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-03-14 18:45 <a href="http://www.cppblog.com/wiisola/archive/2010/03/14/109690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Informix SELECT MAX时遇到的问题</title><link>http://www.cppblog.com/wiisola/archive/2010/02/25/108456.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Thu, 25 Feb 2010 15:00:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/02/25/108456.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/108456.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/02/25/108456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/108456.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/108456.html</trackback:ping><description><![CDATA[需要写一个卸数的工具，有一个SELECT MAX的操作：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">EXEC&nbsp;SQL&nbsp;SELECT&nbsp;MAX(index)&nbsp;INTO&nbsp;:index<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;table<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">:x&nbsp;AND&nbsp;y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">:y;</span></div>
<br>目的是取出满足WHERE条件的index的最大值。但是得出的结果却是-21474836478，十六进制为0x00000080，非常奇怪。尝试了很多次还是这种结果，后来在网上找到了一篇文章（<a href="http://www.tek-tips.com/viewthread.cfm?qid=1501792&amp;page=3">http://www.tek-tips.com/viewthread.cfm?qid=1501792&amp;page=3</a>），大致意思是当满足WHERE条件的条数为0时，这条语句会有问题。仔细检查才发现我其中的y值取错了，造成符合条件的记录数为0，造成以上的问题，至于index为什么会有那个值原因未知。<br><br>结论是：<span style="COLOR: #ff0000">在使用SELECT MAX之前，需要首先确定满足WHERE条件的COUNT(*)&gt;0，否则会造成未知错误。<br><br></span>PS：至于刚才网址中作者所说的空表时会报-201错我没有碰到，我在空表时和没找到记录时现象相同。 
<img src ="http://www.cppblog.com/wiisola/aggbug/108456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-02-25 23:00 <a href="http://www.cppblog.com/wiisola/archive/2010/02/25/108456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浮点数的表示</title><link>http://www.cppblog.com/wiisola/archive/2010/02/11/107724.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Thu, 11 Feb 2010 15:49:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/02/11/107724.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/107724.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/02/11/107724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/107724.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/107724.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: courier new">研究了一下浮点型在内存中的表示方法，终于明白fortify果然不是吃素的，原来double型数字真的有可能超过200位的。。<br><br><strong style="COLOR: #3366ff">一、浮点型在内存中的表示<br></strong>单精度float型:&nbsp; 1位符号位,&nbsp; 8位阶码(固定偏移&nbsp; 7F), 尾数23, 固定隐含位有<br>双精度double型: 1位符号位, 11位阶码(固定偏移 3FF), 尾数52, 固定隐含位有<br>long double型: 1位符号位, 15位阶码(固定偏移3FFF), 尾数64, 固定隐含位无<br>某些编译器中把long double作double处理 <br><br>其中，<br>符号位s：0表示正，1表示负；<br>阶码e：表示指数，需要减去固定偏移de；<br>尾数x：表示纯小数位，固定隐含位z是指整数位的1或者0。<br>表示成十进制就是(-1)^s * 2^(e-de) * (z+x)<br>对于32位系统，float占32位，double占64位<br><br>举例来说，在BIG ENDIAN中二进制表示为01000001 00100000 00000000 00000000的浮点数，根据上面的规则，可以写成：<br>0,10000010,0100000&nbsp;&nbsp; 000000000&nbsp;&nbsp; 0000000<br>符号位s=0，阶码e=10000010b=130，固定偏移de=0x7F=127，尾数x=0.01000000000000000000000b=0.25，固定隐含位有，z=1<br>根据公式可以算出这个数的十进制表示为：(-1)^0 * 2^(130-127) * (1+0.25) = 10.0<br><br><strong style="COLOR: #3366ff">二、一些特殊的浮点数</strong><br>0,00000000,0000000&nbsp;&nbsp; 00000000&nbsp;&nbsp; 00000000和1,00000000,0000000&nbsp;&nbsp; 00000000&nbsp;&nbsp; 00000000均表示0（阶码和尾数都是0）<br>*,11111111,*******&nbsp;&nbsp; ********&nbsp;&nbsp; ********&nbsp;&nbsp; 表示非法数字（阶码是255时）<br>最大的float数：0,11111110,1111111&nbsp;&nbsp; 11111111&nbsp;&nbsp; 11111111&nbsp;&nbsp; 用10进制表示约为&nbsp;&nbsp; +3.4e38&nbsp;&nbsp;&nbsp;<br>最小的float数：1,11111110,1111111&nbsp;&nbsp; 11111111&nbsp;&nbsp; 11111111&nbsp;&nbsp; 用10进制表示约为&nbsp;&nbsp; -3.4e38&nbsp;&nbsp; <br>绝对值最小的float数：0,00000000,0000000&nbsp;&nbsp; 00000000&nbsp;&nbsp; 00000001和1,00000000,0000000&nbsp;&nbsp; 00000000&nbsp;&nbsp; 00000001&nbsp;&nbsp; <br><br><strong style="COLOR: #3366ff">三、浮点数的精度<br></strong>单精度数的尾数用23位存储，加上默认的小数点前的1位1，2^(23+1) = 16777216。因为 10^7 &lt; 16777216 &lt; 10^8，所以说单精度浮点数的有效位数是7位。 <br>双精度的尾数用52位存储，2^(52+1) = 9007199254740992，10^16 &lt; 9007199254740992 &lt; 10^17，所以双精度的有效位数是16位。<br>如果你在浮点数的有效位后增加数字的话，结果是不会变化的。 <br><br><strong style="COLOR: #3366ff">四、浮点数的取值范围</strong><br>float取值范围：<br>负数取值范围为 -3.4028235E+38 到 -1.401298E-45，正数取值范围为 1.401298E-45 到 3.4028235E+38。<br>double取值范围：<br>负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324，正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。<br>所以说，double型在sprintf的时候，要么想办法回避Buffer Overflow的问题，要么就...给字符数组分配308以上的空间...</p>
<p style="FONT-FAMILY: courier new">&nbsp;</p>
<img src ="http://www.cppblog.com/wiisola/aggbug/107724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-02-11 23:49 <a href="http://www.cppblog.com/wiisola/archive/2010/02/11/107724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sprintf的Buffer Overflow问题</title><link>http://www.cppblog.com/wiisola/archive/2010/02/09/107628.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Tue, 09 Feb 2010 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/02/09/107628.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/107628.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/02/09/107628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/107628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/107628.html</trackback:ping><description><![CDATA[<p>今天在fortify代码扫描的时候检测出一个HOT，漏洞类型是Buffer Overflow，元凶是sprintf。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">sprintf(aTmp,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">16.2f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;TransAmt);</span></div>
<p>其中aTmp是20位字符数组，TransAmt为double型金额字段，值不确定。</p>
<p>理论上来说，是TransAmt按照格式16.2f写进aTmp的时候，有可能产生越界的错误。我一开始考虑将aTmp长度放长后，double应该可以顺利拷进aTmp，尝试将aTmp的长度分配到50，100，200，还是消除不掉这个HOT，因为不明白是double所表示的浮点数的长度有可能超过200位还是fortify认死理，而银行又强制规定代码扫描不能有HOT（-。-），所以将sprintf替换成snprintf。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">snprintf(aTmp,&nbsp;sizeof(aTmp), </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">16.2f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;TransAmt);</span></div>
<br>需要注意的一点是，第二个参数的值。网上有人提到写成snprintf(buf, 10, "%10s", p)其实是不对的，因为这里的长度，是包括结束符0x00的，也就是说，既然需要按照%10s格式化，那么这里的第二个参数必须写成11而不是10。<br><br>相似的，strcpy等不带长度的字符串操作函数，如果不注意写法，往往会有Buffer Overflow的隐患。这时候，一般来说以strncpy等类似的带长度参数的函数替换就可以避免漏洞的产生。<br><br>另外，在网上查这个问题的时候，看到一个关于sprintf和snprintf的自拷贝的问题。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img style="WIDTH: 11px; HEIGHT: 16px" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" width=11 align=top><span style="COLOR: #000000">sprintf(buf, "%s world\n", buf);</span></div>
<br>因为我自己有时候也会有这种写法，但也是不太确定会不会有问题。既然网上已经有明确的研究了，那我就直接拿结论。<br><br><span style="COLOR: red">关于这两个函数的自拷贝问题，在不同的编译器上，结果不同。</span>编译器可以有不同的策略，有的简单的把原先的值抹去，有的会保留。因此，一般来说，我们应该尽量避免这种写法。
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/wiisola/aggbug/107628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-02-09 23:25 <a href="http://www.cppblog.com/wiisola/archive/2010/02/09/107628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>undefined reference to `WinMain@16'错误的一种可能性</title><link>http://www.cppblog.com/wiisola/archive/2010/02/07/107436.html</link><dc:creator>R.R.</dc:creator><author>R.R.</author><pubDate>Sun, 07 Feb 2010 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/wiisola/archive/2010/02/07/107436.html</guid><wfw:comment>http://www.cppblog.com/wiisola/comments/107436.html</wfw:comment><comments>http://www.cppblog.com/wiisola/archive/2010/02/07/107436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wiisola/comments/commentRss/107436.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wiisola/services/trackbacks/107436.html</trackback:ping><description><![CDATA[今天准备手动make原來用CODE BLOCKS写的代码的时候报了这么个错误：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">\MinGW\lib\libmingw32.a(main.o):main.c</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;undefined&nbsp;reference&nbsp;to&nbsp;`WinMain@</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;</span></div>
<p>大概意思是WinMain未定义。WinMain是windows程序的入口函数，一般来说没有main函数或者main函数名拼写错误的话会在编译的时候报这个错。我检查以后，发现main应该是正确的。<br><br>google一下后发现有不少人也遇到这个问题。仔细检查了下Makefile，发现在连接库的时候-lmingw32写在了SDL库的后面，将-lmingw32放在最前面后，问题解决。</p>
<img src ="http://www.cppblog.com/wiisola/aggbug/107436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wiisola/" target="_blank">R.R.</a> 2010-02-07 15:34 <a href="http://www.cppblog.com/wiisola/archive/2010/02/07/107436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>