﻿<?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>BlogJava-so true-随笔分类-C&amp;C++</title><link>http://www.blogjava.net/bacoo/category/28261.html</link><description>心怀未来，开创未来！</description><language>zh-cn</language><lastBuildDate>Sun, 28 Jun 2020 15:59:35 GMT</lastBuildDate><pubDate>Sun, 28 Jun 2020 15:59:35 GMT</pubDate><ttl>60</ttl><item><title>c++原子操作</title><link>http://www.blogjava.net/bacoo/archive/2020/06/28/435574.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Sun, 28 Jun 2020 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2020/06/28/435574.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/435574.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2020/06/28/435574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/435574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/435574.html</trackback:ping><description><![CDATA[<div>1. __sync_bool_compare_and_swap系列是gcc最早内置的；</div><div>2. __atomic_compare_exchange_n系列是新版gcc内置的，支持6种memory order；</div><div>3. std::atomic之类的是stl的封装；</div><div>4. 6种mem order，https://www.zhihu.com/question/24301047里讲得不错，概括下：</div><div>memory_order_seq_cst最严，memory_order_relaxed最松，通常是用acquire（load时）/release（store时）模式，在该大模式下：</div><div>a. 通常是读用memory_order_acquire，写用memory_order_release；</div><div>b. 如果只是针对单个变量且该变量没有依赖的变量，acquire可以弱化为consume；</div><div>c. 如果不想区分什么单变量多变量或读写状态，简单点统一用memory_order_acq_rel。</div><img src ="http://www.blogjava.net/bacoo/aggbug/435574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2020-06-28 17:19 <a href="http://www.blogjava.net/bacoo/archive/2020/06/28/435574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++14 transducer</title><link>http://www.blogjava.net/bacoo/archive/2019/05/09/433762.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 09 May 2019 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2019/05/09/433762.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/433762.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2019/05/09/433762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/433762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/433762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp; 1&nbsp;/*&nbsp;&nbsp;2&nbsp;&nbsp;*&nbsp;transducer.cpp&nbsp;&nbsp;3&nbsp;&nbsp;*&nbsp;&nbsp;4&...&nbsp;&nbsp;<a href='http://www.blogjava.net/bacoo/archive/2019/05/09/433762.html'>阅读全文</a><img src ="http://www.blogjava.net/bacoo/aggbug/433762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2019-05-09 18:53 <a href="http://www.blogjava.net/bacoo/archive/2019/05/09/433762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深度剖析右值、右值引用、完美转发等相关概念</title><link>http://www.blogjava.net/bacoo/archive/2018/12/06/433537.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 06 Dec 2018 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2018/12/06/433537.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/433537.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2018/12/06/433537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/433537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/433537.html</trackback:ping><description><![CDATA[<div>右值、右值引用（T&amp;&amp;）、std::move、完美转发（std::forward）、通用引用（universal reference）、引用折叠（reference collapsing）这些概念貌似很玄，但其实很它们想做的事情很简单而且很单一，抓住本质就豁然开朗了。</div><div>上面这些概念的引入完全是为了解决一个问题：尽可能用浅拷贝代替深拷贝；具体该如何实施呢：</div><div>1. 定义move constructor或move operator=，如果你新定义的类没有move constructor或move operator=，那根本就用不上上面那些高级的概念；</div><div>2. 告诉编译器什么时候用move constructor（而不是用copy constructor），这就需要借助std::move来把左值转成右值；</div><div></div><div>下面是一些零散的箴言：</div><div>左值：能用&amp;来取地址的东西（有名字的都是左值，不管其是否是const的，而且引用都是左值，因为引用肯定得起个名字去引用另外一个东西）；</div><div>右值：不能用&amp;来取地址的东西（说白了就是没名字的东西，例如函数的返回值）；</div><div></div><div>const T&amp;是万能引用，即 const T&amp; t = XXX; //XXX是左值、右值都可以；</div><div>T&amp; t = XXX; //XXX必须是左值；</div><div>T&amp;&amp; t = XXX; //XXX必须是右值；<br />const T&amp;&amp; t = XXX; //XXX必须是右值；</div><div></div><div>不要把T&amp;&amp;和const T&amp;划等号，两个都能hold住临时变量，给临时变量续命，但：</div><div>T&amp;&amp; t1 = get_val();</div><div>const T&amp; t2 = get_val();</div><div>t1和t2都是左值，因为都可以用&amp;来取地址，但t1是非const的，因此可以t1.xxx = yyy;去修改t1里的内容（当然如果你定义const T&amp;&amp; t1 = get_val()，那就不能更改了），这样一来，下面这种代码受益了：</div><div>&nbsp; &nbsp; string name = get_name(); //因为后面要修改name，所以不能用const string&amp; name</div><div>&nbsp; &nbsp; trim(name);</div><div>&nbsp; &nbsp; 可以修改为：</div><div>&nbsp; &nbsp; string&amp;&amp; name = get_name();</div><div>&nbsp; &nbsp; trim(name);</div><div>&nbsp; &nbsp;&nbsp;</div><div>关于右值引用的生命周期（续命能续多久，下面讨论的也适用于const T&amp;）：</div><div>1. 函数不能返回对局部变量的引用（右值引用也不行），这是铁的原则；</div><div>2. 引用一旦建立（用一个名字hold住了临时变量），例如T&amp;&amp; t = get_val();那么这个临时变量的析构时机就是变量t退出其作用域的时候，因此下面的代码是错误的：</div><div>&nbsp; &nbsp; struct A {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; A(T&amp;&amp; t): _t(t) {};</div><div>&nbsp; &nbsp; &nbsp; &nbsp; T&amp;&amp; _t;</div><div>&nbsp; &nbsp; };</div><div>&nbsp; &nbsp; A* pa = NULL;</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; T&amp;&amp; t = get_val();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pa = new A(t);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; pa-&gt;_t; //runtime crash, _t已经析构了</div><div>&nbsp; &nbsp;&nbsp;</div><div>std::move只做一件事：把左值转成右值，因此T t(std::move(get_val()));不管什么情况下都能保证调用move constructor来构造t；</div><div>c++0x里stl的各种容器都已经新增了move constructor，因此当你希望使用浅拷贝的时候可以借助std::move来达成所愿了，至于什么时候可以用浅拷贝，分两种情况，有些情况编译器会默认帮你去调用move constructor，但在你自己新定义的函数或者类成员方法里就需要你自己来判断了，大的原则就是：这个变量只是传递过去就好，中间可以转好几道手，但在传递过程中不需要做修改；</div><div></div><div>完美转发（std::forward），谈到这个就必须得谈到通用引用（universal reference）、引用折叠（reference collapsing），其实这几个概念是捆绑在一起的，而且只用在模板范畴内，而且只是为了解决下面这一种模式：</div><div>template &lt;typename T&gt;</div><div>void func2(T t) {</div><div>}</div><div></div><div>template &lt;typename T&gt;</div><div>void func(T&amp;&amp; t) {</div><div>&nbsp; &nbsp; func2(std::forward&lt;T&gt;(t));</div><div>}</div><div>上面这个到底完美在哪里？</div><div>func(get_val()); //这个会导致最后是通过move constructor来构造func2函数里的参数t</div><div>T t0 = get_val();</div><div>T&amp; t1 = t0;</div><div>const T&amp; t2 = get_val();</div><div>T&amp;&amp; t3 = get_val();</div><div>const T&amp;&amp; t4 = get_val();</div><div>func(t0); func(t1); func(t2); func(t3); func(t4); //这5个都会导致最后是通过copy constructor来构造func2函数里的参数t，因为这个5个t*都是左值（有名字的就是左值）；</div><div></div><div>&nbsp; &nbsp; 插播两个你有可能费解的地方：</div><div>&nbsp; &nbsp; 1. func函数的参数是T&amp;&amp;, t0、t1都是左值，不是说不能用左值赋值给右值吗？这就要提到引用折叠了（详情可参见最后我推荐的文章），说白了因为func是个模板函数才能这么干；</div><div>&nbsp; &nbsp; 2. t3类型是T&amp;&amp;，func的参数也是T&amp;&amp;，把t3传递过去，居然还是调用copy contructor，因为t3是右值引用，它引用了一个右值，但它本身却是左值，到了func函数内部，func函数只能知道它是个左值，了解不到它原本的面貌居然是个右值引用；如果还不理解，再看下下面：</div><div>&nbsp; &nbsp; template &lt;typename T&gt;</div><div>&nbsp; &nbsp; void print(T t) {</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; int x1 = 1; int&amp; x2 = x1; const int&amp; x3 = x1; int* x4 = &amp;x1;</div><div>&nbsp; &nbsp; 分别用x{1..4}来调用print方法，你肯定知道x1、x2、x3到了print函数里，T就是int，只有x4会被print函数认为T是int*，引用这个概念在模板类型推导时是无法让模板参数感知到的；此外print(T)和print(T&amp;)是不能同定义的，编译器会抱怨ambiguous，这个事实也能帮你多一些理解。</div><div></div><div>如果想让上面的这5个最终能通过move constructor来构造func2函数里的参数t，那么只要给每个都用func(std::move(t*))包装下就可以了；</div><div>再澄清下，func2函数的参数是类型T，并不是引用，因此无论如何都需要生成T的一个新实例，区别就是到底是通过copy constructor还是move constructor来生成了；</div><div>所以，所谓的完美就是体现在了forward能把本来是左值的按左值来传递，本来是右值的按照右值来传递，具体来说就是作为中间环节的func函数内部实现过程中使用了func2(std::forward&lt;T&gt;(t));这句话，使得可以按照调用方实际的真实情况告知给func2函数如何构造参数t，这有什么好处呢，还是那句话：在适当的时机做合适的引导，让编译器帮你调用浅拷贝。</div><div></div><div>除此之外，你完全可以忘掉这些玄乎其神的概念，所以只要会套用就可以了。</div><div></div><div>以上是一些梗概性或结论性的东西，再结合下面这篇文章，把骨头之外的血肉补上吧：</div><div>https://codinfox.github.io/dev/2014/06/03/move-semantic-perfect-forward/</div><img src ="http://www.blogjava.net/bacoo/aggbug/433537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2018-12-06 11:38 <a href="http://www.blogjava.net/bacoo/archive/2018/12/06/433537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>type_to_pointer</title><link>http://www.blogjava.net/bacoo/archive/2018/11/08/433477.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 08 Nov 2018 11:03:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2018/11/08/433477.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/433477.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2018/11/08/433477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/433477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/433477.html</trackback:ping><description><![CDATA[<div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp; 1</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;#include&nbsp;&lt;typeinfo&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;#include&nbsp;&lt;fstream&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;#include&nbsp;&lt;sstream&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;#include&nbsp;&lt;stdint.h&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;#include&nbsp;&lt;pthread.h&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;#include&nbsp;&lt;unistd.h&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;#include&nbsp;&lt;map&gt;<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">set</span>&gt;<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T*&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T*&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T*<span style="color: #0000FF; ">const</span>&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T&nbsp;*<span style="color: #0000FF; ">const</span>&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T**&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T**&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T**<span style="color: #0000FF; ">const</span>&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T&amp;&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T&amp;&amp;&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T&amp;&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;template&nbsp;&lt;typename&nbsp;T,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&gt;<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T[N]&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;template&nbsp;&lt;typename&nbsp;T,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&gt;<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T[N]&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;template&nbsp;&lt;typename&nbsp;T,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&gt;<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;T*[N]&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;template&nbsp;&lt;typename&nbsp;T,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&gt;<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T*[N]&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;template&nbsp;&lt;typename&nbsp;T,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&gt;<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;type_to_pointer&lt;<span style="color: #0000FF; ">const</span>&nbsp;T&nbsp;*<span style="color: #0000FF; ">const</span>[N]&gt;&nbsp;{&nbsp;typedef&nbsp;T*&nbsp;type;&nbsp;};<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;template&nbsp;&lt;typename&nbsp;FromType,&nbsp;typename&nbsp;ToType&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>&gt;<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;type_printer()&nbsp;{<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;TYPE_PRINT(var)&nbsp;type_printer&lt;decltype(var),&nbsp;type_to_pointer&lt;decltype(var)&gt;::type&gt;()<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;CONST_CAST_TO_POINTER(var)&nbsp;const_cast&lt;typename&nbsp;type_to_pointer&lt;decltype(var)&gt;::type&gt;(var)<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x1&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x1);<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&amp;&nbsp;x2&nbsp;=&nbsp;x1;<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x2);<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;x3&nbsp;=&nbsp;&amp;x1;<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x3);<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(CONST_CAST_TO_POINTER(x3));<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*<span style="color: #0000FF; ">const</span>&nbsp;x4&nbsp;=&nbsp;&amp;x1;<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x4);<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(CONST_CAST_TO_POINTER(x4));<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&amp;&nbsp;x5&nbsp;=&nbsp;x1;<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x5);<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*<span style="color: #0000FF; ">const</span>&nbsp;x6&nbsp;=&nbsp;&amp;x1;<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x6);<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(CONST_CAST_TO_POINTER(x6));<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;x7&nbsp;=&nbsp;&amp;x1;<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x7);<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&amp;&amp;&nbsp;x8&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x8);<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x9[2]&nbsp;=&nbsp;{1,&nbsp;2};<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x9);<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x10[2]&nbsp;=&nbsp;{1,&nbsp;2};<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x10);<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;x11[2]&nbsp;=&nbsp;{NULL,&nbsp;NULL};<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x11);<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;x12[2]&nbsp;=&nbsp;{NULL,&nbsp;NULL};<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x12);<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*<span style="color: #0000FF; ">const</span>&nbsp;x13[2]&nbsp;=&nbsp;{NULL,&nbsp;NULL};<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(x13);<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;<br /><span style="color: #008080; ">100</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(argc);<br /><span style="color: #008080; ">101</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE_PRINT(argv);<br /><span style="color: #008080; ">102</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">103</span>&nbsp;}</div></div><img src ="http://www.blogjava.net/bacoo/aggbug/433477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2018-11-08 19:03 <a href="http://www.blogjava.net/bacoo/archive/2018/11/08/433477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>read-write lock</title><link>http://www.blogjava.net/bacoo/archive/2018/05/14/433212.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Mon, 14 May 2018 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2018/05/14/433212.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/433212.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2018/05/14/433212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/433212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/433212.html</trackback:ping><description><![CDATA[（一）当前被读锁占着<br /> &nbsp;&nbsp;&nbsp;&nbsp;1。如果读优先(默认是PTHREAD_RWLOCK_PREFER_READER_NP，即读优先)，那么等着的读请求可以快速拿到锁，写一直被饿着（直到没有任何等待获取读锁的情况下，写才能拿到写锁）；<br /> &nbsp;&nbsp;&nbsp;&nbsp;2。如果写优先，那么读和写都等着，一但前面的读释放了锁，写立刻就会优先读来拿到锁；<br /> （二）当前被写锁占着<br /> &nbsp;&nbsp;&nbsp;&nbsp;不论谁优先，都需要把所有等着的写都服务完，才会给读机会，所以写多读少的情况下，就应该用互斥锁了；<br /><br />测试程序：<br />#include &lt;iostream&gt;<div>#include &lt;string&gt;</div><div>#include &lt;fstream&gt;</div><div>#include &lt;sstream&gt;</div><div>#include &lt;stdint.h&gt;</div><div>#include &lt;pthread.h&gt;</div><div>#include &lt;vector&gt;</div><div>#include &lt;map&gt;</div><div>#include &lt;set&gt;</div><div></div><div>using namespace std;</div><div></div><div>long g_idx = 0;</div><div></div><div>class ThreadRwLock {</div><div>private:</div><div>&nbsp; &nbsp; pthread_rwlock_t m_rw_mutex;</div><div></div><div>public:</div><div>&nbsp; &nbsp; ThreadRwLock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlockattr_t attr;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; // 设置写优先</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlockattr_init(&amp;attr);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //pthread_rwlockattr_setkind_np(&amp;attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlock_init(&amp;m_rw_mutex, &amp;attr);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; ~ThreadRwLock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlock_destroy(&amp;m_rw_mutex);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void rdlock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlock_rdlock(&amp;m_rw_mutex);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void wrlock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlock_wrlock(&amp;m_rw_mutex);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; int tryrdlock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return pthread_rwlock_tryrdlock(&amp;m_rw_mutex);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; int trywrlock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return pthread_rwlock_trywrlock(&amp;m_rw_mutex);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void unlock() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pthread_rwlock_unlock(&amp;m_rw_mutex);</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>ThreadRwLock g_lock;</div><div></div><div>void* thread_routine(void* arg) {</div><div>&nbsp; &nbsp; long is_write = (long)arg;</div><div>&nbsp; &nbsp; if (is_write) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("%lu wait write lock\n", pthread_self()); fflush(stdout);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; g_lock.wrlock();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; long idx = __sync_add_and_fetch(&amp;g_idx, 1);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("%lu get write lock, %ld\n", pthread_self(), idx); fflush(stdout);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sleep(5);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; g_lock.unlock();</div><div>&nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("%lu wait read lock\n", pthread_self()); fflush(stdout);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; g_lock.rdlock();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; long idx = __sync_add_and_fetch(&amp;g_idx, 1);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("%lu get read lock, %ld\n", pthread_self(), idx); fflush(stdout);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sleep(5);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; g_lock.unlock();</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; return NULL;</div><div>}</div><div></div><div>int main(int argc, char* argv[]) {</div><div>&nbsp; &nbsp; pthread_t tid = 0;</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div></div><div>&nbsp; &nbsp; getchar(); //让程序暂停，等待键盘敲入一个字节后，接着走</div><div></div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; sleep(2); //确保写锁被优先拿到</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)1);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div>&nbsp; &nbsp; pthread_create(&amp;tid, NULL, thread_routine, (void*)0);</div><div></div><div>&nbsp; &nbsp; getchar();</div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div></div><img src ="http://www.blogjava.net/bacoo/aggbug/433212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2018-05-14 12:07 <a href="http://www.blogjava.net/bacoo/archive/2018/05/14/433212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>partition of quick sort</title><link>http://www.blogjava.net/bacoo/archive/2017/11/26/432921.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Sat, 25 Nov 2017 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2017/11/26/432921.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/432921.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2017/11/26/432921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/432921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/432921.html</trackback:ping><description><![CDATA[<div>&nbsp; &nbsp; int partition(vector&lt;int&gt;&amp; nums, int i, int j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int pivot = i++;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while (true) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (i &lt;= j &amp;&amp; nums[i] &lt;= nums[pivot]) ++i; //a</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (j &gt;= i &amp;&amp; nums[j] &gt;= nums[pivot]) --j; //b</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (i &gt; j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int t = nums[i]; nums[i++] = nums[j]; nums[j--] = t; //c</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int t = nums[j]; nums[j] = nums[pivot]; nums[pivot] = t;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return j;</div><div>&nbsp; &nbsp; }<br />上面这段代码里，细节太多太多，居然搞了一晚上才搞出来，总的来说大方向上：<br />1. 要确保最后能i &gt; j才能终止（其实终止的时候，是一定满足j + 1 == i的）；<br />2. 因为保留的是最左侧的数为基准，排序目标是从左到右按照从小到大排，因此最后要把pivot和j交换；<br />3. //a和//b里，其实只要有一个nums[i]/nums[j]和nums[pivot]的等于判断就可以了，这里为了一致性，都保留了对等于的判断；<br />4. //c里增加了i和j各自挪一步的操作，因此如下写法更好：<br /><div>&nbsp; &nbsp; int partition(vector&lt;int&gt;&amp; nums, int i, int j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int pivot = i++;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while (true) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (i &lt;= j &amp;&amp; nums[i] &lt;= nums[pivot]) ++i;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (j &gt;= i &amp;&amp; nums[j] &gt;= nums[pivot]) --j;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (i &gt; j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; swap(nums[i++], nums[j--]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; swap(nums[pivot], nums[j]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return j;</div><div>&nbsp; &nbsp; }</div></div><img src ="http://www.blogjava.net/bacoo/aggbug/432921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2017-11-26 00:03 <a href="http://www.blogjava.net/bacoo/archive/2017/11/26/432921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sudoku</title><link>http://www.blogjava.net/bacoo/archive/2017/11/03/432875.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Fri, 03 Nov 2017 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2017/11/03/432875.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/432875.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2017/11/03/432875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/432875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/432875.html</trackback:ping><description><![CDATA[<div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp; 1</span>&nbsp;#include&nbsp;&lt;sys/time.h&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;#include&nbsp;&lt;stdlib.h&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">set</span>&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Sudoku&nbsp;{<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sudoku(<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&amp;&nbsp;question,&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;does_try_all_answers&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>):&nbsp;m_does_try_all_answers(does_try_all_answers),&nbsp;m_data(9)&nbsp;{<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i)&nbsp;{<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_data[i].resize(9);<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_data[i][j]&nbsp;=&nbsp;question[i&nbsp;*&nbsp;9&nbsp;+&nbsp;j];<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Solve()&nbsp;{<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Fill(0,&nbsp;0);<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;GiveOneAnswer()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_all_answers.empty()&nbsp;?&nbsp;""&nbsp;:&nbsp;*m_all_answers.begin();<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">set</span>&lt;std::<span style="color: #0000FF; ">string</span>&gt;&nbsp;GiveAllAnswers()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_all_answers;<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;ProvideOneQuestionRandomly(<span style="color: #0000FF; ">int</span>&nbsp;min_filled_num&nbsp;=&nbsp;30)&nbsp;{<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;std::vector&lt;<span style="color: #0000FF; ">char</span>&gt;&nbsp;&gt;&nbsp;ques(9,&nbsp;std::vector&lt;<span style="color: #0000FF; ">char</span>&gt;(9,&nbsp;'.'));<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;timeval&nbsp;cur_tv;<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&amp;cur_tv,&nbsp;NULL);<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srand(cur_tv.tv_usec);<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;valid_digit_num&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i)&nbsp;{<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(rand()&nbsp;%&nbsp;81&nbsp;&lt;=&nbsp;min_filled_num&nbsp;+&nbsp;valid_digit_num&nbsp;/&nbsp;6)&nbsp;{<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c&nbsp;=&nbsp;rand()&nbsp;%&nbsp;9&nbsp;+&nbsp;'1';<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DoesConflict(ques,&nbsp;i,&nbsp;j,&nbsp;c))&nbsp;{<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;&nbsp;k&nbsp;&lt;&nbsp;8;&nbsp;++k)&nbsp;{<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(c&nbsp;==&nbsp;'9')&nbsp;{<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;'1';<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!DoesConflict(ques,&nbsp;i,&nbsp;j,&nbsp;++c))&nbsp;{<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(8&nbsp;==&nbsp;k)&nbsp;{<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;'.';<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valid_digit_num&nbsp;+=&nbsp;('.'&nbsp;!=&nbsp;c);<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ques[i][j]&nbsp;=&nbsp;c;<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ques[i][j]&nbsp;=&nbsp;'.';<br /><span style="color: #008080; ">&nbsp;64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[82];<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[81]&nbsp;=&nbsp;'\0';<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i)&nbsp;{<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i&nbsp;*&nbsp;9&nbsp;+&nbsp;j]&nbsp;=&nbsp;ques[i][j];<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sudoku&nbsp;sudoku(buf);<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudoku.Solve();<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(81&nbsp;==&nbsp;sudoku.GiveOneAnswer().size())&nbsp;{<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;buf;<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ProvideOneQuestionRandomly(min_filled_num);<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;buf;<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;PrintSudoku(<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&amp;&nbsp;sudoku)&nbsp;{<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sudoku.size()&nbsp;&lt;&nbsp;81)&nbsp;{<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i)&nbsp;{<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;!=&nbsp;j)&nbsp;{<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"&nbsp;";<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;sudoku[i&nbsp;*&nbsp;9&nbsp;+&nbsp;j];<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">100</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">101</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">102</span>&nbsp;<br /><span style="color: #008080; ">103</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;ValidateOneAnswer(<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&amp;&nbsp;answer)&nbsp;{<br /><span style="color: #008080; ">104</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(answer.size()&nbsp;!=&nbsp;81)&nbsp;{<br /><span style="color: #008080; ">105</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">106</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">107</span>&nbsp;<br /><span style="color: #008080; ">108</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i)&nbsp;{<br /><span style="color: #008080; ">109</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;hit_h[9]&nbsp;=&nbsp;{&nbsp;'\0'&nbsp;};<br /><span style="color: #008080; ">110</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;hit_v[9]&nbsp;=&nbsp;{&nbsp;'\0'&nbsp;};<br /><span style="color: #008080; ">111</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">112</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;('.'&nbsp;==&nbsp;answer[i&nbsp;*&nbsp;9&nbsp;+&nbsp;j]&nbsp;||&nbsp;++hit_h[answer[i&nbsp;*&nbsp;9&nbsp;+&nbsp;j]&nbsp;-&nbsp;'1']&nbsp;!=&nbsp;1)&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">row&nbsp;check</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">113</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">114</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;('.'&nbsp;==&nbsp;answer[j&nbsp;*&nbsp;9&nbsp;+&nbsp;i]&nbsp;||&nbsp;++hit_v[answer[j&nbsp;*&nbsp;9&nbsp;+&nbsp;i]&nbsp;-&nbsp;'1']&nbsp;!=&nbsp;1)&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">column&nbsp;check</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">115</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">116</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">117</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;==&nbsp;i&nbsp;%&nbsp;3&nbsp;&amp;&amp;&nbsp;0&nbsp;==&nbsp;j&nbsp;%&nbsp;3)&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">3x3&nbsp;square&nbsp;check</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">118</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;hit_m[9]&nbsp;=&nbsp;{&nbsp;'\0'&nbsp;};<br /><span style="color: #008080; ">119</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i2&nbsp;=&nbsp;i;&nbsp;i2&nbsp;&lt;&nbsp;i&nbsp;+&nbsp;3;&nbsp;++i2)&nbsp;{<br /><span style="color: #008080; ">120</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j2&nbsp;=&nbsp;j;&nbsp;j2&nbsp;&lt;&nbsp;j&nbsp;+&nbsp;3;&nbsp;++j2)&nbsp;{<br /><span style="color: #008080; ">121</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;('.'&nbsp;==&nbsp;answer[i2&nbsp;*&nbsp;9&nbsp;+&nbsp;j2]&nbsp;||&nbsp;++hit_m[answer[i2&nbsp;*&nbsp;9&nbsp;+&nbsp;j2]&nbsp;-&nbsp;'1']&nbsp;!=&nbsp;1)&nbsp;{<br /><span style="color: #008080; ">122</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">123</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">124</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">125</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">126</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">127</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">128</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">129</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">130</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">131</span>&nbsp;<br /><span style="color: #008080; ">132</span>&nbsp;<span style="color: #0000FF; ">private</span>:<br /><span style="color: #008080; ">133</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;AddOneAnswer()&nbsp;{<br /><span style="color: #008080; ">134</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[82];<br /><span style="color: #008080; ">135</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[81]&nbsp;=&nbsp;'\0';<br /><span style="color: #008080; ">136</span>&nbsp;<br /><span style="color: #008080; ">137</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i)&nbsp;{<br /><span style="color: #008080; ">138</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">139</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i&nbsp;*&nbsp;9&nbsp;+&nbsp;j]&nbsp;=&nbsp;m_data[i][j];<br /><span style="color: #008080; ">140</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">141</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">142</span>&nbsp;<br /><span style="color: #008080; ">143</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_all_answers.insert(buf);<br /><span style="color: #008080; ">144</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">145</span>&nbsp;<br /><span style="color: #008080; ">146</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;DoesConflict(<span style="color: #0000FF; ">const</span>&nbsp;std::vector&lt;std::vector&lt;<span style="color: #0000FF; ">char</span>&gt;&nbsp;&gt;&amp;&nbsp;data,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;digit)&nbsp;{<br /><span style="color: #008080; ">147</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;9;&nbsp;++k)&nbsp;{<br /><span style="color: #008080; ">148</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(digit&nbsp;==&nbsp;data[i][k])&nbsp;{<br /><span style="color: #008080; ">149</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">150</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">151</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(digit&nbsp;==&nbsp;data[k][j])&nbsp;{<br /><span style="color: #008080; ">152</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">153</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">154</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">155</span>&nbsp;<br /><span style="color: #008080; ">156</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i0&nbsp;=&nbsp;i&nbsp;-&nbsp;i&nbsp;%&nbsp;3;<br /><span style="color: #008080; ">157</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j0&nbsp;=&nbsp;j&nbsp;-&nbsp;j&nbsp;%&nbsp;3;<br /><span style="color: #008080; ">158</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i2&nbsp;=&nbsp;i0;&nbsp;i2&nbsp;&lt;&nbsp;i0&nbsp;+&nbsp;3;&nbsp;++i2)&nbsp;{<br /><span style="color: #008080; ">159</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j2&nbsp;=&nbsp;j0;&nbsp;j2&nbsp;&lt;&nbsp;j0&nbsp;+&nbsp;3;&nbsp;++j2)&nbsp;{<br /><span style="color: #008080; ">160</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(digit&nbsp;==&nbsp;data[i2][j2])&nbsp;{<br /><span style="color: #008080; ">161</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">162</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">163</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">164</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">165</span>&nbsp;<br /><span style="color: #008080; ">166</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">167</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">168</span>&nbsp;<br /><span style="color: #008080; ">169</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Fill(<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j)&nbsp;{<br /><span style="color: #008080; ">170</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;&nbsp;i&nbsp;&lt;&nbsp;9;&nbsp;++i,&nbsp;j&nbsp;=&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">171</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;&nbsp;j&nbsp;&lt;&nbsp;9;&nbsp;++j)&nbsp;{<br /><span style="color: #008080; ">172</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;('.'&nbsp;==&nbsp;m_data[i][j])&nbsp;{<br /><span style="color: #008080; ">173</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;'1';&nbsp;k&nbsp;&lt;=&nbsp;'9';&nbsp;++k)&nbsp;{<br /><span style="color: #008080; ">174</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DoesConflict(m_data,&nbsp;i,&nbsp;j,&nbsp;k))&nbsp;{<br /><span style="color: #008080; ">175</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">176</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">177</span>&nbsp;<br /><span style="color: #008080; ">178</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_data[i][j]&nbsp;=&nbsp;k;<br /><span style="color: #008080; ">179</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(8&nbsp;==&nbsp;j)&nbsp;{<br /><span style="color: #008080; ">180</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(Fill(i&nbsp;+&nbsp;1,&nbsp;0))&nbsp;{<br /><span style="color: #008080; ">181</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddOneAnswer();<br /><span style="color: #008080; ">182</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!m_does_try_all_answers)&nbsp;{<br /><span style="color: #008080; ">183</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">184</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">185</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">186</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">187</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(Fill(i,&nbsp;j&nbsp;+&nbsp;1))&nbsp;{<br /><span style="color: #008080; ">188</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddOneAnswer();<br /><span style="color: #008080; ">189</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!m_does_try_all_answers)&nbsp;{<br /><span style="color: #008080; ">190</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">191</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">192</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">193</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">194</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">195</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_data[i][j]&nbsp;=&nbsp;'.';<br /><span style="color: #008080; ">196</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">197</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">198</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">199</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">200</span>&nbsp;<br /><span style="color: #008080; ">201</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddOneAnswer();<br /><span style="color: #008080; ">202</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">203</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">204</span>&nbsp;<br /><span style="color: #008080; ">205</span>&nbsp;<span style="color: #0000FF; ">private</span>:<br /><span style="color: #008080; ">206</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;m_does_try_all_answers;<br /><span style="color: #008080; ">207</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;std::vector&lt;<span style="color: #0000FF; ">char</span>&gt;&nbsp;&gt;&nbsp;m_data;<br /><span style="color: #008080; ">208</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">set</span>&lt;std::<span style="color: #0000FF; ">string</span>&gt;&nbsp;m_all_answers;<br /><span style="color: #008080; ">209</span>&nbsp;};<br /><span style="color: #008080; ">210</span>&nbsp;<br /><span style="color: #008080; ">211</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br /><span style="color: #008080; ">212</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;question;<br /><span style="color: #008080; ">213</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">with&nbsp;many&nbsp;answers</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">214</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;question&nbsp;=&nbsp;".2<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..4<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />836..51<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />63887<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..63195<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..4<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />5<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.4.7.2.98<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..";<br /><span style="color: #008080; ">215</span>&nbsp;<br /><span style="color: #008080; ">216</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">with&nbsp;just&nbsp;one&nbsp;answer:&nbsp;</span><span style="color: #008000; text-decoration: underline; ">https://baike.baidu.com/item/%E4%B8%96%E7%95%8C%E6%9C%80%E9%9A%BE%E6%95%B0%E7%8B%AC/13848819</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">217</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;question&nbsp;=&nbsp;"..53<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..8<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />2..7..1.5..4<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.53<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />1..7<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />6..32<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />8..6.5<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.9..4<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.3<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />97..";<br /><span style="color: #008080; ">218</span>&nbsp;<br /><span style="color: #008080; ">219</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;find_all_answers&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">220</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;&gt;&nbsp;1&nbsp;&amp;&amp;&nbsp;81&nbsp;==&nbsp;strlen(argv[1]))&nbsp;{<br /><span style="color: #008080; ">221</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;question&nbsp;=&nbsp;argv[1];<br /><span style="color: #008080; ">222</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">223</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;&gt;&nbsp;1)&nbsp;{<br /><span style="color: #008080; ">224</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find_all_answers&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">225</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">226</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;question&nbsp;=&nbsp;Sudoku::ProvideOneQuestionRandomly();<br /><span style="color: #008080; ">227</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">228</span>&nbsp;<br /><span style="color: #008080; ">229</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sudoku::PrintSudoku(question);<br /><span style="color: #008080; ">230</span>&nbsp;<br /><span style="color: #008080; ">231</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sudoku&nbsp;sudoku(question,&nbsp;find_all_answers);<br /><span style="color: #008080; ">232</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudoku.Solve();<br /><span style="color: #008080; ">233</span>&nbsp;<br /><span style="color: #008080; ">234</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">set</span>&lt;std::<span style="color: #0000FF; ">string</span>&gt;&amp;&nbsp;all_answers&nbsp;=&nbsp;sudoku.GiveAllAnswers();<br /><span style="color: #008080; ">235</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;idx&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">236</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">typeof</span>(all_answers.begin())&nbsp;iter&nbsp;=&nbsp;all_answers.begin();&nbsp;all_answers.end()&nbsp;!=&nbsp;iter;&nbsp;++iter)&nbsp;{<br /><span style="color: #008080; ">237</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"answer&nbsp;"&nbsp;&lt;&lt;&nbsp;++idx&nbsp;&lt;&lt;&nbsp;"&nbsp;for&nbsp;this&nbsp;sudoku&nbsp;is:"&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">238</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sudoku::PrintSudoku(*iter);<br /><span style="color: #008080; ">239</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!Sudoku::ValidateOneAnswer(*iter))&nbsp;{<br /><span style="color: #008080; ">240</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"answer&nbsp;is&nbsp;not&nbsp;correct:&nbsp;"&nbsp;&lt;&lt;&nbsp;*iter&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">241</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">242</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"["&nbsp;&lt;&lt;&nbsp;*iter&nbsp;&lt;&lt;&nbsp;"]"&nbsp;&lt;&lt;&nbsp;std::endl;<br /><span style="color: #008080; ">243</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">244</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">245</span>&nbsp;}<br /><span style="color: #008080; ">246</span>&nbsp;</div></div><div></div><img src ="http://www.blogjava.net/bacoo/aggbug/432875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2017-11-03 17:19 <a href="http://www.blogjava.net/bacoo/archive/2017/11/03/432875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ implements final keyword</title><link>http://www.blogjava.net/bacoo/archive/2017/07/17/432665.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Mon, 17 Jul 2017 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2017/07/17/432665.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/432665.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2017/07/17/432665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/432665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/432665.html</trackback:ping><description><![CDATA[<div>#include &lt;iostream&gt;</div><div>#include &lt;string&gt;</div><div>#include &lt;vector&gt;</div><div>#include &lt;map&gt;</div><div>#include &lt;set&gt;</div><div></div><div>using namespace std;</div><div></div><div>//part 1</div><div>class A {</div><div>private:</div><div>&nbsp; &nbsp; A() {};</div><div></div><div>public:</div><div>&nbsp; &nbsp; static A* GetInstance() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return new A();</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>//part 2</div><div>class A {</div><div>&nbsp; &nbsp; friend class B;</div><div>private:</div><div>&nbsp; &nbsp; A() {};</div><div>};</div><div></div><div>class B: public A {</div><div>};</div><div></div><div>//part 3</div><div>class A {</div><div>&nbsp; &nbsp; friend class B;</div><div>private:</div><div>&nbsp; &nbsp; A() {};</div><div>};</div><div></div><div>class B: virtual public A {</div><div>};</div><div></div><div>//part 4: 奇异递归模板模式（curiously recurring template pattern，CRTP）</div><div>template &lt;typename T&gt;</div><div>class A {</div><div>&nbsp; &nbsp; friend T;</div><div>private:</div><div>&nbsp; &nbsp; A() {};</div><div>};</div><div></div><div>class B: virtual public A&lt;B&gt; {</div><div>};</div><div></div><div>//part 4.2:</div><div>//这种技术获得了类似于虚函数的效果，并避免了动态多态的代价。也有人把CRTP称为&#8220;模拟的动态绑定&#8221;</div><div>template &lt;typename T&gt;</div><div>struct counter</div><div>{</div><div>&nbsp; &nbsp; static int objects_created;</div><div>&nbsp; &nbsp; static int objects_alive;</div><div></div><div>&nbsp; &nbsp; counter()</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ++objects_created;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ++objects_alive;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; counter(const counter&amp;)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ++objects_created;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ++objects_alive;</div><div>&nbsp; &nbsp; }</div><div>protected:</div><div>&nbsp; &nbsp; ~counter() // objects should never be removed through pointers of this type</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; --objects_alive;</div><div>&nbsp; &nbsp; }</div><div>};</div><div>template &lt;typename T&gt; int counter&lt;T&gt;::objects_created( 0 );</div><div>template &lt;typename T&gt; int counter&lt;T&gt;::objects_alive( 0 );</div><div></div><div>class X : counter&lt;X&gt;</div><div>{</div><div>&nbsp; &nbsp; ...</div><div>};</div><div>&nbsp; &nbsp;&nbsp;</div><div>class Y : counter&lt;Y&gt;</div><div>{</div><div>&nbsp; &nbsp; &nbsp;...</div><div>};</div><div></div><div>//part 5</div><div>class A {</div><div>protected:</div><div>&nbsp; &nbsp; A() {};</div><div>};</div><div></div><div>class B: virtual A {</div><div>};</div><div></div><div>//part 6</div><div>class B final {</div><div>};</div><div></div><div>//validate</div><div>class C: public B {</div><div>};</div><div></div><div>int main(int argc, char* argv[]) {</div><div>&nbsp; &nbsp; B b;</div><div>&nbsp; &nbsp; C c;</div><div>&nbsp; &nbsp; return 0;</div><div>}</div><img src ="http://www.blogjava.net/bacoo/aggbug/432665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2017-07-17 19:31 <a href="http://www.blogjava.net/bacoo/archive/2017/07/17/432665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>epoll example for test later</title><link>http://www.blogjava.net/bacoo/archive/2016/06/22/430993.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Wed, 22 Jun 2016 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2016/06/22/430993.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/430993.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2016/06/22/430993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/430993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/430993.html</trackback:ping><description><![CDATA[<div>curl https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/epoll-example.c<br /><br /><div>#include &lt;stdio.h&gt;</div><div>#include &lt;stdlib.h&gt;</div><div>#include &lt;string.h&gt;</div><div>#include &lt;sys/types.h&gt;</div><div>#include &lt;sys/socket.h&gt;</div><div>#include &lt;netdb.h&gt;</div><div>#include &lt;unistd.h&gt;</div><div>#include &lt;fcntl.h&gt;</div><div>#include &lt;sys/epoll.h&gt;</div><div>#include &lt;errno.h&gt;</div><div></div><div>#define MAXEVENTS 64</div><div></div><div>static int make_socket_non_blocking(int sfd) {</div><div>&nbsp; &nbsp; int flags, s;</div><div></div><div>&nbsp; &nbsp; flags = fcntl(sfd, F_GETFL, 0);</div><div>&nbsp; &nbsp; if (flags == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; perror("fcntl");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; flags |= O_NONBLOCK;</div><div>&nbsp; &nbsp; s = fcntl(sfd, F_SETFL, flags);</div><div>&nbsp; &nbsp; if (s == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; perror("fcntl");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div></div><div>static int create_and_bind(char *port) {</div><div>&nbsp; &nbsp; struct addrinfo hints;</div><div>&nbsp; &nbsp; struct addrinfo *result, *rp;</div><div>&nbsp; &nbsp; int s, sfd;</div><div></div><div>&nbsp; &nbsp; memset(&amp;hints, 0, sizeof(struct addrinfo));</div><div>&nbsp; &nbsp; hints.ai_family = AF_UNSPEC; /* Return IPv4 and IPv6 choices */</div><div>&nbsp; &nbsp; hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */</div><div>&nbsp; &nbsp; hints.ai_flags = AI_PASSIVE; /* All interfaces */</div><div></div><div>&nbsp; &nbsp; s = getaddrinfo(NULL, port, &amp;hints, &amp;result);</div><div>&nbsp; &nbsp; if (s != 0) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; for (rp = result; rp != NULL; rp = rp-&gt;ai_next) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sfd = socket(rp-&gt;ai_family, rp-&gt;ai_socktype, rp-&gt;ai_protocol);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (sfd == -1)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; s = bind(sfd, rp-&gt;ai_addr, rp-&gt;ai_addrlen);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (s == 0) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* We managed to bind successfully! */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; close(sfd);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; if (rp == NULL) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fprintf(stderr, "Could not bind\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; freeaddrinfo(result);</div><div></div><div>&nbsp; &nbsp; return sfd;</div><div>}</div><div></div><div>int main(int argc, char *argv[]) {</div><div>&nbsp; &nbsp; int sfd, s;</div><div>&nbsp; &nbsp; int efd;</div><div>&nbsp; &nbsp; struct epoll_event event;</div><div>&nbsp; &nbsp; struct epoll_event *events;</div><div></div><div>&nbsp; &nbsp; if (argc != 2) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fprintf(stderr, "Usage: %s [port]\n", argv[0]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; exit(EXIT_FAILURE);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; sfd = create_and_bind(argv[1]);</div><div>&nbsp; &nbsp; if (sfd == -1)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div></div><div>&nbsp; &nbsp; s = make_socket_non_blocking(sfd);</div><div>&nbsp; &nbsp; if (s == -1)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div></div><div>&nbsp; &nbsp; s = listen(sfd, SOMAXCONN);</div><div>&nbsp; &nbsp; if (s == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; perror("listen");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; efd = epoll_create1(0);</div><div>&nbsp; &nbsp; if (efd == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; perror("epoll_create");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; event.data.fd = sfd;</div><div>&nbsp; &nbsp; event.events = EPOLLIN | EPOLLET;</div><div>&nbsp; &nbsp; s = epoll_ctl(efd, EPOLL_CTL_ADD, sfd, &amp;event);</div><div>&nbsp; &nbsp; if (s == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; perror("epoll_ctl");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; /* Buffer where events are returned */</div><div>&nbsp; &nbsp; events = calloc(MAXEVENTS, sizeof event);</div><div></div><div>&nbsp; &nbsp; /* The event loop */</div><div>&nbsp; &nbsp; while (1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int n, i;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; n = epoll_wait(efd, events, MAXEVENTS, -1);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (i = 0; i &lt; n; i++) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((events[i].events &amp; EPOLLERR) || (events[i].events &amp; EPOLLHUP) || (!(events[i].events &amp; EPOLLIN))) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* An error has occured on this fd, or the socket is not</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ready for reading (why were we notified then?) */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf(stderr, "epoll error\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(events[i].data.fd);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (sfd == events[i].data.fd) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* We have a notification on the listening socket, which</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;means one or more incoming connections. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; struct sockaddr in_addr;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; socklen_t in_len;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int infd;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in_len = sizeof in_addr;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; infd = accept(sfd, &amp;in_addr, &amp;in_len);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (infd == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* We have processed all incoming</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;connections. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror("accept");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s = getnameinfo(&amp;in_addr, in_len, hbuf, sizeof hbuf, sbuf, sizeof sbuf, NI_NUMERICHOST | NI_NUMERICSERV);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s == 0) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("Accepted connection on descriptor %d "</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "(host=%s, port=%s)\n", infd, hbuf, sbuf);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Make the incoming socket non-blocking and add it to the</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;list of fds to monitor. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s = make_socket_non_blocking(infd);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s == -1)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.data.fd = infd;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.events = EPOLLIN | EPOLLET;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s = epoll_ctl(efd, EPOLL_CTL_ADD, infd, &amp;event);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror("epoll_ctl");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* We have data on the fd waiting to be read. Read and</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;display it. We must read whatever data is available</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;completely, as we are running in edge-triggered mode</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;and won't get a notification again for the same</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int done = 0;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ssize_t count;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char buf[512];</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = read(events[i].data.fd, buf, sizeof buf);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (count == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* If errno == EAGAIN, that means we have read all</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data. So go back to the main loop. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (errno != EAGAIN) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror("read");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; done = 1;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (count == 0) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* End of file. The remote has closed the</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;connection. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; done = 1;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Write the buffer to standard output */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s = write(1, buf, count);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s == -1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; perror("write");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; abort();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (done) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("Closed connection on descriptor %d\n", events[i].data.fd);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Closing the descriptor will make epoll remove it</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;from the set of descriptors which are monitored. */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(events[i].data.fd);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; free(events);</div><div></div><div>&nbsp; &nbsp; close(sfd);</div><div></div><div>&nbsp; &nbsp; return EXIT_SUCCESS;</div><div>}</div></div><img src ="http://www.blogjava.net/bacoo/aggbug/430993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2016-06-22 17:23 <a href="http://www.blogjava.net/bacoo/archive/2016/06/22/430993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>signal process</title><link>http://www.blogjava.net/bacoo/archive/2016/02/17/429353.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Wed, 17 Feb 2016 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2016/02/17/429353.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/429353.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2016/02/17/429353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/429353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/429353.html</trackback:ping><description><![CDATA[<div>信号学习：</div><div>1。简单点用signal（主要就1个api，signal(SIGINT, SignalHandler)和signal(SIGINT, SIG_IGN)就是全部了）；</div><div>2。复杂点用sigaction（可以设置在handling期间，允许/不允许哪些信号打断自己）；</div><div>3。当前线程handling过程中，当前线程不会因为相同signal再次进入handler，但当前线程可以被别的signal打断重新进入handler，别的线程可以进入handler；</div><div>例如下面这个例子，只有一个主线程，先被SIGINT打断进入handler，虽然又被SIGTERM打断再次进入handler：</div><div>#0 &nbsp;0x00007f7cc55dc200 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:82</div><div>#1 &nbsp;0x00007f7cc55dc090 in __sleep (seconds=&lt;value optimized out&gt;) at ../sysdeps/unix/sysv/linux/sleep.c:138</div><div>#2 &nbsp;0x0000000000468300 in SignalHandler (sig=15) at src/dispatcher2_server.cpp:78</div><div>#3 &nbsp;&lt;signal handler called&gt;</div><div>#4 &nbsp;0x00007f7cc55dc200 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:82</div><div>#5 &nbsp;0x00007f7cc55dc090 in __sleep (seconds=&lt;value optimized out&gt;) at ../sysdeps/unix/sysv/linux/sleep.c:138</div><div>#6 &nbsp;0x0000000000468300 in SignalHandler (sig=2) at src/dispatcher2_server.cpp:78</div><div>#7 &nbsp;&lt;signal handler called&gt;</div><div>#8 &nbsp;0x00007f7cc55dc200 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:82</div><div>#9 &nbsp;0x00007f7cc55dc090 in __sleep (seconds=&lt;value optimized out&gt;) at ../sysdeps/unix/sysv/linux/sleep.c:138</div><div>#10 0x000000000046844a in main (argc=1, argv=0x7fff048454a8) at src/dispatcher2_server.cpp:102</div><div></div><div>demo：</div><div>static void SignalHandler(int sig) {</div><div>&nbsp; &nbsp; if (SIGTERM == sig || SIGINT == sig) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; struct sigaction sa;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; memset(&amp;sa, 0, sizeof(sa));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sa.sa_handler = SIG_IGN;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sigaction(SIGINT, &amp;sa, NULL); // keep other threads from entering this handler</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sigaction(SIGTERM, &amp;sa, NULL); // keep other threads from entering this handler</div><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //...</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>struct sigaction sa;</div><div>memset(&amp;sa, 0, sizeof(sa));</div><div>sa.sa_handler = SignalHandler;</div><div>sigfillset(&amp;sa.sa_mask); // block every signal during handling</div><div>sigaction(SIGINT, &amp;sa, NULL);</div><div>sigaction(SIGTERM, &amp;sa, NULL);<br /><br /><br /><pre style="line-height: normal;">介绍：http://www.alexonlinux.com/signal-handling-in-linux<br />demo：http://aspyct.org/blog/2012/08/25/unix-signal-handling-example/<br /><br /><br /></pre></div><img src ="http://www.blogjava.net/bacoo/aggbug/429353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2016-02-17 11:30 <a href="http://www.blogjava.net/bacoo/archive/2016/02/17/429353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tcp_server that is used to dump tcp datas</title><link>http://www.blogjava.net/bacoo/archive/2015/12/10/428603.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 10 Dec 2015 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/12/10/428603.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/428603.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/12/10/428603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/428603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/428603.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;sys/types.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;sys/socket.h&gt;<br />#include&nbsp;&lt;netinet/<span style="color: #0000FF; ">in</span>.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;getopt.h&gt;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;get_remote_ip_and_port(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in*&nbsp;s_add,&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;ip,&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;port)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!s_add&nbsp;||&nbsp;!ip&nbsp;||&nbsp;!port)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;*port&nbsp;=&nbsp;ntohs(s_add-&gt;sin_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;*ip&nbsp;=&nbsp;s_add-&gt;sin_addr.s_addr;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;get_local_ip_and_port(<span style="color: #0000FF; ">int</span>&nbsp;fd,&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;ip,&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;port)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fd&nbsp;&lt;=&nbsp;0&nbsp;||&nbsp;!ip&nbsp;||&nbsp;!port)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in&nbsp;s_add;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sin_size&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(s_add);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(getsockname(fd,&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr&nbsp;*)&amp;s_add,&nbsp;&amp;sin_size)&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;s_add.sin_family&nbsp;==&nbsp;AF_INET&nbsp;&amp;&amp;&nbsp;sin_size&nbsp;==&nbsp;<span style="color: #0000FF; ">sizeof</span>(s_add))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*port&nbsp;=&nbsp;ntohs(s_add.sin_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ip&nbsp;=&nbsp;s_add.sin_addr.s_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">char</span>*&nbsp;get_ip_str(<span style="color: #0000FF; ">int</span>&nbsp;ip,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;buf)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;inet_ntop(AF_INET,&nbsp;&amp;ip,&nbsp;buf,&nbsp;INET_ADDRSTRLEN);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;buf;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;usage(<span style="color: #0000FF; ">char</span>*&nbsp;argv0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stdout,<br />"Usage:&nbsp;%s&nbsp;[-p&nbsp;&lt;port&gt;]&nbsp;[-o&nbsp;output_file]&nbsp;[-h]\n\n"<br />"&nbsp;-p&nbsp;&lt;port&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;port&nbsp;used&nbsp;to&nbsp;listen,&nbsp;by&nbsp;default,&nbsp;8888\n"<br />"&nbsp;-o&nbsp;&lt;output_file&gt;&nbsp;output&nbsp;file&nbsp;used&nbsp;to&nbsp;record&nbsp;the&nbsp;data&nbsp;received&nbsp;from&nbsp;client,&nbsp;by&nbsp;default,&nbsp;dump&nbsp;to&nbsp;./x.in\n"<br />"&nbsp;-h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;this&nbsp;usage\n"<br />"\n",&nbsp;argv0);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sfp&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nfp&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in&nbsp;s_add,&nbsp;c_add;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sin_size&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;server_port&nbsp;=&nbsp;8888;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;remote_port&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;remote_ip&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;remote_ip_str[INET_ADDRSTRLEN];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;local_port&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;local_ip&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;local_ip_str[INET_ADDRSTRLEN];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;output_file[256];<br />&nbsp;&nbsp;&nbsp;&nbsp;sprintf(output_file,&nbsp;"%s",&nbsp;"./x.in");<br />&nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;ofp&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c&nbsp;=&nbsp;'\0';<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;option&nbsp;long_options[]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"help",&nbsp;0,&nbsp;0,&nbsp;'h'},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;0,&nbsp;0}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(-1&nbsp;!=&nbsp;(c&nbsp;=&nbsp;getopt_long(argc,&nbsp;argv,&nbsp;":p:o:h",&nbsp;long_options,&nbsp;NULL)))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>&nbsp;(c)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;'p':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_port&nbsp;=&nbsp;atoi(optarg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;'o':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(output_file,&nbsp;"%s",&nbsp;optarg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;'h':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;'?':&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">an&nbsp;option&nbsp;character&nbsp;that&nbsp;was&nbsp;not&nbsp;in&nbsp;optstring</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;':':&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">an&nbsp;option&nbsp;with&nbsp;a&nbsp;missing&nbsp;argument</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage(argv[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sfp&nbsp;=&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(-1&nbsp;==&nbsp;sfp)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("socket&nbsp;fail&nbsp;!&nbsp;\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("socket&nbsp;ok&nbsp;!\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&amp;s_add,&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in));<br />&nbsp;&nbsp;&nbsp;&nbsp;s_add.sin_family&nbsp;=&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;s_add.sin_addr.s_addr&nbsp;=&nbsp;htonl(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;s_add.sin_port&nbsp;=&nbsp;htons(server_port);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(-1&nbsp;==&nbsp;bind(sfp,&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr&nbsp;*)&nbsp;(&amp;s_add),&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr)))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("bind&nbsp;fail&nbsp;!\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("bind&nbsp;to&nbsp;%d&nbsp;ok!\n",&nbsp;server_port);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(-1&nbsp;==&nbsp;listen(sfp,&nbsp;5))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("listen&nbsp;fail&nbsp;!\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("listen&nbsp;ok\n\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ofp&nbsp;=&nbsp;fopen(output_file,&nbsp;"wrb");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_size&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfp&nbsp;=&nbsp;accept(sfp,&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr&nbsp;*)&nbsp;(&amp;c_add),&nbsp;&amp;sin_size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(-1&nbsp;==&nbsp;nfp)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("accept&nbsp;fail&nbsp;!\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("accept&nbsp;ok!\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_remote_ip_and_port(&amp;c_add,&nbsp;&amp;remote_ip,&nbsp;&amp;remote_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_local_ip_and_port(nfp,&nbsp;&amp;local_ip,&nbsp;&amp;local_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("establish&nbsp;connect&nbsp;%s:%d&nbsp;-&gt;&nbsp;%s:%d\n",&nbsp;get_ip_str(remote_ip,&nbsp;remote_ip_str),&nbsp;remote_port,&nbsp;get_ip_str(local_ip,&nbsp;local_ip_str),&nbsp;local_port);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(ofp,&nbsp;"-----------------&nbsp;establish&nbsp;connect&nbsp;%s:%d&nbsp;-&gt;&nbsp;%s:%d&nbsp;-----------------{\n",&nbsp;get_ip_str(remote_ip,&nbsp;remote_ip_str),&nbsp;remote_port,&nbsp;get_ip_str(local_ip,&nbsp;local_ip_str),&nbsp;local_port);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buffer[1024];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;recbytes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;total_bytes&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((recbytes&nbsp;=&nbsp;read(nfp,&nbsp;buffer,&nbsp;1024))&nbsp;&gt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total_bytes&nbsp;+=&nbsp;recbytes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(buffer,&nbsp;1,&nbsp;recbytes,&nbsp;ofp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(ofp,&nbsp;"\n}----------------&nbsp;receive&nbsp;%d&nbsp;bytes&nbsp;------------------\n\n",&nbsp;total_bytes);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("receive&nbsp;over!\n\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(ofp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(nfp);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(ofp);<br />&nbsp;&nbsp;&nbsp;&nbsp;close(sfp);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.blogjava.net/bacoo/aggbug/428603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-12-10 21:15 <a href="http://www.blogjava.net/bacoo/archive/2015/12/10/428603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C实现继承和多态</title><link>http://www.blogjava.net/bacoo/archive/2015/08/08/426681.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Fri, 07 Aug 2015 23:30:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/08/08/426681.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/426681.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/08/08/426681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/426681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/426681.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">-------------&nbsp;&nbsp;Person&nbsp;&nbsp;--------------</span><span style="color: #008000; "><br /></span>typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Person&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;derived_obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*life)(<span style="color: #0000FF; ">struct</span>&nbsp;Person*);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*live)(<span style="color: #0000FF; ">struct</span>&nbsp;Person*);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*delete)(<span style="color: #0000FF; ">struct</span>&nbsp;Person*);<br />}&nbsp;Person;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Person_life(Person*&nbsp;p)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("As&nbsp;a&nbsp;person,&nbsp;I'm&nbsp;%s,&nbsp;the&nbsp;life&nbsp;is&nbsp;colorfull\n",&nbsp;p-&gt;name);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Person_live(Person*&nbsp;p)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("As&nbsp;a&nbsp;person,&nbsp;I'm&nbsp;%s,&nbsp;I'd&nbsp;like&nbsp;to&nbsp;live&nbsp;in&nbsp;city\n",&nbsp;p-&gt;name);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;delete_Person(Person*&nbsp;p)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;free(p-&gt;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(p);<br />}<br /><br />Person*&nbsp;new_Person(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Person*&nbsp;p&nbsp;=&nbsp;(Person*)malloc(<span style="color: #0000FF; ">sizeof</span>(Person));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;name_len&nbsp;=&nbsp;(<span style="color: #0000FF; ">int</span>)strlen(name)&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;name&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)malloc(name_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;life&nbsp;=&nbsp;Person_life;<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;live&nbsp;=&nbsp;Person_live;<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;derived_obj&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;delete&nbsp;=&nbsp;delete_Person;<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(p-&gt;name,&nbsp;name,&nbsp;name_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">-------------&nbsp;&nbsp;Employee&nbsp;&nbsp;--------------</span><span style="color: #008000; "><br /></span>typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Employee&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Person*&nbsp;base_obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*work)(<span style="color: #0000FF; ">struct</span>&nbsp;Person*);<br />}&nbsp;Employee;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Employee_live(Person*&nbsp;p)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("As&nbsp;an&nbsp;employee(id:%d),&nbsp;I'm&nbsp;%s,&nbsp;I'd&nbsp;like&nbsp;to&nbsp;live&nbsp;near&nbsp;by&nbsp;company\n",&nbsp;((Employee*)p-&gt;derived_obj)-&gt;id,&nbsp;p-&gt;name);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Employee_work(Person*&nbsp;p)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("As&nbsp;an&nbsp;employee(id:%d),&nbsp;I'm&nbsp;%s,&nbsp;I'll&nbsp;try&nbsp;my&nbsp;best&nbsp;to&nbsp;work\n",&nbsp;((Employee*)p-&gt;derived_obj)-&gt;id,&nbsp;p-&gt;name);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;delete_Employee(Person*&nbsp;p)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Employee*&nbsp;e&nbsp;=&nbsp;(Employee*)p-&gt;derived_obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete_Person(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(e);<br />}<br /><br />Employee*&nbsp;new_Employee(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;name,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Employee*&nbsp;e&nbsp;=&nbsp;(Employee*)malloc(<span style="color: #0000FF; ">sizeof</span>(Employee));<br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;base_obj&nbsp;=&nbsp;new_Person(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;base_obj-&gt;derived_obj&nbsp;=&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;base_obj-&gt;delete&nbsp;=&nbsp;delete_Employee;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;base_obj-&gt;live&nbsp;=&nbsp;Employee_live;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;id&nbsp;=&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;work&nbsp;=&nbsp;Employee_work;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;e;<br />}<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;DYNAMIC_CAST(p,&nbsp;TYPE)&nbsp;((TYPE*)p-&gt;derived_obj)<br /><span style="color: #0000FF; ">#define</span>&nbsp;STATIC_CAST(p,&nbsp;TYPE)&nbsp;((TYPE*)p-&gt;base_obj)<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Person*&nbsp;p&nbsp;=&nbsp;new_Person("bacoo");<br />&nbsp;&nbsp;&nbsp;&nbsp;Person*&nbsp;e&nbsp;=&nbsp;STATIC_CAST(new_Employee("lily",&nbsp;33),&nbsp;Person);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("\n------&nbsp;Person&nbsp;------\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;life(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;live(p);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("\n------&nbsp;Employee&nbsp;------\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;life(e);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">inherit&nbsp;Person::life</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;live(e);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">override&nbsp;Person::live</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;DYNAMIC_CAST(e,&nbsp;Employee)-&gt;work(e);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">new&nbsp;method&nbsp;Employee::work</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;delete(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;e-&gt;delete(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.blogjava.net/bacoo/aggbug/426681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-08-08 07:30 <a href="http://www.blogjava.net/bacoo/archive/2015/08/08/426681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Singleton</title><link>http://www.blogjava.net/bacoo/archive/2015/07/03/426021.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Fri, 03 Jul 2015 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/07/03/426021.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/426021.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/07/03/426021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/426021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/426021.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;iostream&gt;<br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;ImplMethod1&nbsp;{<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">Singleton&nbsp;template&nbsp;implementation:&nbsp;Method&nbsp;1</span><span style="color: #008000; "><br /></span>template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;Singleton&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;GetInstance()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">You&nbsp;can&nbsp;consider&nbsp;thread-safe&nbsp;here&nbsp;if&nbsp;you&nbsp;will</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;s_ptr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;T;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;s_ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~Singleton()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton(<span style="color: #0000FF; ">const</span>&nbsp;Singleton&amp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton&amp;&nbsp;<span style="color: #0000FF; ">operator</span>=(<span style="color: #0000FF; ">const</span>&nbsp;Singleton&amp;);<br />};<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">How&nbsp;use&nbsp;it</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span>&nbsp;MyClass&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Singleton&lt;MyClass&gt;;<br />&nbsp;&nbsp;&nbsp;&nbsp;MyClass()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;~MyClass()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;MyClass(<span style="color: #0000FF; ">const</span>&nbsp;MyClass&amp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;MyClass&amp;&nbsp;<span style="color: #0000FF; ">operator</span>=(<span style="color: #0000FF; ">const</span>&nbsp;MyClass&amp;);<br />};<br /><br />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;end&nbsp;of&nbsp;namespace&nbsp;ImplMethod1<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">---------------------------------------------------------------------------</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">namespace</span>&nbsp;ImplMethod2&nbsp;{<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">Singleton&nbsp;template&nbsp;implementation:&nbsp;Method&nbsp;2</span><span style="color: #008000; "><br /></span>template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;Singleton&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;GetInstance()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">You&nbsp;can&nbsp;consider&nbsp;thread-safe&nbsp;here&nbsp;if&nbsp;you&nbsp;will</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;s_ptr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;T;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;s_ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">protected</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~Singleton()&nbsp;{};<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton(<span style="color: #0000FF; ">const</span>&nbsp;Singleton&amp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton&amp;&nbsp;<span style="color: #0000FF; ">operator</span>=(<span style="color: #0000FF; ">const</span>&nbsp;Singleton&amp;);<br />};<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">How&nbsp;use&nbsp;it</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span>&nbsp;MyClass:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Singleton&lt;MyClass&gt;&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Singleton&lt;MyClass&gt;;<br />&nbsp;&nbsp;&nbsp;&nbsp;MyClass()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;~MyClass()&nbsp;{};<br />};<br /><br />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;end&nbsp;of&nbsp;namespace&nbsp;ImplMethod2<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">---------------------------------------------------------------------------</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">namespace</span>&nbsp;ImplMethod3&nbsp;{<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">Singleton&nbsp;template&nbsp;implementation:&nbsp;Method&nbsp;3</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span>&nbsp;LazyInstantiation&nbsp;{<br /><span style="color: #0000FF; ">protected</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;CreateInstance(T*&nbsp;dummy)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">You&nbsp;can&nbsp;consider&nbsp;thread-safe&nbsp;here&nbsp;if&nbsp;you&nbsp;will</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;T;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~LazyInstantiation()&nbsp;{};<br />};<br /><br />template&nbsp;&lt;typename&nbsp;T,&nbsp;typename&nbsp;InstantiationPolicy&nbsp;=&nbsp;LazyInstantiation&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;Singleton&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;InstantiationPolicy&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;GetInstance()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">You&nbsp;can&nbsp;consider&nbsp;thread-safe&nbsp;here&nbsp;if&nbsp;you&nbsp;will</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;T*&nbsp;s_ptr&nbsp;=&nbsp;InstantiationPolicy::CreateInstance((T*)NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;s_ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">protected</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~Singleton()&nbsp;{};<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton(<span style="color: #0000FF; ">const</span>&nbsp;Singleton&amp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton&amp;&nbsp;<span style="color: #0000FF; ">operator</span>=(<span style="color: #0000FF; ">const</span>&nbsp;Singleton&amp;);<br />};<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">How&nbsp;use&nbsp;it</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span>&nbsp;MyClass:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Singleton&lt;MyClass&gt;&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LazyInstantiation;<br />&nbsp;&nbsp;&nbsp;&nbsp;MyClass()&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;~MyClass()&nbsp;{};<br />};<br /><br />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;end&nbsp;of&nbsp;namespace&nbsp;ImplMethod3<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">---------------------------------------------------------------------------</span><span style="color: #008000; "><br /></span><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />&nbsp;*&nbsp;分析：<br />&nbsp;*&nbsp;方法1不需要继承，但不能直观的通过MyClass::GetInstance来获取实例，且在MyClass里需要将拷贝构造以及operator=声明为private；<br />&nbsp;*&nbsp;方法2通过继承的方式，比方法1好；<br />&nbsp;*&nbsp;方法3在方法2的基础上，进行了巧妙的扩展，可以让用户自定InstantiationPolicy，可以支持一些有特殊构造函数的类；<br />&nbsp;*<br />&nbsp;*&nbsp;结论：<br />&nbsp;*&nbsp;综合来看，方法2简单易用，方法3实现成本稍高，但比方法2又精进了一步。<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;ImplMethod1::MyClass*&nbsp;p1&nbsp;=&nbsp;ImplMethod1::Singleton&lt;ImplMethod1::MyClass&gt;::GetInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;p1-&gt;func();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ImplMethod2::MyClass*&nbsp;p2&nbsp;=&nbsp;ImplMethod2::MyClass::GetInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;p2-&gt;func();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ImplMethod3::MyClass*&nbsp;p3&nbsp;=&nbsp;ImplMethod3::MyClass::GetInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;p3-&gt;func();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.blogjava.net/bacoo/aggbug/426021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-07-03 11:57 <a href="http://www.blogjava.net/bacoo/archive/2015/07/03/426021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>some notes on linking with shared library</title><link>http://www.blogjava.net/bacoo/archive/2015/03/12/423417.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 12 Mar 2015 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/03/12/423417.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/423417.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/03/12/423417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/423417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/423417.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->==&gt;&nbsp;Object.h&nbsp;&lt;==<br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Object&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Object();<br />#ifdef&nbsp;TEST<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;NoneVirtualFunc()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s,&nbsp;size&nbsp;of&nbsp;class:%lu\n",&nbsp;__PRETTY_FUNCTION__,&nbsp;<span style="color: #0000FF; ">sizeof</span>(Object));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #0000FF; ">#endif</span><br /><br />#ifdef&nbsp;TEST<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Func2();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Func1();<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Func1();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Func2();<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Access();<br /><br />#ifdef&nbsp;TEST<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;SetOther(<span style="color: #0000FF; ">int</span>&nbsp;other)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_other&nbsp;=&nbsp;other;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Other()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;__PRETTY_FUNCTION__);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #0000FF; ">#endif</span><br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;m_i1;<br />#ifdef&nbsp;TEST<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;m_other;<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;m_i2;<br />};<br /><br />==&gt;&nbsp;Object.cpp&nbsp;&lt;==<br />#include&nbsp;"Object.h"<br /><br />Object::Object():&nbsp;m_i1(1),&nbsp;m_i2(2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s,&nbsp;constructor&nbsp;init,&nbsp;i1:%d,&nbsp;i2:%d\n",&nbsp;__PRETTY_FUNCTION__,&nbsp;m_i1,&nbsp;m_i2);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Object::Func1()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;__PRETTY_FUNCTION__);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Object::Func2()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;__PRETTY_FUNCTION__);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Object::Access()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s,&nbsp;size&nbsp;of&nbsp;class:%lu,&nbsp;i1:%d,&nbsp;i2:%d\n",&nbsp;__PRETTY_FUNCTION__,&nbsp;<span style="color: #0000FF; ">sizeof</span>(Object),&nbsp;m_i1,&nbsp;m_i2);<br />}<br /><br />==&gt;&nbsp;test.cpp&nbsp;&lt;==<br />#include&nbsp;"Object.h"<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">for&nbsp;more&nbsp;details&nbsp;about&nbsp;vtable,&nbsp;see:&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://blog.csdn.net/haoel/article/details/1948051</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Object*&nbsp;obj&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Object();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;Func1();<br />&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;Func2();<br />#ifdef&nbsp;TEST<br />&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;SetOther(1000);<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;Access();<br /><br />#ifdef&nbsp;TEST<br />&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;NoneVirtualFunc();<br />&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;Other();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">segmentation&nbsp;fault</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#endif</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br />==&gt;&nbsp;Makefile&nbsp;&lt;==<br />all:<br />&nbsp;&nbsp;&nbsp;&nbsp;@g++&nbsp;-g&nbsp;-fPIC&nbsp;-o&nbsp;Object.o&nbsp;-fno-rtti&nbsp;-c&nbsp;Object.cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;@g++&nbsp;-shared&nbsp;-o&nbsp;libObject.so&nbsp;Object.o<br />&nbsp;&nbsp;&nbsp;&nbsp;@g++&nbsp;-g&nbsp;-Wall&nbsp;test.cpp&nbsp;-o&nbsp;test&nbsp;-L.&nbsp;-lObject&nbsp;-Wl,-rpath=.<br />&nbsp;&nbsp;&nbsp;&nbsp;@./test<br />&nbsp;&nbsp;&nbsp;&nbsp;@rm&nbsp;-f&nbsp;test&nbsp;*.o&nbsp;*.so&nbsp;core*<br /><br /><br />test:<br />&nbsp;&nbsp;&nbsp;&nbsp;@g++&nbsp;-g&nbsp;-fPIC&nbsp;-o&nbsp;Object.o&nbsp;-fno-rtti&nbsp;-c&nbsp;Object.cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;@g++&nbsp;-shared&nbsp;-o&nbsp;libObject.so&nbsp;Object.o<br />&nbsp;&nbsp;&nbsp;&nbsp;@g++&nbsp;-g&nbsp;-Wall&nbsp;test.cpp&nbsp;-o&nbsp;test&nbsp;-L.&nbsp;-lObject&nbsp;-Wl,-rpath=.&nbsp;-DTEST<br />&nbsp;&nbsp;&nbsp;&nbsp;@./test<br />&nbsp;&nbsp;&nbsp;&nbsp;@rm&nbsp;-f&nbsp;test&nbsp;*.o&nbsp;*.so&nbsp;core*<br /><br />==&gt;&nbsp;RESULT&nbsp;&lt;==<br />$&nbsp;make<br />Object::Object(),&nbsp;constructor&nbsp;init,&nbsp;i1:1,&nbsp;i2:2<br /><span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Object::Func1()<br /><span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Object::Func2()<br /><span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Object::Access(),&nbsp;size&nbsp;of&nbsp;<span style="color: #0000FF; ">class</span>:16,&nbsp;i1:1,&nbsp;i2:2<br /><br />$&nbsp;make&nbsp;test<br />Object::Object(),&nbsp;constructor&nbsp;init,&nbsp;i1:1,&nbsp;i2:2<br /><span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Object::Func2()<br /><span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Object::Func1()<br /><span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Object::Access(),&nbsp;size&nbsp;of&nbsp;<span style="color: #0000FF; ">class</span>:16,&nbsp;i1:1,&nbsp;i2:1000<br /><span style="color: #0000FF; ">void</span>&nbsp;Object::NoneVirtualFunc(),&nbsp;size&nbsp;of&nbsp;<span style="color: #0000FF; ">class</span>:24<br />make:&nbsp;***&nbsp;[test]&nbsp;Segmentation&nbsp;fault&nbsp;(core&nbsp;dumped)<br />make:&nbsp;***&nbsp;Deleting&nbsp;file&nbsp;`test'<br /><br />==&gt;&nbsp;KNOWLEDGE&nbsp;&lt;==<br />一个类一旦已经编译成so了，那么虚函数以及成员变量就都确定了，也就是影响一个类的内存映像的东西都是确定的了。<br />所以，修改头文件时需要遵循以下原则：<br />1。可以随意添加非虚函数；<br />2。不要修改虚函数的相对位置，更不要添加新的虚函数；<br />3。最好不要添加新的成员变量，如果添加也要在所有成员变量的后面添加，不过如果你不清楚so里的用法的话，很有可能出问题；<br /><br />其实，说到本质上，就是要心里很清楚，修改前和修改后，该类的内存映像到底是怎样的，固化在so里的代码是不会再变化了；<br />有兴趣的，可以debug看下虚函数表里指针的情况；如果不用-fno-rtti参数，那么vtable里会多出两项用于typeinfo相关的内容；<br />增加了新的虚函数后，通过nm&nbsp;-C&nbsp;test&nbsp;|&nbsp;grep&nbsp;Object可以看到，生成的可执行程序里是不会有Other这个虚函数的：<br />00000000004008f8&nbsp;W&nbsp;Object::NoneVirtualFunc()<br />0000000000400920&nbsp;W&nbsp;Object::SetOther(<span style="color: #0000FF; ">int</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U&nbsp;Object::Object()<br />0000000000400a60&nbsp;r&nbsp;Object::NoneVirtualFunc()::__PRETTY_FUNCTION__<br /><br />而且新加的函数都是W类型，下面通过另一个例子来验证W类型：<br />==&gt;&nbsp;Object.h&nbsp;&lt;==<br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Object&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("It's&nbsp;the&nbsp;implementation&nbsp;of&nbsp;%s&nbsp;in&nbsp;header&nbsp;file\n",&nbsp;__PRETTY_FUNCTION__);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br />==&gt;&nbsp;test.cpp&nbsp;&lt;==<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;"Object.h"<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.func();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br />==&gt;&nbsp;RESULT&nbsp;&lt;==<br />$&nbsp;g++&nbsp;-o&nbsp;test&nbsp;test.cpp<br />$&nbsp;./test<br />It's&nbsp;the&nbsp;implementation&nbsp;of&nbsp;void&nbsp;Object::func()&nbsp;in&nbsp;header&nbsp;file<br /><br />==&gt;&nbsp;Object.cpp&nbsp;&lt;==<br />#include&nbsp;&lt;stdio.h&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;Object&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func();<br />};<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Object::func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;__PRETTY_FUNCTION__);<br />}<br /><br />==&gt;&nbsp;RESULT&nbsp;&lt;==<br />$&nbsp;g++&nbsp;-c&nbsp;-o&nbsp;Object.o&nbsp;Object.cpp<br />$&nbsp;g++&nbsp;-o&nbsp;test&nbsp;test.cpp&nbsp;Object.o<br />$&nbsp;./test<br /><span style="color: #0000FF; ">void</span>&nbsp;Object::func()</div><img src ="http://www.blogjava.net/bacoo/aggbug/423417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-03-12 20:50 <a href="http://www.blogjava.net/bacoo/archive/2015/03/12/423417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>calculate the maximum sum of sub-sequence in array</title><link>http://www.blogjava.net/bacoo/archive/2015/03/10/423336.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Tue, 10 Mar 2015 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/03/10/423336.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/423336.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/03/10/423336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/423336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/423336.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;string.h&gt;<br />#include&nbsp;&lt;sys/time.h&gt;<br />#include&nbsp;&lt;string&gt;<br />#include&nbsp;&lt;fstream&gt;<br />#include&nbsp;&lt;sstream&gt;<br />#include&nbsp;&lt;stdint.h&gt;<br />#include&nbsp;&lt;pthread.h&gt;<br />#include&nbsp;&lt;vector&gt;<br />#include&nbsp;&lt;map&gt;<br />#include&nbsp;&lt;set&gt;<br /><br />using&nbsp;namespace&nbsp;std;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;print_array(<span style="color: #0000FF; ">int</span>*&nbsp;ary,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;==&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%3d",&nbsp;ary[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;%3d",&nbsp;ary[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;calc_max_sum2(<span style="color: #0000FF; ">int</span>*&nbsp;ary,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_ele&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;(8&nbsp;*&nbsp;sizeof(<span style="color: #0000FF; ">int</span>)&nbsp;-&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_ele_pos&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;start_pos&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_end_pos&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_start_pos&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ary[i]&nbsp;&gt;&nbsp;max_ele)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_ele&nbsp;=&nbsp;ary[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_ele_pos&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;+=&nbsp;ary[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sum&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;+&nbsp;1&nbsp;&lt;&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_pos&nbsp;=&nbsp;i&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sum&nbsp;&gt;&nbsp;max)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_end_pos&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_start_pos&nbsp;=&nbsp;start_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(max_ele&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;max_ele;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_start_pos&nbsp;=&nbsp;max_ele_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_end_pos&nbsp;=&nbsp;max_ele_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("algorithm&nbsp;2:&nbsp;max&nbsp;subsequence&nbsp;starts&nbsp;from&nbsp;%d,&nbsp;length:%d,&nbsp;max&nbsp;result:%d\n",&nbsp;max_start_pos,&nbsp;max_end_pos&nbsp;-&nbsp;max_start_pos&nbsp;+&nbsp;1,&nbsp;max);<br />&nbsp;&nbsp;&nbsp;&nbsp;print_array(ary&nbsp;+&nbsp;max_start_pos,&nbsp;max_end_pos&nbsp;-&nbsp;max_start_pos&nbsp;+&nbsp;1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;max;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;calc_max_sum1(<span style="color: #0000FF; ">int</span>*&nbsp;ary,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(NULL&nbsp;==&nbsp;ary&nbsp;||&nbsp;0&nbsp;==&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_ele&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;(8&nbsp;*&nbsp;sizeof(<span style="color: #0000FF; ">int</span>)&nbsp;-&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_ele_pos&nbsp;=&nbsp;-1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_start_pos&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_end_pos&nbsp;=&nbsp;-1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cur_sum&nbsp;=&nbsp;0;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">reserve&nbsp;the&nbsp;optimal&nbsp;state</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;start_pos&nbsp;=&nbsp;-1;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">record&nbsp;the&nbsp;start&nbsp;pos&nbsp;for&nbsp;cur_sum</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;end_pos&nbsp;=&nbsp;-1;<span style="color: #008000; ">//</span><span style="color: #008000; ">record&nbsp;the&nbsp;end&nbsp;pos&nbsp;for&nbsp;cur_sum</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;part_sum&nbsp;=&nbsp;0;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">track&nbsp;the&nbsp;incremental&nbsp;part,&nbsp;and&nbsp;merge&nbsp;into&nbsp;cur_sum&nbsp;once&nbsp;it&nbsp;is&nbsp;positive</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ary[i]&nbsp;&gt;&nbsp;max_ele)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_ele&nbsp;=&nbsp;ary[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_ele_pos&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;part_sum&nbsp;+=&nbsp;ary[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(part_sum&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cur_sum&nbsp;+&nbsp;part_sum&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cur_sum&nbsp;&gt;&nbsp;max_sum)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_sum&nbsp;=&nbsp;cur_sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_start_pos&nbsp;=&nbsp;start_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_end_pos&nbsp;=&nbsp;end_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur_sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_pos&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end_pos&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;part_sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(part_sum&nbsp;&gt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur_sum&nbsp;+=&nbsp;part_sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;part_sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end_pos&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(-1&nbsp;==&nbsp;start_pos)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_pos&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%3d,&nbsp;cur_sum:%3d,&nbsp;start_pos:%3d,&nbsp;end_pos:%3d,&nbsp;part_sum:%3d,&nbsp;max_sum:%3d,&nbsp;max_start_pos:%3d,&nbsp;max_end_pos:%3d\n",&nbsp;i,&nbsp;cur_sum,&nbsp;start_pos,&nbsp;end_pos,&nbsp;part_sum,&nbsp;max_sum,&nbsp;max_start_pos,&nbsp;max_end_pos);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cur_sum&nbsp;&gt;&nbsp;max_sum)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_sum&nbsp;=&nbsp;cur_sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_start_pos&nbsp;=&nbsp;start_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_end_pos&nbsp;=&nbsp;end_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(max_ele&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_sum&nbsp;=&nbsp;max_ele;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_start_pos&nbsp;=&nbsp;max_ele_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_end_pos&nbsp;=&nbsp;max_ele_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("algorithm&nbsp;1:&nbsp;max&nbsp;subsequence&nbsp;starts&nbsp;from&nbsp;%d,&nbsp;length:%d,&nbsp;max&nbsp;result:%d\n",&nbsp;max_start_pos,&nbsp;max_end_pos&nbsp;-&nbsp;max_start_pos&nbsp;+&nbsp;1,&nbsp;max_sum);<br />&nbsp;&nbsp;&nbsp;&nbsp;print_array(ary&nbsp;+&nbsp;max_start_pos,&nbsp;max_end_pos&nbsp;-&nbsp;max_start_pos&nbsp;+&nbsp;1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;max_sum;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;calc_sum(<span style="color: #0000FF; ">int</span>*&nbsp;ary,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;+=&nbsp;ary[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;sum;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;calc_max_sum_by_enumerate(<span style="color: #0000FF; ">int</span>*&nbsp;ary,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;(8&nbsp;*&nbsp;sizeof(<span style="color: #0000FF; ">int</span>)&nbsp;-&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;begin&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max_len&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i;&nbsp;j&nbsp;&lt;&nbsp;len;&nbsp;++j)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sum&nbsp;=&nbsp;calc_sum(ary&nbsp;+&nbsp;i,&nbsp;j&nbsp;-&nbsp;i&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sum&nbsp;&gt;&nbsp;max)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_len&nbsp;=&nbsp;j&nbsp;-&nbsp;i&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("algorithm&nbsp;of&nbsp;enumerate:&nbsp;max&nbsp;subsequence&nbsp;starts&nbsp;from&nbsp;%d,&nbsp;length:%d,&nbsp;max&nbsp;result:%d\n",&nbsp;begin,&nbsp;max_len,&nbsp;max);<br />&nbsp;&nbsp;&nbsp;&nbsp;print_array(ary&nbsp;+&nbsp;begin,&nbsp;max_len);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;max;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;ary&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;&gt;&nbsp;2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;argc&nbsp;-&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[len];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;argc;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary[i&nbsp;-&nbsp;1]&nbsp;=&nbsp;atoi(argv[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(2&nbsp;==&nbsp;argc)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;atoi(argv[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[len];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;timeval&nbsp;tv;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&amp;tv,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srandom(tv.tv_usec);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary[i]&nbsp;=&nbsp;(random()&nbsp;%&nbsp;20)&nbsp;-&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;tmp_ary[]&nbsp;=&nbsp;{-4,&nbsp;6,&nbsp;-5,&nbsp;3,&nbsp;-3,&nbsp;4,&nbsp;-2};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;sizeof(tmp_ary)&nbsp;/&nbsp;sizeof(tmp_ary[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[len];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(ary,&nbsp;tmp_ary,&nbsp;sizeof(tmp_ary));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;print_array(ary,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret1&nbsp;=&nbsp;calc_max_sum1(ary,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret2&nbsp;=&nbsp;calc_max_sum2(ary,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max&nbsp;=&nbsp;calc_max_sum_by_enumerate(ary,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ret1&nbsp;!=&nbsp;max)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("algorithm&nbsp;1&nbsp;fails,&nbsp;result&nbsp;is&nbsp;%d,&nbsp;but&nbsp;the&nbsp;right&nbsp;answer&nbsp;is&nbsp;%d\n",&nbsp;ret1,&nbsp;max);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ret2&nbsp;!=&nbsp;max)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("algorithm&nbsp;2&nbsp;fails,&nbsp;result&nbsp;is&nbsp;%d,&nbsp;but&nbsp;the&nbsp;right&nbsp;answer&nbsp;is&nbsp;%d\n",&nbsp;ret2,&nbsp;max);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("algorithm&nbsp;succeeds,&nbsp;max&nbsp;result:%d\n",&nbsp;max);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;ary;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.blogjava.net/bacoo/aggbug/423336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-03-10 10:52 <a href="http://www.blogjava.net/bacoo/archive/2015/03/10/423336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>trial for EnumVsInt TemplateForTypeTraits LocalClass</title><link>http://www.blogjava.net/bacoo/archive/2015/03/06/423249.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Fri, 06 Mar 2015 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/03/06/423249.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/423249.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/03/06/423249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/423249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/423249.html</trackback:ping><description><![CDATA[<div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;typeinfo&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">enum</span>&nbsp;EM&nbsp;{ONE,&nbsp;TWO};<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;func(<span style="color: #0000FF; ">int</span>&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;func(EM&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />}<br /><br /><span style="color: #808080; ">///////////////////////////////////////////////////</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><br />template&nbsp;&lt;typename&nbsp;T&gt;<br /><span style="color: #0000FF; ">void</span>&nbsp;trait(T&nbsp;t)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />}<br /><br />template&nbsp;&lt;typename&nbsp;R,&nbsp;typename&nbsp;C,&nbsp;typename&nbsp;Arg1&gt;<br /><span style="color: #0000FF; ">void</span>&nbsp;trait_detail(R&nbsp;(C::*class_member_pointer)(Arg1))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />}<br /><br /><span style="color: #808080; ">///////////////////////////////////////////////////</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><br /><span style="color: #0000FF; ">class</span>&nbsp;A&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;A&amp;&nbsp;reflect()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br />A*&nbsp;func_provide_local_class(<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LocalA:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;A&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalA(<span style="color: #0000FF; ">int</span>&nbsp;x):&nbsp;m_x(x)&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;func()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;__PRETTY_FUNCTION__&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;A&amp;&nbsp;reflect()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;m_x;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;A*&nbsp;pa&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LocalA(x);<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;typeid(pa).name()&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pa;<br />}<br /><br /><span style="color: #808080; ">///////////////////////////////////////////////////</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><br /><span style="color: #0000FF; ">class</span>&nbsp;B&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;func(<span style="color: #0000FF; ">double</span>&amp;&nbsp;d)&nbsp;=&nbsp;0;<br />};<br /><br /><br /><span style="color: #808080; ">///////////////////////////////////////////////////</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">enum&nbsp;is&nbsp;also&nbsp;a&nbsp;specific&nbsp;type</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;EM&nbsp;em&nbsp;=&nbsp;ONE;<br />&nbsp;&nbsp;&nbsp;&nbsp;func(argc);<br />&nbsp;&nbsp;&nbsp;&nbsp;func(em);<br />&nbsp;&nbsp;&nbsp;&nbsp;trait(em);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("--------------------------------------------\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">trait&nbsp;in&nbsp;two&nbsp;ways</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;trait(&amp;B::func);<br />&nbsp;&nbsp;&nbsp;&nbsp;trait_detail(&amp;B::func);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("--------------------------------------------\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">trial&nbsp;for&nbsp;local&nbsp;class,&nbsp;for&nbsp;more&nbsp;information&nbsp;see&nbsp;as&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.geeksforgeeks.org/local-class-in-c/</span><span style="color: #008000; ">&nbsp;and&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.cppblog.com/mzty/archive/2007/05/24/24766.html</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;A*&nbsp;pa&nbsp;=&nbsp;func_provide_local_class();<br />&nbsp;&nbsp;&nbsp;&nbsp;pa-&gt;func();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("--------------------------------------------\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">there's&nbsp;no&nbsp;way&nbsp;to&nbsp;use&nbsp;local&nbsp;class&nbsp;externally</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;trait(pa);<br />&nbsp;&nbsp;&nbsp;&nbsp;trait(pa-&gt;reflect());<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("--------------------------------------------\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div>=================== run result ====================<br /><div>void func(int)</div><div>void func(EM)</div><div>void trait(T) [with T = EM]</div><div>--------------------------------------------</div><div>void trait(T) [with T = int (B::*)(double&amp;)]</div><div>void trait_detail(R (C::*)(Arg1)) [with R = int, C = B, Arg1 = double&amp;]</div><div>--------------------------------------------</div><div>P1A</div><div>virtual void func_provide_local_class(int)::LocalA::func()</div><div>--------------------------------------------</div><div>void trait(T) [with T = A*]</div><div>void trait(T) [with T = A]</div><div>--------------------------------------------</div><div></div></div><img src ="http://www.blogjava.net/bacoo/aggbug/423249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-03-06 17:51 <a href="http://www.blogjava.net/bacoo/archive/2015/03/06/423249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>reinterpret class pointer</title><link>http://www.blogjava.net/bacoo/archive/2015/03/04/423195.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Wed, 04 Mar 2015 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/03/04/423195.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/423195.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/03/04/423195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/423195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/423195.html</trackback:ping><description><![CDATA[<div>#include &lt;iostream&gt;</div><div>#include &lt;stdlib.h&gt;</div><div>#include &lt;string&gt;</div><div>#include &lt;fstream&gt;</div><div>#include &lt;sstream&gt;</div><div>#include &lt;stdint.h&gt;</div><div>#include &lt;pthread.h&gt;</div><div>#include &lt;vector&gt;</div><div>#include &lt;map&gt;</div><div>#include &lt;set&gt;</div><div></div><div>using namespace std;</div><div></div><div>#define INIT(x) x = (typeof(x))(long)(&amp;x)</div><div></div><div>class Data {</div><div>public:</div><div>&nbsp; &nbsp; virtual ~Data() {};</div><div>&nbsp; &nbsp; Data() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(b);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(d);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(p);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(c);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(l);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; bool b;</div><div>&nbsp; &nbsp; double d;</div><div>&nbsp; &nbsp; int* p;</div><div>&nbsp; &nbsp; char c;</div><div>&nbsp; &nbsp; long l;</div><div></div><div>&nbsp; &nbsp; bool operator==(const Data&amp; another) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return another.b == b &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.d == d &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.p == p &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.c == c &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.l == l;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; bool operator!=(const Data&amp; another) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return !(*this == another);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void Print() const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Data::b:%d\n", b);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Data::d:%f\n", d);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Data::p:%p\n", p);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Data::c:%c(%d)\n", c, (unsigned char)c);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Data::l:%ld\n", l);</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>class Base {</div><div>public:</div><div>&nbsp; &nbsp; Base() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(p);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(c);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; i1 = c + random();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; i2 = c + random();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(d);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; u3 = c + random();</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; virtual ~Base() {};</div><div></div><div>&nbsp; &nbsp; void* p;</div><div>&nbsp; &nbsp; char c;</div><div>&nbsp; &nbsp; int i1:1;</div><div>&nbsp; &nbsp; int i2:2;</div><div>&nbsp; &nbsp; double d;</div><div>&nbsp; &nbsp; unsigned int u3:3;</div><div></div><div>&nbsp; &nbsp; bool operator==(const Base&amp; another) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return another.p &nbsp;== p &nbsp;&amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.c &nbsp;== c &nbsp;&amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.i1 == i1 &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.i2 == i2 &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.d &nbsp;== d &nbsp;&amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.u3 == u3;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; bool operator!=(const Base&amp; another) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return !(*this == another);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; virtual void Print() const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Base::p:%p\n", p);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Base::c:%c(%d)\n", c, (unsigned char)c);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Base::i1:%d\n", i1);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Base::i2:%d\n", i2);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Base::d:%f\n", d);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Base::u3:%u\n", u3);</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>class Derive: public Base {</div><div>public:</div><div>&nbsp; &nbsp; Derive() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(i);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(c);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; u1 = i + random();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; u2 = i + random();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; u3 = i + random();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; u4 = i + random();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(b);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(ui);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(uf);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; INIT(d);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; int i;</div><div>&nbsp; &nbsp; char c;</div><div>&nbsp; &nbsp; unsigned u1:10;</div><div>&nbsp; &nbsp; unsigned u2:10;</div><div>&nbsp; &nbsp; Data dt;</div><div>&nbsp; &nbsp; unsigned u3:10;</div><div>&nbsp; &nbsp; unsigned u4:2;</div><div>&nbsp; &nbsp; bool b;</div><div>&nbsp; &nbsp; union {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int ui;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; float uf;</div><div>&nbsp; &nbsp; };</div><div>&nbsp; &nbsp; double d;</div><div></div><div>&nbsp; &nbsp; virtual void Print() const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Base::Print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::i:%d\n", i);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::c:%c(%d)\n", c, (unsigned char)c);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::u1:%d\n", u1);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::u2:%d\n", u2);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; dt.Print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::u3:%d\n", u3);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::u4:%d\n", u4);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::b:%d\n", b);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::ui:%d\n", ui);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::uf:%f\n", uf);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("Derive::d:%f\n", d);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("\n");</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; bool operator==(const Derive&amp; another) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return Base::operator ==(another) &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.i &nbsp;== i &nbsp;&amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.c &nbsp;== c &nbsp;&amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.u1 == u1 &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.u2 == u2 &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.dt == dt &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.u3 == u3 &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.u4 == u4 &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.b &nbsp;== b &nbsp;&amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.ui == ui &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.uf == uf &amp;&amp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;another.d &nbsp;== d;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; bool operator!=(const Derive&amp; another) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return !(*this == another);</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>int main(int argc, char* argv[]) {</div><div>&nbsp; &nbsp; printf("sizeof(Data):%lu\n", sizeof(Data));</div><div>&nbsp; &nbsp; printf("sizeof(Base):%lu\n", sizeof(Base));</div><div>&nbsp; &nbsp; printf("sizeof(Derive):%lu\n", sizeof(Derive));</div><div>&nbsp; &nbsp; printf("\n");</div><div></div><div>&nbsp; &nbsp; Derive drv;</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; string s((const char*)&amp;drv, sizeof(Derive));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; const Derive* p = reinterpret_cast&lt;const Derive*&gt;(s.c_str());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (*p == drv) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; "*EQUAL*" &lt;&lt; endl;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p-&gt;Print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; drv.i = 1;</div><div>&nbsp; &nbsp; drv.c = 'a';</div><div>&nbsp; &nbsp; drv.u1 = 10;</div><div>&nbsp; &nbsp; drv.u2 = 20;</div><div>&nbsp; &nbsp; drv.u3 = 30;</div><div>&nbsp; &nbsp; drv.u4 = 2;</div><div>&nbsp; &nbsp; drv.b = true;</div><div>&nbsp; &nbsp; drv.ui = 3;</div><div>&nbsp; &nbsp; drv.uf = 3.5;</div><div>&nbsp; &nbsp; drv.d = 8.8;</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; string s((const char*)&amp;drv, sizeof(Derive));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; const Derive* p = reinterpret_cast&lt;const Derive*&gt;(s.c_str());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (*p == drv) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; "*EQUAL*" &lt;&lt; endl;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p-&gt;Print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; for (int i = 0; i &lt; 10 * 1024; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Derive* pdrv = new Derive();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string s((const char*)pdrv, sizeof(Derive));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const Derive* p = reinterpret_cast&lt;const Derive*&gt;(s.c_str());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (*p != *pdrv) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; "*NOT EQUAL*" &lt;&lt; endl;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pdrv-&gt;Print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p-&gt;Print();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; delete pdrv;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}<br /><br />================== &nbsp; &nbsp; run result &nbsp; &nbsp; ===================<br /><div>sizeof(Data):48</div><div>sizeof(Base):40</div><div>sizeof(Derive):112</div><div></div><div>*EQUAL*</div><div>Base::p:0x7fff24993c98</div><div>Base::c:�(160)</div><div>Base::i1:-1</div><div>Base::i2:-2</div><div>Base::d:140733807410344.000000</div><div>Base::u3:1</div><div>Derive::i:614022324</div><div>Derive::c:�(184)</div><div>Derive::u1:295</div><div>Derive::u2:261</div><div>Data::b:1</div><div>Data::d:140733807410384.000000</div><div>Data::p:0x7fff24993cd8</div><div>Data::c:�(224)</div><div>Data::l:140733807410408</div><div>Derive::u3:435</div><div>Derive::u4:2</div><div>Derive::b:1</div><div>Derive::ui:1459617353</div><div>Derive::uf:140733805756416.000000</div><div>Derive::d:140733807410424.000000</div><div></div><div>*EQUAL*</div><div>Base::p:0x7fff24993c98</div><div>Base::c:�(160)</div><div>Base::i1:-1</div><div>Base::i2:-2</div><div>Base::d:140733807410344.000000</div><div>Base::u3:1</div><div>Derive::i:1</div><div>Derive::c:a(97)</div><div>Derive::u1:10</div><div>Derive::u2:20</div><div>Data::b:1</div><div>Data::d:140733807410384.000000</div><div>Data::p:0x7fff24993cd8</div><div>Data::c:�(224)</div><div>Data::l:140733807410408</div><div>Derive::u3:30</div><div>Derive::u4:2</div><div>Derive::b:1</div><div>Derive::ui:1080033280</div><div>Derive::uf:3.500000</div><div>Derive::d:8.800000</div><div></div></div><img src ="http://www.blogjava.net/bacoo/aggbug/423195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-03-04 15:34 <a href="http://www.blogjava.net/bacoo/archive/2015/03/04/423195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>name hiding in C++</title><link>http://www.blogjava.net/bacoo/archive/2015/03/03/423156.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Tue, 03 Mar 2015 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/03/03/423156.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/423156.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/03/03/423156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/423156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/423156.html</trackback:ping><description><![CDATA[<div><div>#include &lt;iostream&gt;</div><div>#include &lt;string&gt;</div><div>#include &lt;fstream&gt;</div><div>#include &lt;sstream&gt;</div><div>#include &lt;stdint.h&gt;</div><div>#include &lt;pthread.h&gt;</div><div>#include &lt;vector&gt;</div><div>#include &lt;map&gt;</div><div>#include &lt;set&gt;</div><div></div><div>using namespace std;</div><div></div><div>void fun() {</div><div>&nbsp; &nbsp; cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; endl;</div><div>}</div><div></div><div>namespace {</div><div>&nbsp; &nbsp; void fun(int i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; endl;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ::fun(); //use fun() will compile error</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>class A {</div><div>public:</div><div>&nbsp; &nbsp; void fun() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; endl;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void fun(int x) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; endl;</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>class B: public A {</div><div>public:</div><div>&nbsp; &nbsp; //using A::fun; //solution 3</div><div>&nbsp; &nbsp; void fun(int x) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; endl;</div><div>&nbsp; &nbsp; }</div><div>};</div><div></div><div>int main(int argc, char* argv[]) {</div><div>&nbsp; &nbsp; B b;</div><div>&nbsp; &nbsp; //b.fun();//compile error, name hiding occurs</div><div>&nbsp; &nbsp; b.A::fun(); //solution 1</div><div>&nbsp; &nbsp; A* pa = &amp;b;</div><div>&nbsp; &nbsp; pa-&gt;fun(); &nbsp;//solution 2</div><div>&nbsp; &nbsp; fun(3);</div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div><br />=================== &nbsp; run result &nbsp; ===================<br /><div>$ make name_hiding &amp;&amp; ./name_hiding</div><div>void A::fun()</div><div>void A::fun()</div><div>void&lt;unnamed&gt;::fun(int)</div><div>void fun()</div><div></div></div></div><div></div><img src ="http://www.blogjava.net/bacoo/aggbug/423156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-03-03 14:34 <a href="http://www.blogjava.net/bacoo/archive/2015/03/03/423156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法：距离之和最小</title><link>http://www.blogjava.net/bacoo/archive/2015/02/07/422814.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Sat, 07 Feb 2015 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/02/07/422814.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/422814.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/02/07/422814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/422814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/422814.html</trackback:ping><description><![CDATA[题目：NxM矩阵中散落K点，求一个点，该点到各个的距离之和最短，两点之间距离的定义：折线距离（即只能横着走或竖着走）。<br />解法：求K个点的重心，从矩阵左上角，先横后竖遍历，找到第K/2个点所在的行；先竖后横找到第K/2个点所在的列；用这个行和这个列定位的点即为所求。<br />原理：假定P点为所求，距离和为S，P点到任何一点的距离都由水平距离＋垂直距离构成；若水平移动，竖直方向的距离之和保持不变；同理垂直方向。因此，该问题可以归约为一个一维问题：数轴上散落N个点，求一个点到各个点的距离之和最小，下面进行简单论证：<br />a b c d e f g七个点，d点即位所求；如果是f点，那么该问题可以归约为b c d e f五个点的问题（在比较d和f谁更优时，a和g同时存在或不存在对问题的影响是一致的），此时，显然f不如d。<br />推广：K个点，每个点都有一个系数q，两点之间距离定义为：折线距离 x 系数k；解法依旧：先计算K个点的总系数Q，遍历方法依旧，只不过这次是找到一个点，截至这个点累加起来的系数之和刚好达到Q/2。<br />领悟：实则就是求重心。<br />代码：和穷举法做了对比，结果一致。<br /><div>#include &lt;iostream&gt;</div><div>#include &lt;stdlib.h&gt;</div><div>#include &lt;string&gt;</div><div>#include &lt;vector&gt;</div><div>#include &lt;map&gt;</div><div>#include &lt;math.h&gt;</div><div>#include &lt;set&gt;</div><div></div><div>using namespace std;</div><div></div><div>class MatchPointFinder {</div><div>public:</div><div>&nbsp; &nbsp; double GetDistanceBetweenTwoPoints(int x1, int y1, int x2, int y2, double alpha) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return (abs(x1 - x2) + abs(y1 - y2)) * alpha;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; //two methods will *not* be equivalent under the following way of calculating distance, for the case in "main"</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; double CalcSumDistance(int x, int y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; double dist = 0.0f;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (typeof(m_node_pos.begin()) it = m_node_pos.begin(), it4End = m_node_pos.end(); it4End != it; ++it) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dist += GetDistanceBetweenTwoPoints(it-&gt;first.first, it-&gt;first.second, x, y, it-&gt;second);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return dist;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; MatchPointFinder(): m_width(0), m_height(0), m_match_point_x(0), m_match_point_y(0), m_total_weight(0), m_nodes(NULL) {</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void ValidateEquivalenceOfTwoMethods(int trial_num = 1000) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; trial_num; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int width = 5 + rand() % 100;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int height = 5 + rand() % 100;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Reset();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RandomInit(width, height);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!CompareTwoMethod()) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Try();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("two methods are equivalent under %d x %d array scale\n", height, width);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void Try() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FindMatchPointByEnumerating(m_match_point_x, m_match_point_y);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("total weight is %f\n", m_total_weight);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; PrintMap(false);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; PrintMap();</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; int old_mp_x = m_match_point_x;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int old_mp_y = m_match_point_y;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FindMatchPointByMedianMethod(m_match_point_x, m_match_point_y);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; PrintMap(false);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (old_mp_x == m_match_point_x &amp;&amp; old_mp_y == m_match_point_y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("two methods are equivalent under %d x %d array scale\n", m_height, m_width);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("two methods are *not* equivalent under %d x %d array scale\n", m_height, m_width);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; template &lt;typename T&gt;</div><div>&nbsp; &nbsp; T abs(const T&amp; t) const {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return t &gt; 0 ? t : -1 * t;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; bool CompareTwoMethod() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FindMatchPointByEnumerating(m_match_point_x, m_match_point_y);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; int old_mp_x = m_match_point_x;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int old_mp_y = m_match_point_y;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FindMatchPointByMedianMethod(m_match_point_x, m_match_point_y);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (old_mp_x == m_match_point_x &amp;&amp; old_mp_y == m_match_point_y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; } else if (abs(m_node_dist[std::make_pair(old_mp_x, old_mp_y)] - m_node_dist[std::make_pair(m_match_point_x, m_match_point_y)]) &lt; 0.000001) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; return false;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; ~MatchPointFinder() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Reset();</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void RandomInit(int width = -1, int height = -1, bool init_random = true) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (-1 != width) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_width = width;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (-1 != height) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_height = height;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; srand(time(NULL));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_nodes = new double*[m_height];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; memset(m_nodes, 0, sizeof(double*) * m_height);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_height; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!init_random) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_nodes[i] = new double[m_width];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memset(m_nodes[i], 0, sizeof(int) * m_width);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j &lt; m_width; ++j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (0 == j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_nodes[i] = new double[m_width];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memset(m_nodes[i], 0, sizeof(int) * m_width);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_nodes[i][j] = ((rand() % 10) &gt;= 5 ? (double)(1 + rand() % 3) / 5 : 0);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (m_nodes[i][j]) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_node_pos[std::make_pair(i, j)] = m_nodes[i][j];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_total_weight += m_nodes[i][j];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void AddNode(int x, int y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_nodes[x][y] = 1;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_node_pos[std::make_pair(x, y)] = 1;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_total_weight += 1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void FindMatchPointByMedianMethod(int&amp; mp_x, int&amp; mp_y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; double collected_weight = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; mp_x = -1;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_height; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j &lt; m_width; ++j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (m_nodes[i][j] &lt;= 0) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; collected_weight += m_nodes[i][j];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (collected_weight &gt;= m_total_weight / 2) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mp_x = i;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (-1 != mp_x) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; collected_weight = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; mp_y = -1;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j &lt; m_width; ++j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_height; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (m_nodes[i][j] &lt;= 0) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; collected_weight += m_nodes[i][j];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (collected_weight &gt;= m_total_weight / 2) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mp_y = j;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (-1 != mp_y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void FindMatchPointByEnumerating(int&amp; mp_x, int&amp; mp_y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; double shortest_sum_dist = std::numeric_limits&lt;double&gt;::max();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_height; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j &lt; m_width; ++j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; double dist = CalcSumDistance(i, j);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m_node_dist[std::make_pair(i, j)] = dist;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (dist &lt; shortest_sum_dist) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shortest_sum_dist = dist;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mp_x = i;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mp_y = j;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void PrintMap(bool print_dist = true) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("%4s ", " ");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_width; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(" &nbsp; &nbsp; &nbsp;(%2d) ", i);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_height; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("(%2d) ", i);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j &lt; m_width; ++j) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (i == m_match_point_x &amp;&amp; j == m_match_point_y) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (print_dist) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("*%.1f[%2.1f] ", m_nodes[i][j], m_node_dist[std::make_pair(i, j)]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(" &nbsp; &nbsp; &nbsp;*%.1f ", m_nodes[i][j]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (print_dist) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("%.1f[%2.1f] ", m_nodes[i][j], m_node_dist[std::make_pair(i, j)]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(" &nbsp; &nbsp; &nbsp;%.1f ", m_nodes[i][j]);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; printf("\n");</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; void Reset() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (m_nodes) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt; m_height; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delete [] m_nodes[i];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delete [] m_nodes;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_nodes = NULL;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_width = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_height = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_match_point_x = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_match_point_y = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_total_weight = 0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_node_pos.clear();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; m_node_dist.clear();</div><div>&nbsp; &nbsp; }</div><div></div><div>private:</div><div>&nbsp; &nbsp; int m_width;</div><div>&nbsp; &nbsp; int m_height;</div><div>&nbsp; &nbsp; int m_match_point_x;</div><div>&nbsp; &nbsp; int m_match_point_y;</div><div>&nbsp; &nbsp; double m_total_weight;</div><div>&nbsp; &nbsp; double** m_nodes;</div><div>&nbsp; &nbsp; std::map&lt;std::pair&lt;int, int&gt;, double&gt; m_node_pos;</div><div>&nbsp; &nbsp; std::map&lt;std::pair&lt;int, int&gt;, double&gt; m_node_dist;</div><div>};</div><div></div><div>int main(int argc, char* argv[]) {</div><div>&nbsp; &nbsp; int width = 5;</div><div>&nbsp; &nbsp; int height = 5;</div><div>&nbsp; &nbsp; if (argc &gt; 1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; height = atoi(argv[1]);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if (argc &gt; 2) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; width = atoi(argv[2]);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; MatchPointFinder mpf;</div><div></div><div>&nbsp; &nbsp; //mpf.RandomInit(width, height);</div><div>&nbsp; &nbsp; //mpf.Try();</div><div>&nbsp; &nbsp; //return 0;</div><div></div><div>&nbsp; &nbsp; mpf.ValidateEquivalenceOfTwoMethods(1000);</div><div>&nbsp; &nbsp; return 0;</div><div></div><div>&nbsp; &nbsp; /*</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( 0) &nbsp; &nbsp; &nbsp; ( 1) &nbsp; &nbsp; &nbsp; ( 2) &nbsp; &nbsp; &nbsp; ( 3) &nbsp; &nbsp; &nbsp; ( 4)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( 0) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( 1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( 2) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( 3) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; * &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( 4) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1</div><div>&nbsp; &nbsp; */</div><div>&nbsp; &nbsp; mpf.Reset();</div><div>&nbsp; &nbsp; mpf.RandomInit(5, 5, false);</div><div></div><div>&nbsp; &nbsp; mpf.AddNode(0, 0);</div><div>&nbsp; &nbsp; mpf.AddNode(0, 1);</div><div>&nbsp; &nbsp; mpf.AddNode(0, 4);</div><div></div><div>&nbsp; &nbsp; mpf.AddNode(1, 0);</div><div>&nbsp; &nbsp; mpf.AddNode(1, 3);</div><div></div><div>&nbsp; &nbsp; mpf.AddNode(2, 0);</div><div>&nbsp; &nbsp; mpf.AddNode(2, 1);</div><div>&nbsp; &nbsp; mpf.AddNode(2, 3);</div><div></div><div>&nbsp; &nbsp; mpf.AddNode(3, 2);</div><div>&nbsp; &nbsp; mpf.AddNode(3, 3);</div><div></div><div>&nbsp; &nbsp; mpf.AddNode(4, 0);</div><div>&nbsp; &nbsp; mpf.AddNode(4, 1);</div><div>&nbsp; &nbsp; mpf.AddNode(4, 2);</div><div>&nbsp; &nbsp; mpf.AddNode(4, 3);</div><div>&nbsp; &nbsp; mpf.AddNode(4, 4);</div><div></div><div>&nbsp; &nbsp; mpf.Try();</div><div>&nbsp; &nbsp; return 0;</div><div>}</div><img src ="http://www.blogjava.net/bacoo/aggbug/422814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-02-07 20:34 <a href="http://www.blogjava.net/bacoo/archive/2015/02/07/422814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>G路</title><link>http://www.blogjava.net/bacoo/archive/2015/02/01/422625.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Sun, 01 Feb 2015 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2015/02/01/422625.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/422625.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2015/02/01/422625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/422625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/422625.html</trackback:ping><description><![CDATA[<div>讲清楚了P、NP、NPC、NP-hard的概念：http://blog.csdn.net/dongwq/article/details/4305435</div><img src ="http://www.blogjava.net/bacoo/aggbug/422625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2015-02-01 12:44 <a href="http://www.blogjava.net/bacoo/archive/2015/02/01/422625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调查：map在clear之后并没有释放内存</title><link>http://www.blogjava.net/bacoo/archive/2014/09/18/418059.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 18 Sep 2014 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2014/09/18/418059.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/418059.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2014/09/18/418059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/418059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/418059.html</trackback:ping><description><![CDATA[<div>http://jdoc.iteye.com/blog/1217804</div><div>http://valgrind.org/docs/manual/ms-manual.html</div><div>http://manyhappy163.blog.163.com/blog/static/16447683120105174149969/</div><div>http://hi.baidu.com/algorithms/item/77e5c6bfed350d77244b097f</div><div>经过调查，结论是：</div><div>1。map不能使用swap的方式来强制释放内存；</div><div>2。map用的allocator，新版gcc用new_allocator，不存在pool的问题；</div><div>3。根本原因是free函数（libc内部实现），并没有把你内存真正的释放，这个与free的内部实现机制有关了。</div><div></div><div>下面是一个小的测试程序</div><div>$ cat test_mem_seg.cpp&nbsp;</div><div>#include &lt;vector&gt;</div><div>#include &lt;malloc.h&gt;</div><div>#include &lt;stdio.h&gt;</div><div>#include &lt;iostream&gt;</div><div>#include &lt;stdlib.h&gt;</div><div></div><div>int main(int argc, char* argv[]) {</div><div>&nbsp; &nbsp; std::vector&lt;void*&gt; v;</div><div>&nbsp; &nbsp; int block_len = 120;</div><div>&nbsp; &nbsp; if (argc &gt; 1) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; block_len = atoi(argv[1]);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; for (int i = 0; i &lt; 1024 * 1024; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; char* p = (char*)malloc(block_len);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; sprintf(p, "%d", i);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; v.push_back(p);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; std::cout &lt;&lt; "\n===============malloc (block unit size:" &lt;&lt; block_len &lt;&lt; ") ok==============\n";</div><div>&nbsp; &nbsp; malloc_stats();</div><div></div><div>&nbsp; &nbsp; for (int i = 0; i &lt; 1024 * 1024; ++i) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; free(v[i]);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; std::cout &lt;&lt; "\n===============free &nbsp;(block unit size:" &lt;&lt; block_len &lt;&lt; ") ok==============\n";</div><div>&nbsp; &nbsp; malloc_stats();</div><div>}</div><div></div><img src ="http://www.blogjava.net/bacoo/aggbug/418059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2014-09-18 14:26 <a href="http://www.blogjava.net/bacoo/archive/2014/09/18/418059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>epoll简单学习</title><link>http://www.blogjava.net/bacoo/archive/2013/07/04/401219.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 04 Jul 2013 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2013/07/04/401219.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/401219.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2013/07/04/401219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/401219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/401219.html</trackback:ping><description><![CDATA[<div>epoll的EPOLLIN和EPOLLOU为什么不能同时关联 &nbsp; &nbsp; &nbsp; &nbsp; http://laokaddk.blog.51cto.com/368606/791945</div><div>epoll使用总结 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;http://laokaddk.blog.51cto.com/368606/617497</div><div>epoll学习：思考一种高性能的服务器处理框架 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http://laokaddk.blog.51cto.com/368606/607231</div><div>epoll学习笔记 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;http://laokaddk.blog.51cto.com/368606/607017</div><div></div><div>简单学习了一下epoll，之前也用过，这次又看了看，收获如下：</div><div>两种实现模式（在http://laokaddk.blog.51cto.com/368606/791945中都有提到）：同一个线程 和 不同线程；</div><div>顺便了解了一下惊群现象，如果用accept阻塞的方式就不存在惊群现象了，在不同线程中通过epoll_wait来出发accept行为的nginx的解决方法是通过进程里原子的修改寄存器a来做到进程间互斥的。</div><div>在不同线程模式下：listenfd需设置为非阻塞，注册EPOLLIN就可以了，触发时调用accept，有没有连接都会立刻返回；</div><div>在同一个线程模式下：listenfd为阻塞模式，不注册epoll，阻塞while调用accept即可；</div><div>ET触发只支持非阻塞模式，这里针对的fd是accept接收到的然后epoll_add了的那些fds，原因是：因为ET触发需要处理函数一直处理完所有in/out数据，比如read数据，如果read到的字节数小于预先准备读入的字节数，那么就可以认为读完了；如果是非阻塞模式，那么read会一直阻塞在那里。</div><div>epollfd不需要设置阻塞、非阻塞。</div><div>一般都用LT触发，不论哪种实现模式，EPOLLIN和EPOLLOUT都不同时设定，都是不断切换来做的。</div><div>客户端close掉socket时，会唤醒服务端epoll_wait;</div><div>对于epoll_wait而言，针对一个fd只存在唤醒与被唤醒，至于是EPOLLIN还是EPOLLOUT，取决于你当初epoll_add时的设定，因此如果你epoll_add时设定了EPOLLIN|EPOLLOUT，那么当EPOLLIN发生时（内核里当然是可以区分EPOLLIN和EPOLLOUT的），你收到的fd上的事件依然是EPOLLIN|EPOLLOUT。<br /><br /><div>http://my.oschina.net/costaxu/blog/127394</div><div>http://blog.csdn.net/guomsh/article/details/8484222</div><div>http://blog.csdn.net/guomsh/article/details/8478209</div><div>http://blog.csdn.net/ctthuangcheng/article/details/8596818</div><div>http://blog.yunn.io/archives/114/</div></div><img src ="http://www.blogjava.net/bacoo/aggbug/401219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2013-07-04 17:36 <a href="http://www.blogjava.net/bacoo/archive/2013/07/04/401219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何确定进程对文件的访问</title><link>http://www.blogjava.net/bacoo/archive/2012/12/21/393325.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Fri, 21 Dec 2012 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2012/12/21/393325.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/393325.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2012/12/21/393325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/393325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/393325.html</trackback:ping><description><![CDATA[假定启动命令为：./abcd 23，我们想看看该进程是否需要访问test.txt文件<br />1. 启动后lsof -p $(pgrep abcd)<br />2. 启动过程中 strace -f -e file ./abcd 23 2&gt;&amp;1 | grep open #strace -e network/signal/desc都是很有用的调试参数<br />3. 可以chmod a-rw test.txt，然后再启动./abcd 23，如果程序无法访问test.txt，或许会报错并退出，我们可以根据报错信息来顺藤摸瓜<br />4. 还有一种方法，经测试未奏效：<br /><div>(gdb) start</div><div>(gdb) break open</div><div>(gdb) condition 2 strcmp (((char**)$esp)[1], "bar") == 0<br />上面((char**)$esp)[1]用于取第一个参数，gdb的strcmp或许会不好用（可以用p strcmp("hello", "hello")测试一下），如果不好用，可以自己写一个：<br />int mystrcmp(const char* p1, const char* p2) {<br />&nbsp; &nbsp; return strcmp(p1, p2);<br />}<br />5. 通过断点来打印bt信息：<br />define mybt<br />&nbsp;&nbsp;&nbsp; set logging file t3.log<br />&nbsp;&nbsp;&nbsp; set logging on<br /><br />&nbsp;&nbsp;&nbsp; break $arg0<br />&nbsp;&nbsp;&nbsp; while 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bt<br />&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp; set logging off<br />end<br /><br />6. 经过不懈的努力，终于得到了一种可行的方法：<br />$ cat t3.gdb<br /><div>set print pretty on</div><div>#set print elements &nbsp;0</div><div>set print frame-arguments &nbsp;all</div><div>#set print union on</div><div>set print object on</div><div>#set print demangle on</div><div></div><div>set logging file t3.log</div><div>set logging overwrite</div><div>set logging redirect</div><div>set logging on</div><div></div><div>start &lt; &lt;(echo $(cat b.html)) #give input stream from a temporary named pipe</div><div>#catch syscall open<br />break open</div><div></div><div>while 1</div><div>&nbsp; &nbsp; continue</div><div>&nbsp; &nbsp; #info args</div><div>&nbsp; &nbsp; #info locals<br />&nbsp; &nbsp; print (char*)$rdi #print filename</div><div>&nbsp; &nbsp; #bt full<br />&nbsp; &nbsp; bt</div><div>end</div><div>set logging off</div><div>$&nbsp;gdb --batch -x t3.gdb --args ./test -a 1 -o "test.txt"<br />7. mkfifo test.txt #this maybe hang up read<br />8. sudo apt-get install auditd; sudo auditctl -p wra -w $PWD/test.txt; sudo ausearch -f $PWD/test.txt(or sudo vim /var/log/audit/audit.log) #this will monitor read/write/access of test.txt and record logs in /var/log/audit/audit.log</div></div><img src ="http://www.blogjava.net/bacoo/aggbug/393325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2012-12-21 17:19 <a href="http://www.blogjava.net/bacoo/archive/2012/12/21/393325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何修改进程的命令行</title><link>http://www.blogjava.net/bacoo/archive/2012/12/21/393313.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Fri, 21 Dec 2012 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2012/12/21/393313.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/393313.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2012/12/21/393313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/393313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/393313.html</trackback:ping><description><![CDATA[<div><span style="white-space:pre">下面这段代码摘自php/sapi/fpm/fpm/fpm_env.c<br />	</span>/*</div><div><span style="white-space:pre">	</span> * This piece of code has been inspirated from nginx and pureftpd code, whic</div><div><span style="white-space:pre">	</span> * are under BSD licence.</div><div><span style="white-space:pre">	</span> *</div><div><span style="white-space:pre">	</span> * To change the process title in Linux we have to set argv[1] to NULL</div><div><span style="white-space:pre">	</span> * and to copy the title to the same place where the argv[0] points to.</div><div><span style="white-space:pre">	</span> * However, argv[0] may be too small to hold a new title. &nbsp;Fortunately, Linux</div><div><span style="white-space:pre">	</span> * store argv[] and environ[] one after another. &nbsp;So we should ensure that is</div><div><span style="white-space:pre">	</span> * the continuous memory and then we allocate the new memory for environ[]</div><div><span style="white-space:pre">	</span> * and copy it. &nbsp;After this we could use the memory starting from argv[0] for</div><div><span style="white-space:pre">	</span> * our process title.</div><div><span style="white-space:pre">	</span> */</div><div></div><div><span style="white-space:pre">	</span>for (i = 0; i &lt; fpm_globals.argc; i++) {</div><div><span style="white-space:pre">		</span>if (first == NULL) {</div><div><span style="white-space:pre">			</span>first = fpm_globals.argv[i];</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span>if (last == NULL || fpm_globals.argv[i] == last + 1) {</div><div><span style="white-space:pre">			</span>last = fpm_globals.argv[i] + strlen(fpm_globals.argv[i]);</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>if (environ) {</div><div><span style="white-space:pre">		</span>for (i = 0; environ[i]; i++) {</div><div><span style="white-space:pre">			</span>if (first == NULL) {</div><div><span style="white-space:pre">				</span>first = environ[i];</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">			</span>if (last == NULL || environ[i] == last + 1) {</div><div><span style="white-space:pre">				</span>last = environ[i] + strlen(environ[i]);</div><div><span style="white-space:pre">			</span>}</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>if (first == NULL || last == NULL) {</div><div><span style="white-space:pre">		</span>return 0;</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>fpm_env_argv_len = last - first;</div><div><span style="white-space:pre">	</span>fpm_env_argv = fpm_globals.argv;</div><div><span style="white-space:pre">	</span>if (environ != NULL) {</div><div><span style="white-space:pre">		</span>char **new_environ;</div><div><span style="white-space:pre">		</span>unsigned int env_nb = 0U;</div><div></div><div><span style="white-space:pre">		</span>while (environ[env_nb]) {</div><div><span style="white-space:pre">			</span>env_nb++;</div><div><span style="white-space:pre">		</span>}</div><div></div><div><span style="white-space:pre">		</span>if ((new_environ = malloc((1U + env_nb) * sizeof (char *))) == NULL) {</div><div><span style="white-space:pre">			</span>return -1;</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span>new_environ[env_nb] = NULL;</div><div><span style="white-space:pre">		</span>while (env_nb &gt; 0U) {</div><div><span style="white-space:pre">			</span>env_nb--;</div><div><span style="white-space:pre">			</span>new_environ[env_nb] = strdup(environ[env_nb]);</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span>environ = new_environ;</div><div><span style="white-space:pre">	</span>}</div><div>#endif</div><div>#endif</div><div></div><div><span style="white-space:pre">	</span>spprintf(&amp;title, 0, "master process (%s)", fpm_globals.config);</div><div><span style="white-space:pre">	</span>fpm_env_setproctitle(title);&nbsp;</div><div><span style="white-space:pre">	</span>efree(title);</div><img src ="http://www.blogjava.net/bacoo/aggbug/393313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2012-12-21 15:18 <a href="http://www.blogjava.net/bacoo/archive/2012/12/21/393313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.gdbinit文件</title><link>http://www.blogjava.net/bacoo/archive/2012/11/07/390979.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Wed, 07 Nov 2012 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2012/11/07/390979.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/390979.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2012/11/07/390979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/390979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/390979.html</trackback:ping><description><![CDATA[<div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div># &nbsp; STL GDB evaluators/views/utilities - 1.03</div><div>#</div><div># &nbsp; The new GDB commands: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div># <span style="white-space:pre">	</span> &nbsp; &nbsp;are entirely non instrumental &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div># <span style="white-space:pre">	</span> &nbsp; &nbsp;do not depend on any "inline"(s) - e.g. size(), [], etc</div><div># &nbsp; &nbsp; &nbsp; are extremely tolerant to debugger settings</div><div># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div># &nbsp; This file should be "included" in .gdbinit as following:</div><div># &nbsp; source stl-views.gdb or just paste it into your .gdbinit file</div><div>#</div><div># &nbsp; The following STL containers are currently supported:</div><div>#</div><div># &nbsp; &nbsp; &nbsp; std::vector&lt;T&gt; -- via pvector command</div><div># &nbsp; &nbsp; &nbsp; std::list&lt;T&gt; -- via plist or plist_member command</div><div># &nbsp; &nbsp; &nbsp; std::map&lt;T,T&gt; -- via pmap or pmap_member command</div><div># &nbsp; &nbsp; &nbsp; std::multimap&lt;T,T&gt; -- via pmap or pmap_member command</div><div># &nbsp; &nbsp; &nbsp; std::set&lt;T&gt; -- via pset command</div><div># &nbsp; &nbsp; &nbsp; std::multiset&lt;T&gt; -- via pset command</div><div># &nbsp; &nbsp; &nbsp; std::deque&lt;T&gt; -- via pdequeue command</div><div># &nbsp; &nbsp; &nbsp; std::stack&lt;T&gt; -- via pstack command</div><div># &nbsp; &nbsp; &nbsp; std::queue&lt;T&gt; -- via pqueue command</div><div># &nbsp; &nbsp; &nbsp; std::priority_queue&lt;T&gt; -- via ppqueue command</div><div># &nbsp; &nbsp; &nbsp; std::bitset&lt;n&gt; -- via pbitset command</div><div># &nbsp; &nbsp; &nbsp; std::string -- via pstring command</div><div># &nbsp; &nbsp; &nbsp; std::widestring -- via pwstring command</div><div>#</div><div># &nbsp; The end of this file contains (optional) C++ beautifiers</div><div># &nbsp; Make sure your debugger supports $argc</div><div>#</div><div># &nbsp; Simple GDB Macros writen by Dan Marinescu (H-PhD) - License GPL</div><div># &nbsp; Inspired by intial work of Tom Malnar,&nbsp;</div><div># &nbsp; &nbsp; Tony Novac (PhD) / Cornell / Stanford,</div><div># &nbsp; &nbsp; Gilad Mishne (PhD) and Many Many Others.</div><div># &nbsp; Contact: dan_c_marinescu@yahoo.com (Subject: STL)</div><div>#</div><div># &nbsp; Modified to work with g++ 4.3 by Anders Elton</div><div># &nbsp; Also added _member functions, that instead of printing the entire class in map, prints a member.</div><div></div><div></div><div></div><div>#</div><div># std::vector&lt;&gt;</div><div>#</div><div></div><div>define pvector</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pvector</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $size = $arg0._M_impl._M_finish - $arg0._M_impl._M_start</div><div><span style="white-space:pre">		</span>set $capacity = $arg0._M_impl._M_end_of_storage - $arg0._M_impl._M_start</div><div><span style="white-space:pre">		</span>set $size_max = $size - 1</div><div><span style="white-space:pre">	</span>end</div><div><span style="white-space:pre">	</span>if $argc == 1</div><div><span style="white-space:pre">		</span>set $i = 0</div><div><span style="white-space:pre">		</span>while $i &lt; $size</div><div><span style="white-space:pre">			</span>printf "elem[%u]: ", $i</div><div><span style="white-space:pre">			</span>p *($arg0._M_impl._M_start + $i)</div><div><span style="white-space:pre">			</span>set $i++</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">	</span>end</div><div><span style="white-space:pre">	</span>if $argc == 2</div><div><span style="white-space:pre">		</span>set $idx = $arg1</div><div><span style="white-space:pre">		</span>if $idx &lt; 0 || $idx &gt; $size_max</div><div><span style="white-space:pre">			</span>printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max</div><div><span style="white-space:pre">		</span>else</div><div><span style="white-space:pre">			</span>printf "elem[%u]: ", $idx</div><div><span style="white-space:pre">			</span>p *($arg0._M_impl._M_start + $idx)</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">	</span>end</div><div><span style="white-space:pre">	</span>if $argc == 3</div><div><span style="white-space:pre">	</span> &nbsp;set $start_idx = $arg1</div><div><span style="white-space:pre">	</span> &nbsp;set $stop_idx = $arg2</div><div><span style="white-space:pre">	</span> &nbsp;if $start_idx &gt; $stop_idx</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;set $tmp_idx = $start_idx</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;set $start_idx = $stop_idx</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;set $stop_idx = $tmp_idx</div><div><span style="white-space:pre">	</span> &nbsp;end</div><div><span style="white-space:pre">	</span> &nbsp;if $start_idx &lt; 0 || $stop_idx &lt; 0 || $start_idx &gt; $size_max || $stop_idx &gt; $size_max</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max</div><div><span style="white-space:pre">	</span> &nbsp;else</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;set $i = $start_idx</div><div><span style="white-space:pre">		</span>while $i &lt;= $stop_idx</div><div><span style="white-space:pre">			</span>printf "elem[%u]: ", $i</div><div><span style="white-space:pre">			</span>p *($arg0._M_impl._M_start + $i)</div><div><span style="white-space:pre">			</span>set $i++</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">	</span> &nbsp;end</div><div><span style="white-space:pre">	</span>end</div><div><span style="white-space:pre">	</span>if $argc &gt; 0</div><div><span style="white-space:pre">		</span>printf "Vector size = %u\n", $size</div><div><span style="white-space:pre">		</span>printf "Vector capacity = %u\n", $capacity</div><div><span style="white-space:pre">		</span>printf "Element "</div><div><span style="white-space:pre">		</span>whatis $arg0._M_impl._M_start</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pvector</div><div><span style="white-space:pre">	</span>Prints std::vector&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: pvector &lt;vector&gt; &lt;idx1&gt; &lt;idx2&gt;</div><div><span style="white-space:pre">	</span>Note: idx, idx1 and idx2 must be in acceptable range [0..&lt;vector&gt;.size()-1].</div><div><span style="white-space:pre">	</span>Examples:</div><div><span style="white-space:pre">	</span>pvector v - Prints vector content, size, capacity and T typedef</div><div><span style="white-space:pre">	</span>pvector v 0 - Prints element[idx] from vector</div><div><span style="white-space:pre">	</span>pvector v 1 2 - Prints elements in range [idx1..idx2] from vector</div><div>end&nbsp;</div><div></div><div>#</div><div># std::list&lt;&gt;</div><div>#</div><div></div><div>define plist</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help plist</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $head = &amp;$arg0._M_impl._M_node</div><div><span style="white-space:pre">		</span>set $current = $arg0._M_impl._M_node._M_next</div><div><span style="white-space:pre">		</span>set $size = 0</div><div><span style="white-space:pre">		</span>while $current != $head</div><div><span style="white-space:pre">			</span>if $argc == 2</div><div><span style="white-space:pre">				</span>printf "elem[%u]: ", $size</div><div><span style="white-space:pre">				</span>p *($arg1*)($current + 1)</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>if $argc == 3</div><div><span style="white-space:pre">				</span>if $size == $arg2</div><div><span style="white-space:pre">					</span>printf "elem[%u]: ", $size</div><div><span style="white-space:pre">					</span>p *($arg1*)($current + 1)</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>set $current = $current._M_next</div><div><span style="white-space:pre">			</span>set $size++</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "List size = %u \n", $size</div><div><span style="white-space:pre">		</span>if $argc == 1</div><div><span style="white-space:pre">			</span>printf "List "</div><div><span style="white-space:pre">			</span>whatis $arg0</div><div><span style="white-space:pre">			</span>printf "Use plist &lt;variable_name&gt; &lt;element_type&gt; to see the elements in the list.\n"</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document plist</div><div><span style="white-space:pre">	</span>Prints std::list&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: plist &lt;list&gt; &lt;T&gt; &lt;idx&gt;: Prints list size, if T defined all elements or just element at idx</div><div><span style="white-space:pre">	</span>Examples:</div><div><span style="white-space:pre">	</span>plist l - prints list size and definition</div><div><span style="white-space:pre">	</span>plist l int - prints all elements and list size</div><div><span style="white-space:pre">	</span>plist l int 2 - prints the third element in the list (if exists) and list size</div><div>end</div><div></div><div>define plist_member</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help plist_member</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $head = &amp;$arg0._M_impl._M_node</div><div><span style="white-space:pre">		</span>set $current = $arg0._M_impl._M_node._M_next</div><div><span style="white-space:pre">		</span>set $size = 0</div><div><span style="white-space:pre">		</span>while $current != $head</div><div><span style="white-space:pre">			</span>if $argc == 3</div><div><span style="white-space:pre">				</span>printf "elem[%u]: ", $size</div><div><span style="white-space:pre">				</span>p (*($arg1*)($current + 1)).$arg2</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>if $argc == 4</div><div><span style="white-space:pre">				</span>if $size == $arg3</div><div><span style="white-space:pre">					</span>printf "elem[%u]: ", $size</div><div><span style="white-space:pre">					</span>p (*($arg1*)($current + 1)).$arg2</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>set $current = $current._M_next</div><div><span style="white-space:pre">			</span>set $size++</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "List size = %u \n", $size</div><div><span style="white-space:pre">		</span>if $argc == 1</div><div><span style="white-space:pre">			</span>printf "List "</div><div><span style="white-space:pre">			</span>whatis $arg0</div><div><span style="white-space:pre">			</span>printf "Use plist_member &lt;variable_name&gt; &lt;element_type&gt; &lt;member&gt; to see the elements in the list.\n"</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document plist_member</div><div><span style="white-space:pre">	</span>Prints std::list&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: plist &lt;list&gt; &lt;T&gt; &lt;idx&gt;: Prints list size, if T defined all elements or just element at idx</div><div><span style="white-space:pre">	</span>Examples:</div><div><span style="white-space:pre">	</span>plist_member l int member - prints all elements and list size</div><div><span style="white-space:pre">	</span>plist_member l int member 2 - prints the third element in the list (if exists) and list size</div><div>end</div><div></div><div></div><div>#</div><div># std::map and std::multimap</div><div>#</div><div></div><div>define pmap</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pmap</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $tree = $arg0</div><div><span style="white-space:pre">		</span>set $i = 0</div><div><span style="white-space:pre">		</span>set $node = $tree._M_t._M_impl._M_header._M_left</div><div><span style="white-space:pre">		</span>set $end = $tree._M_t._M_impl._M_header</div><div><span style="white-space:pre">		</span>set $tree_size = $tree._M_t._M_impl._M_node_count</div><div><span style="white-space:pre">		</span>if $argc == 1</div><div><span style="white-space:pre">			</span>printf "Map "</div><div><span style="white-space:pre">			</span>whatis $tree</div><div><span style="white-space:pre">			</span>printf "Use pmap &lt;variable_name&gt; &lt;left_element_type&gt; &lt;right_element_type&gt; to see the elements in the map.\n"</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 3</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>printf "elem[%u].left: ", $i</div><div><span style="white-space:pre">				</span>p *($arg1*)$value</div><div><span style="white-space:pre">				</span>set $value = $value + sizeof($arg1)</div><div><span style="white-space:pre">				</span>printf "elem[%u].right: ", $i</div><div><span style="white-space:pre">				</span>p *($arg2*)$value</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 4</div><div><span style="white-space:pre">			</span>set $idx = $arg3</div><div><span style="white-space:pre">			</span>set $ElementsFound = 0</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>if *($arg1*)$value == $idx</div><div><span style="white-space:pre">					</span>printf "elem[%u].left: ", $i</div><div><span style="white-space:pre">					</span>p *($arg1*)$value</div><div><span style="white-space:pre">					</span>set $value = $value + sizeof($arg1)</div><div><span style="white-space:pre">					</span>printf "elem[%u].right: ", $i</div><div><span style="white-space:pre">					</span>p *($arg2*)$value</div><div><span style="white-space:pre">					</span>set $ElementsFound++</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>printf "Number of elements found = %u\n", $ElementsFound</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 5</div><div><span style="white-space:pre">			</span>set $idx1 = $arg3</div><div><span style="white-space:pre">			</span>set $idx2 = $arg4</div><div><span style="white-space:pre">			</span>set $ElementsFound = 0</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>set $valueLeft = *($arg1*)$value</div><div><span style="white-space:pre">				</span>set $valueRight = *($arg2*)($value + sizeof($arg1))</div><div><span style="white-space:pre">				</span>if $valueLeft == $idx1 &amp;&amp; $valueRight == $idx2</div><div><span style="white-space:pre">					</span>printf "elem[%u].left: ", $i</div><div><span style="white-space:pre">					</span>p $valueLeft</div><div><span style="white-space:pre">					</span>printf "elem[%u].right: ", $i</div><div><span style="white-space:pre">					</span>p $valueRight</div><div><span style="white-space:pre">					</span>set $ElementsFound++</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>printf "Number of elements found = %u\n", $ElementsFound</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "Map size = %u\n", $tree_size</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pmap</div><div><span style="white-space:pre">	</span>Prints std::map&lt;TLeft and TRight&gt; or std::multimap&lt;TLeft and TRight&gt; information. Works for std::multimap as well.</div><div><span style="white-space:pre">	</span>Syntax: pmap &lt;map&gt; &lt;TtypeLeft&gt; &lt;TypeRight&gt; &lt;valLeft&gt; &lt;valRight&gt;: Prints map size, if T defined all elements or just element(s) with val(s)</div><div><span style="white-space:pre">	</span>Examples:</div><div><span style="white-space:pre">	</span>pmap m - prints map size and definition</div><div><span style="white-space:pre">	</span>pmap m int int - prints all elements and map size</div><div><span style="white-space:pre">	</span>pmap m int int 20 - prints the element(s) with left-value = 20 (if any) and map size</div><div><span style="white-space:pre">	</span>pmap m int int 20 200 - prints the element(s) with left-value = 20 and right-value = 200 (if any) and map size</div><div>end</div><div></div><div></div><div>define pmap_member</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pmap_member</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $tree = $arg0</div><div><span style="white-space:pre">		</span>set $i = 0</div><div><span style="white-space:pre">		</span>set $node = $tree._M_t._M_impl._M_header._M_left</div><div><span style="white-space:pre">		</span>set $end = $tree._M_t._M_impl._M_header</div><div><span style="white-space:pre">		</span>set $tree_size = $tree._M_t._M_impl._M_node_count</div><div><span style="white-space:pre">		</span>if $argc == 1</div><div><span style="white-space:pre">			</span>printf "Map "</div><div><span style="white-space:pre">			</span>whatis $tree</div><div><span style="white-space:pre">			</span>printf "Use pmap &lt;variable_name&gt; &lt;left_element_type&gt; &lt;right_element_type&gt; to see the elements in the map.\n"</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 5</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>printf "elem[%u].left: ", $i</div><div><span style="white-space:pre">				</span>p (*($arg1*)$value).$arg2</div><div><span style="white-space:pre">				</span>set $value = $value + sizeof($arg1)</div><div><span style="white-space:pre">				</span>printf "elem[%u].right: ", $i</div><div><span style="white-space:pre">				</span>p (*($arg3*)$value).$arg4</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 6</div><div><span style="white-space:pre">			</span>set $idx = $arg5</div><div><span style="white-space:pre">			</span>set $ElementsFound = 0</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>if *($arg1*)$value == $idx</div><div><span style="white-space:pre">					</span>printf "elem[%u].left: ", $i</div><div><span style="white-space:pre">					</span>p (*($arg1*)$value).$arg2</div><div><span style="white-space:pre">					</span>set $value = $value + sizeof($arg1)</div><div><span style="white-space:pre">					</span>printf "elem[%u].right: ", $i</div><div><span style="white-space:pre">					</span>p (*($arg3*)$value).$arg4</div><div><span style="white-space:pre">					</span>set $ElementsFound++</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>printf "Number of elements found = %u\n", $ElementsFound</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "Map size = %u\n", $tree_size</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pmap_member</div><div><span style="white-space:pre">	</span>Prints std::map&lt;TLeft and TRight&gt; or std::multimap&lt;TLeft and TRight&gt; information. Works for std::multimap as well.</div><div><span style="white-space:pre">	</span>Syntax: pmap &lt;map&gt; &lt;TtypeLeft&gt; &lt;TypeRight&gt; &lt;valLeft&gt; &lt;valRight&gt;: Prints map size, if T defined all elements or just element(s) with val(s)</div><div><span style="white-space:pre">	</span>Examples:</div><div><span style="white-space:pre">	</span>pmap_member m class1 member1 class2 member2 - prints class1.member1 : class2.member2</div><div><span style="white-space:pre">	</span>pmap_member m class1 member1 class2 member2 lvalue - prints class1.member1 : class2.member2 where class1 == lvalue</div><div>end</div><div></div><div></div><div>#</div><div># std::set and std::multiset</div><div>#</div><div></div><div>define pset</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pset</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $tree = $arg0</div><div><span style="white-space:pre">		</span>set $i = 0</div><div><span style="white-space:pre">		</span>set $node = $tree._M_t._M_impl._M_header._M_left</div><div><span style="white-space:pre">		</span>set $end = $tree._M_t._M_impl._M_header</div><div><span style="white-space:pre">		</span>set $tree_size = $tree._M_t._M_impl._M_node_count</div><div><span style="white-space:pre">		</span>if $argc == 1</div><div><span style="white-space:pre">			</span>printf "Set "</div><div><span style="white-space:pre">			</span>whatis $tree</div><div><span style="white-space:pre">			</span>printf "Use pset &lt;variable_name&gt; &lt;element_type&gt; to see the elements in the set.\n"</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 2</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>printf "elem[%u]: ", $i</div><div><span style="white-space:pre">				</span>p *($arg1*)$value</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>if $argc == 3</div><div><span style="white-space:pre">			</span>set $idx = $arg2</div><div><span style="white-space:pre">			</span>set $ElementsFound = 0</div><div><span style="white-space:pre">			</span>while $i &lt; $tree_size</div><div><span style="white-space:pre">				</span>set $value = (void *)($node + 1)</div><div><span style="white-space:pre">				</span>if *($arg1*)$value == $idx</div><div><span style="white-space:pre">					</span>printf "elem[%u]: ", $i</div><div><span style="white-space:pre">					</span>p *($arg1*)$value</div><div><span style="white-space:pre">					</span>set $ElementsFound++</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>if $node._M_right != 0</div><div><span style="white-space:pre">					</span>set $node = $node._M_right</div><div><span style="white-space:pre">					</span>while $node._M_left != 0</div><div><span style="white-space:pre">						</span>set $node = $node._M_left</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>else</div><div><span style="white-space:pre">					</span>set $tmp_node = $node._M_parent</div><div><span style="white-space:pre">					</span>while $node == $tmp_node._M_right</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">						</span>set $tmp_node = $tmp_node._M_parent</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">					</span>if $node._M_right != $tmp_node</div><div><span style="white-space:pre">						</span>set $node = $tmp_node</div><div><span style="white-space:pre">					</span>end</div><div><span style="white-space:pre">				</span>end</div><div><span style="white-space:pre">				</span>set $i++</div><div><span style="white-space:pre">			</span>end</div><div><span style="white-space:pre">			</span>printf "Number of elements found = %u\n", $ElementsFound</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "Set size = %u\n", $tree_size</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pset</div><div><span style="white-space:pre">	</span>Prints std::set&lt;T&gt; or std::multiset&lt;T&gt; information. Works for std::multiset as well.</div><div><span style="white-space:pre">	</span>Syntax: pset &lt;set&gt; &lt;T&gt; &lt;val&gt;: Prints set size, if T defined all elements or just element(s) having val</div><div><span style="white-space:pre">	</span>Examples:</div><div><span style="white-space:pre">	</span>pset s - prints set size and definition</div><div><span style="white-space:pre">	</span>pset s int - prints all elements and the size of s</div><div><span style="white-space:pre">	</span>pset s int 20 - prints the element(s) with value = 20 (if any) and the size of s</div><div>end</div><div></div><div></div><div></div><div>#</div><div># std::dequeue</div><div>#</div><div></div><div>define pdequeue</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pdequeue</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $size = 0</div><div><span style="white-space:pre">		</span>set $start_cur = $arg0._M_impl._M_start._M_cur</div><div><span style="white-space:pre">		</span>set $start_last = $arg0._M_impl._M_start._M_last</div><div><span style="white-space:pre">		</span>set $start_stop = $start_last</div><div><span style="white-space:pre">		</span>while $start_cur != $start_stop</div><div><span style="white-space:pre">			</span>p *$start_cur</div><div><span style="white-space:pre">			</span>set $start_cur++</div><div><span style="white-space:pre">			</span>set $size++</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>set $finish_first = $arg0._M_impl._M_finish._M_first</div><div><span style="white-space:pre">		</span>set $finish_cur = $arg0._M_impl._M_finish._M_cur</div><div><span style="white-space:pre">		</span>set $finish_last = $arg0._M_impl._M_finish._M_last</div><div><span style="white-space:pre">		</span>if $finish_cur &lt; $finish_last</div><div><span style="white-space:pre">			</span>set $finish_stop = $finish_cur</div><div><span style="white-space:pre">		</span>else</div><div><span style="white-space:pre">			</span>set $finish_stop = $finish_last</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>while $finish_first != $finish_stop</div><div><span style="white-space:pre">			</span>p *$finish_first</div><div><span style="white-space:pre">			</span>set $finish_first++</div><div><span style="white-space:pre">			</span>set $size++</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "Dequeue size = %u\n", $size</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pdequeue</div><div><span style="white-space:pre">	</span>Prints std::dequeue&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: pdequeue &lt;dequeue&gt;: Prints dequeue size, if T defined all elements</div><div><span style="white-space:pre">	</span>Deque elements are listed "left to right" (left-most stands for front and right-most stands for back)</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>pdequeue d - prints all elements and size of d</div><div>end</div><div></div><div></div><div></div><div>#</div><div># std::stack</div><div>#</div><div></div><div>define pstack</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pstack</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $start_cur = $arg0.c._M_impl._M_start._M_cur</div><div><span style="white-space:pre">		</span>set $finish_cur = $arg0.c._M_impl._M_finish._M_cur</div><div><span style="white-space:pre">		</span>set $size = $finish_cur - $start_cur</div><div>&nbsp; &nbsp; &nbsp; &nbsp; set $i = $size - 1</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while $i &gt;= 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p *($start_cur + $i)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set $i--</div><div>&nbsp; &nbsp; &nbsp; &nbsp; end</div><div><span style="white-space:pre">		</span>printf "Stack size = %u\n", $size</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pstack</div><div><span style="white-space:pre">	</span>Prints std::stack&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: pstack &lt;stack&gt;: Prints all elements and size of the stack</div><div><span style="white-space:pre">	</span>Stack elements are listed "top to buttom" (top-most element is the first to come on pop)</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>pstack s - prints all elements and the size of s</div><div>end</div><div></div><div></div><div></div><div>#</div><div># std::queue</div><div>#</div><div></div><div>define pqueue</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pqueue</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $start_cur = $arg0.c._M_impl._M_start._M_cur</div><div><span style="white-space:pre">		</span>set $finish_cur = $arg0.c._M_impl._M_finish._M_cur</div><div><span style="white-space:pre">		</span>set $size = $finish_cur - $start_cur</div><div>&nbsp; &nbsp; &nbsp; &nbsp; set $i = 0</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while $i &lt; $size</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p *($start_cur + $i)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set $i++</div><div>&nbsp; &nbsp; &nbsp; &nbsp; end</div><div><span style="white-space:pre">		</span>printf "Queue size = %u\n", $size</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pqueue</div><div><span style="white-space:pre">	</span>Prints std::queue&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: pqueue &lt;queue&gt;: Prints all elements and the size of the queue</div><div><span style="white-space:pre">	</span>Queue elements are listed "top to bottom" (top-most element is the first to come on pop)</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>pqueue q - prints all elements and the size of q</div><div>end</div><div></div><div></div><div></div><div>#</div><div># std::priority_queue</div><div>#</div><div></div><div>define ppqueue</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help ppqueue</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>set $size = $arg0.c._M_impl._M_finish - $arg0.c._M_impl._M_start</div><div><span style="white-space:pre">		</span>set $capacity = $arg0.c._M_impl._M_end_of_storage - $arg0.c._M_impl._M_start</div><div><span style="white-space:pre">		</span>set $i = $size - 1</div><div><span style="white-space:pre">		</span>while $i &gt;= 0</div><div><span style="white-space:pre">			</span>p *($arg0.c._M_impl._M_start + $i)</div><div><span style="white-space:pre">			</span>set $i--</div><div><span style="white-space:pre">		</span>end</div><div><span style="white-space:pre">		</span>printf "Priority queue size = %u\n", $size</div><div><span style="white-space:pre">		</span>printf "Priority queue capacity = %u\n", $capacity</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document ppqueue</div><div><span style="white-space:pre">	</span>Prints std::priority_queue&lt;T&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: ppqueue &lt;priority_queue&gt;: Prints all elements, size and capacity of the priority_queue</div><div><span style="white-space:pre">	</span>Priority_queue elements are listed "top to buttom" (top-most element is the first to come on pop)</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>ppqueue pq - prints all elements, size and capacity of pq</div><div>end</div><div></div><div></div><div></div><div>#</div><div># std::bitset</div><div>#</div><div></div><div>define pbitset</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pbitset</div><div><span style="white-space:pre">	</span>else</div><div>&nbsp; &nbsp; &nbsp; &nbsp; p /t $arg0._M_w</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pbitset</div><div><span style="white-space:pre">	</span>Prints std::bitset&lt;n&gt; information.</div><div><span style="white-space:pre">	</span>Syntax: pbitset &lt;bitset&gt;: Prints all bits in bitset</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>pbitset b - prints all bits in b</div><div>end</div><div></div><div></div><div></div><div>#</div><div># std::string</div><div>#</div><div></div><div>define pstring</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pstring</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>printf "String \t\t\t= \"%s\"\n", $arg0._M_dataplus._M_p</div><div><span style="white-space:pre">		</span>printf "String size/length \t= %u\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_length</div><div><span style="white-space:pre">		</span>printf "String capacity \t= %u\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_capacity</div><div><span style="white-space:pre">		</span>printf "String ref-count \t= %d\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_refcount</div><div>#printf "String \t\t\t= \"%s\"\n", $arg0._M_data()</div><div>#printf "String size/length \t= %u\n", $arg0._M_rep()._M_length</div><div>#printf "String capacity \t= %u\n", $arg0._M_rep()._M_capacity</div><div>#printf "String ref-count \t= %d\n", $arg0._M_rep()._M_refcount</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pstring</div><div><span style="white-space:pre">	</span>Prints std::string information.</div><div><span style="white-space:pre">	</span>Syntax: pstring &lt;string&gt;</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>pstring s - Prints content, size/length, capacity and ref-count of string s</div><div>end&nbsp;</div><div></div><div>#</div><div># std::wstring</div><div>#</div><div></div><div>define pwstring</div><div><span style="white-space:pre">	</span>if $argc == 0</div><div><span style="white-space:pre">		</span>help pwstring</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">		</span>call printf("WString \t\t= \"%ls\"\n", $arg0._M_data())</div><div><span style="white-space:pre">		</span>printf "WString size/length \t= %u\n", $arg0._M_rep()._M_length</div><div><span style="white-space:pre">		</span>printf "WString capacity \t= %u\n", $arg0._M_rep()._M_capacity</div><div><span style="white-space:pre">		</span>printf "WString ref-count \t= %d\n", $arg0._M_rep()._M_refcount</div><div><span style="white-space:pre">	</span>end</div><div>end</div><div></div><div>document pwstring</div><div><span style="white-space:pre">	</span>Prints std::wstring information.</div><div><span style="white-space:pre">	</span>Syntax: pwstring &lt;wstring&gt;</div><div><span style="white-space:pre">	</span>Example:</div><div><span style="white-space:pre">	</span>pwstring s - Prints content, size/length, capacity and ref-count of wstring s</div><div>end&nbsp;</div><div></div><div>#</div><div># C++ related beautifiers (optional)</div><div>#</div><div></div><div>set print pretty on</div><div>set print object on</div><div>set print static-members on</div><div>set print vtbl on</div><div>set print demangle on</div><div>set demangle-style gnu-v3</div><div>set print sevenbit-strings off</div><img src ="http://www.blogjava.net/bacoo/aggbug/390979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2012-11-07 17:51 <a href="http://www.blogjava.net/bacoo/archive/2012/11/07/390979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下高并发网络应用注意事项</title><link>http://www.blogjava.net/bacoo/archive/2012/06/11/380500.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Mon, 11 Jun 2012 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2012/06/11/380500.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/380500.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2012/06/11/380500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/380500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/380500.html</trackback:ping><description><![CDATA[<p>vi /etc/sysctl.conf，加入以下内容：<br />net.ipv4.tcp_tw_reuse=1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接，默认为0，表示关闭<br />net.ipv4.tcp_tw_recycle=1 #表示开启TCP连接中TIME-WAIT sockets的快速回收，默认为0，表示关闭<br />net.ipv4.tcp_fin_timeout=30 #修改系統默认的TIMEWAIT时间<br />net.ipv4.tcp_max_tw_buckets=3000 #限制TIMEWAIT的数量<br />net.ipv4.tcp_timestamps=1 #启用TCP的时间戳选项<br />net.ipv4.ip_local_port_range=1024 65000 #这表明将系统对本地端口范围限制设置为1024~65000之间。请注意，本地端口范围的最小值必须大于或等于1024；而端口范围的最大值则应小于或等 于65535<br />然后执行 /sbin/sysctl -p 让参数生效。</p>
<p>实验的结论：<br />1.主动连接情况下，TIME_WAIT对性能的影响很大<br />2.net.ipv4.tcp_tw_reuse和tcp_tw_recycle都设置为0时，在本地端口耗尽后负载会很高<br />3.net.ipv4.tcp_tw_reuse=1和net.ipv4.tcp_tw_recycle=1 配置生效的前提条件是：TCP连接的两端都要启用TCP的时间戳选项, net.ipv4.tcp_timestamps=1。<br />4.net.ipv4.tcp_tw_reuse设置为1后，会降低本地端口耗尽出现的概率，从而降低负载<br />5.net.ipv4.tcp_tw_recycle设置为1后，会加速TIME_WAIT的回收，从而显著降低系统中TIME_WAIT状态的socket数量<br />6.对于主动连接较多的服务器建议通过调整sysctl的net.ipv4.ip_local_port_range来增大本地端口范围，以进一步降低端口耗尽出现的概率</p>
<p>除此之外，对于高并发的网络应用，还应注意以下一些点：<br />1。ulimit -n #看一下一个进程可以打开的文件句柄数目，如果要修改系统默认的hard nofile阈值，需要按照以下步骤进行：<br />第一步，修改/etc/security/limits.conf文件，在文件中添加如下行：<br />admin soft nofile 10240<br />admin hard nofile 10240<br />其中admin指定了要修改哪个用户的打开文件数限制，可用'*'号表示修改所有用户的限制；soft或hard指定要修改软限制还是硬限制；10240 则指定了想要修改的新的限制值，即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。</p>
<p>第二步，修改/etc/pam.d/login文件，在文件中添加如下行：<br />session required /lib/security/pam_limits.so<br />这是告诉Linux在用户完成系统登录后，应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的 最大文件数限制)，而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完 后保存此文件。<br />2。cat /proc/sys/fs/file-max #这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)XXXX个文件，是Linux系统级硬限制，不够时将其调大<br />3。还有一种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在 connect()调用中阻塞，如同死机，如果用tcpdump工具监视网络，也会发现根本没有TCP连接时客户端发SYN包的网络流量。由于 IP_TABLE防火墙在内核中会对每个TCP连接的状态进行跟踪，跟踪信息将会放在位于内核内存中的conntrackdatabase中，这个数据库 的大小有限，当系统中存在过多的TCP连接时，数据库容量不足，IP_TABLE无法为新的TCP连接建立跟踪信息，于是表现为在connect()调用 中阻塞。此时就必须修改内核对最大跟踪的TCP连接数的限制，方法同修改内核对本地端口号范围的限制是类似的：在/etc/sysctl.conf中添加net.ipv4.ip_conntrack_max=10240</p>
<p>参考文章：<br /><a href="http://hi.baidu.com/zzxap/blog/item/ab3f2aedbe6c3b5978f05587.html">http://hi.baidu.com/zzxap/blog/item/ab3f2aedbe6c3b5978f05587.html</a>《Linux下突破限制实现高并发量服务器》<br /><a href="http://kerry.blog.51cto.com/172631/105233/">http://kerry.blog.51cto.com/172631/105233/</a>《发现大量的TIME_WAIT解决办法》<br /><a href="http://wenku.baidu.com/view/dd18767c1711cc7931b71616.html">http://wenku.baidu.com/view/dd18767c1711cc7931b71616.html</a>《操作系统性能优化&lt;1&gt; Linux下TIME_WAIT对系统性能的影响》<br /><a href="http://blog.csdn.net/kasagawa/article/details/6978890">http://blog.csdn.net/kasagawa/article/details/6978890</a>《TCP协议学习笔记》<br /><br />今天又遇到了CLOSE_WAIT的情况，google了一番，又对TIME_WAIT和CLOSE_WAIT的理解深了一层，参考的几篇文章如下：<br /><a href="http://www.360doc.com/content/10/0414/16/1484_23029426.shtml">http://www.360doc.com/content/10/0414/16/1484_23029426.shtml</a><br /><a href="http://pengtyao.iteye.com/blog/829513">http://pengtyao.iteye.com/blog/829513</a><br /><a href="http://shootyou.iteye.com/blog/1129507">http://shootyou.iteye.com/blog/1129507</a><br /><a href="http://blog.csdn.net/shootyou/article/details/6615051">http://blog.csdn.net/shootyou/article/details/6615051</a><br /><a href="http://hi.baidu.com/tantea/blog/item/580b9d0218f981793812bb7b.html">http://hi.baidu.com/tantea/blog/item/580b9d0218f981793812bb7b.html</a><br />大致说一下我的一些新的理解：<br />TCP建立连接需要3次握手（就是发3个包），而终止连接需要发4个包（两次FIN，两次ACK），在终止的时候，调用close会触发发送FIN包，通常我们说客户端和服务器，但这都是相对而言的，更准确的说法是&#8220;主动关闭方&#8221;和&#8220;被动关闭方&#8221;，主动关闭方会出现TIME_WAIT（出现在对方也调用了close之后，在对方调用close之前是FIN_WAIT2状态），被动关闭方会出现CLOSE_WAIT（出现在收到对方关闭请求但自己又没有调用close之前）；主动关闭方的TIME_WAIT的等待是正常的，tcp/ip协议就是这么设计的，可以通过调整机器的内核参数来控制，被动关闭方的CLOSE_WAIT的等待是应用程序自己造成的，和系统没有关系，通常是被动关闭方没有调用close导致的；TIME_WAIT出现后，需要等待2个MSL时间才会释放socket，CLOSE_WAIT出现后需要等待一个keepalive的时间，关于keepalive的控制主要有3个参数：net.ipv4.tcp_keepalive_intvl(每次探测间隔)、net.ipv4.tcp_keepalive_probes(探测次数)、net.ipv4.tcp_keepalive_time(TCP链路上空闲多长时间开始发送keep_alive)，tcp_keepalive_time默认为2小时，因此CLOSE_WAIT后最多有可能需要等待tcp_keepalive_time + tcp_keepalive_intvl * tcp_keepalive_probes；此外，不论是主动方还是被动方，只要程序退出（因为程序退出会关闭所有打开的fd），则相当于调用了close函数，那么对于被动方而言CLOSE_WAIT都会消失，对于主动方而言，退出前保持的FIN_WAIT2或TIME_WAIT状态继续保留；如果双方都主动退出程序，那么谁先退出就相当于是优先调用了close的主动方。<br /><br /><a href="https://www.byvoid.com/blog/http-keep-alive-header">https://www.byvoid.com/blog/http-keep-alive-header<br /></a></p><div>http://www.jellythink.com/archives/705</div><div>http://www.jellythink.com/archives/705</div><img src ="http://www.blogjava.net/bacoo/aggbug/380500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2012-06-11 15:35 <a href="http://www.blogjava.net/bacoo/archive/2012/06/11/380500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在函数中定义static变量时需要注意的问题</title><link>http://www.blogjava.net/bacoo/archive/2012/06/07/380208.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 07 Jun 2012 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2012/06/07/380208.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/380208.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2012/06/07/380208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/380208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/380208.html</trackback:ping><description><![CDATA[<p>对于在头文件中定义（不能只声明）static的函数 或者 static的类成员函数，需要注意的是，如果这个头文件被不同的cpp包含，各自编译出.o文件，那么*有可能*最后链接出来的可执行文件种，会存在该static函数的多个副本，有三种情况会导致这样的事情发生，而如果你在这种函数里面放置了static变量，那就悲催了，因为这个static对象会被搞出多个来（不再如你所愿，全局唯一了）：<br />1。头文件中定义了static函数；<br />2。头文件中定义了匿名namespace下的函数；<br />3。头文件中定义了匿名namespace下的类成员函数；</p>
<p>所以，法门就是：不要在匿名的namespace下定义类，对于函数而言，用static声明和放在匿名的namespace下是等同的。<br /><br />对于在函数内部声明的static变量，编译器默认是会使得这样的static变量在初始化时是线程安全的，控制它的选项是-fno-threadsafe-statics</p><img src ="http://www.blogjava.net/bacoo/aggbug/380208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2012-06-07 11:55 <a href="http://www.blogjava.net/bacoo/archive/2012/06/07/380208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket编程：SO_REUSEADDR例解</title><link>http://www.blogjava.net/bacoo/archive/2012/04/26/376678.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Thu, 26 Apr 2012 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2012/04/26/376678.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/376678.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2012/04/26/376678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/376678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/376678.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自：http://www.cppblog.com/ace/archive/2006/04/29/6446.htmlsocket编程：SO_REUSEADDR例解 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/bacoo/archive/2012/04/26/376678.html'>阅读全文</a><img src ="http://www.blogjava.net/bacoo/aggbug/376678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2012-04-26 14:38 <a href="http://www.blogjava.net/bacoo/archive/2012/04/26/376678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用boost的preprocessor</title><link>http://www.blogjava.net/bacoo/archive/2011/11/26/364880.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Sat, 26 Nov 2011 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2011/11/26/364880.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/364880.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2011/11/26/364880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/364880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/364880.html</trackback:ping><description><![CDATA[在线文档：http://www.boost.org/doc/libs/1_48_0/libs/preprocessor/doc/index.html<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; http://www.boost.org/doc/libs/1_48_0/libs/preprocessor/doc/topics/techniques.html <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.boost.org/doc/libs/1_48_0/libs/preprocessor/doc/ref.html<br />几篇不错的博文：http://blog.csdn.net/zx77/article/details/2270991<br />一个关于2D的repeat的实现 ：<br />/* Copyright (C) 2002<br />&nbsp;* Housemarque Oy<br />&nbsp;* http://www.housemarque.com<br />&nbsp;*<br />&nbsp;* Permission to copy, use, modify, sell and distribute this software is<br />&nbsp;* granted provided this copyright notice appears in all copies. This<br />&nbsp;* software is provided "as is" without express or implied warranty, and<br />&nbsp;* with no claim as to its suitability for any purpose.<br />&nbsp;*<br />&nbsp;* See http://www.boost.org for most recent version.<br />&nbsp;*/<br /><br />/* This example implements a generalized macro for 2D repetition using<br />&nbsp;* the simple repetition primitives of the preprocessor library.<br />&nbsp;*/<br /><br />#include "preprocessor/repeat.hpp"<br />#include "preprocessor/logical/or.hpp"<br />#include "preprocessor/comma_if.hpp"<br />#include "preprocessor/list/cat.hpp"<br />#include "preprocessor/tuple/elem.hpp"<br />#include "preprocessor/tuple/to_list.hpp"<br /><br />/** &lt;p&gt;Repeats the macro &lt;code&gt;M(X,Y,DATA)&lt;/code&gt; for &lt;code&gt;X = [0,W)&lt;/code&gt; and &lt;code&gt;Y = [0,H)&lt;/code&gt;.&lt;/p&gt;<br /><br />&lt;p&gt;In other words, expands to the sequence:&lt;/p&gt;<br /><br />&lt;pre&gt;<br />M(&nbsp; 0,&nbsp; 0,&nbsp; DATA) M(&nbsp; 1,&nbsp; 0,&nbsp; DATA) ... M(W-1,&nbsp; 0,&nbsp; DATA)<br />M(&nbsp; 0,&nbsp; 1,&nbsp; DATA) M(&nbsp; 1,&nbsp; 1,&nbsp; DATA) ... M(W-1,&nbsp; 1,&nbsp; DATA)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />M(&nbsp; 0,H-1,&nbsp; DATA) M(&nbsp; 1,H-1,&nbsp; DATA) ... M(W-1,H-1,&nbsp; DATA)<br />&lt;/pre&gt;<br />*/<br />#define REPEAT_2D(W,H,M,DATA)\<br />&nbsp; /* Here we can simply use BOOST_PP_REPEAT(), because\<br />&nbsp;&nbsp; * it implements automatic recursion.\<br />&nbsp;&nbsp; */\<br />&nbsp; BOOST_PP_REPEAT\<br />&nbsp; ( H\<br />&nbsp; , REPEAT_2D_ROW\<br />&nbsp; , (W,M,DATA)\<br />&nbsp; )<br />#define REPEAT_2D_ROW(z,Y,WMD)\<br />&nbsp; BOOST_PP_REPEAT\<br />&nbsp; ( BOOST_PP_TUPLE_ELEM(3,0,WMD)\<br />&nbsp; , REPEAT_2D_ELEM\<br />&nbsp; , (Y, BOOST_PP_TUPLE_ELEM(3,1,WMD), BOOST_PP_TUPLE_ELEM(3,2,WMD))\<br />&nbsp; )<br />#define REPEAT_2D_ELEM(z,X,YMD)\<br />&nbsp; BOOST_PP_TUPLE_ELEM(3,1,YMD)\<br />&nbsp; ( X\<br />&nbsp; , BOOST_PP_TUPLE_ELEM(3,0,YMD)\<br />&nbsp; , BOOST_PP_TUPLE_ELEM(3,2,YMD)\<br />&nbsp; )<br /><br />/* Here we use the above macro to generate something. */<br />#define ELEM(X,Y,E) BOOST_PP_COMMA_IF(BOOST_PP_OR(X,Y)) BOOST_PP_LIST_CAT(BOOST_PP_TUPLE_TO_LIST(5,(E,_,X,_,Y)))<br />enum { REPEAT_2D(3,4,ELEM,elem) };<br /><br />/* The above expands to:<br />&nbsp;*<br />&nbsp;* enum { elem_0_0, elem_1_0, elem_2_0,<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elem_0_1, elem_1_1, elem_2_1,<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elem_0_2, elem_1_2, elem_2_2,<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elem_0_3, elem_1_3, elem_2_3 };<br />&nbsp;*/<img src ="http://www.blogjava.net/bacoo/aggbug/364880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2011-11-26 14:10 <a href="http://www.blogjava.net/bacoo/archive/2011/11/26/364880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++内存对象布局</title><link>http://www.blogjava.net/bacoo/archive/2011/04/24/348912.html</link><dc:creator>so true</dc:creator><author>so true</author><pubDate>Sun, 24 Apr 2011 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/bacoo/archive/2011/04/24/348912.html</guid><wfw:comment>http://www.blogjava.net/bacoo/comments/348912.html</wfw:comment><comments>http://www.blogjava.net/bacoo/archive/2011/04/24/348912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bacoo/comments/commentRss/348912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bacoo/services/trackbacks/348912.html</trackback:ping><description><![CDATA[收藏陈皓的几篇博文：<br />
http://haoel.blog.51cto.com/313033/124567<br />
http://haoel.blog.51cto.com/313033/124561<br />
http://haoel.blog.51cto.com/313033/124595<br />
<br />
看完上面的文章，应该可以回答一个问题：指针被强制类型转化之后，指针的值会改变吗？<br />
答案：有时候是会的。haoel把继承分为5类，我再把它们作个标记：<br />
没有虚继承：单一继承（1）， 非重复多重继承（2）， 重复多重继承（3）；<br />
有虚继承：单一继承（4），重复多重继承（5）。<br />
我先区别两个概念&#8220;类的内存布局（由此可以计算出类的大小）&#8221;和&#8220;类本身的内存布局（由此可以计算出类本身的大小）&#8221;：<br />
sizeof（类）＝ sizeof（类本身） ＋　sizeof（所有父类）。<br />
而类本身的内存布局由两部分构成：vptr ＋ 成员变量， 整个类的内存布局是把类本身和所有父类的内存布局拼接在一起的，注意：对于类型（1），整个类只有一个vptr，因此父类的内存布局只有成员变量了。<br />
<br />
拼接的规则是：先父类后子类，但特例是虚拟继承，在虚拟继承时，会变成&#8220;先子类后父类&#8221;，因为虚拟继承的目的是：认为父类有common的东西，大家共享之。<br />
<br />
因此，vptr不一定只能出现在类内存布局的始端，准确的说： 应该是出现在各个类本身的内存布局的始端。<br />
当发生类型转化时，比如要从Derived*转化到Base*，转化后的结果会是指向&#8220;Base这个父类自身的内存布局的始端&#8221;，一旦这个始端和&#8220;Derived类的内存布局始端&#8220;不一致，那么<br />
就发生了指针类型转化后指针值的改变。<br />
下面是一个例子：<br />
#include &lt;iostream&gt;<br />
#include &lt;string&gt;<br />
#include &lt;vector&gt;<br />
#include &lt;map&gt;<br />
#include &lt;set&gt;<br />
<br />
using namespace std;<br />
<br />
class A {<br />
public:<br />
&nbsp;&nbsp;&nbsp; virtual ~A() {};<br />
&nbsp;&nbsp;&nbsp; int iA;<br />
};<br />
<br />
class A1 {<br />
public:<br />
&nbsp;&nbsp;&nbsp; virtual ~A1() {};<br />
&nbsp;&nbsp;&nbsp; int iA1;<br />
};<br />
<br />
class B: public A {<br />
public:<br />
&nbsp;&nbsp;&nbsp; virtual ~B() {};<br />
&nbsp;&nbsp;&nbsp; int iB;<br />
};<br />
<br />
class C: virtual public A {<br />
public:<br />
&nbsp;&nbsp;&nbsp; virtual ~C() {};<br />
&nbsp;&nbsp;&nbsp; int iC;<br />
};<br />
<br />
class D: public A, public A1 {<br />
public:<br />
&nbsp;&nbsp;&nbsp; virtual ~D() {};<br />
&nbsp;&nbsp;&nbsp; int iD;<br />
};<br />
<br />
int main(int argc, char* argv[]) {<br />
&nbsp;&nbsp;&nbsp; A* pa = new B();<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "B size:" &lt;&lt; sizeof(B) &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A addr:" &lt;&lt; pa &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "B addr ():" &lt;&lt; (B*)pa &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "B addr dynamic_cast:" &lt;&lt; dynamic_cast&lt;B*&gt;(pa) &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------------------" &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp; A* pa2 = new C();<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "C size:" &lt;&lt; sizeof(C) &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A addr:" &lt;&lt; pa2 &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; //cout &lt;&lt; "C addr ():" &lt;&lt; (C*)pa2 &lt;&lt; endl; //compile error<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "C addr dynamic_cast:" &lt;&lt; dynamic_cast&lt;C*&gt;(pa2) &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------------------" &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp; C* pc = dynamic_cast&lt;C*&gt;(pa2);<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "C addr dynamic_cast:" &lt;&lt; pc &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A addr ():" &lt;&lt; (A*)pc &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A addr dynamic_cast:" &lt;&lt; dynamic_cast&lt;A*&gt;(pc) &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------------------" &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp; D* pd = new D();<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "D size:" &lt;&lt; sizeof(D) &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "D addr:" &lt;&lt; pd &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A addr ():" &lt;&lt; (A*)pd &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A addr dynamic_cast:" &lt;&lt; dynamic_cast&lt;A*&gt;(pd) &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A1 addr dynamic_cast:" &lt;&lt; dynamic_cast&lt;A1*&gt;(pd) &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
结果：<br />
B size:16<br />
A addr:0x8a96010<br />
B addr ():0x8a96010<br />
B addr dynamic_cast:0x8a96010<br />
-------------------------------<br />
C size:32<br />
A addr:0x8a96040<br />
C addr dynamic_cast:0x8a96030<br />
-------------------------------<br />
C addr dynamic_cast:0x8a96030<br />
A addr ():0x8a96040<br />
A addr dynamic_cast:0x8a96040<br />
-------------------------------<br />
D size:32<br />
D addr:0x8a96060<br />
A addr ():0x8a96060<br />
A addr dynamic_cast:0x8a96060<br />
A1 addr dynamic_cast:0x8a96070<br />
<br />
下面还有篇对haoel的介绍，也一并收藏了：<br />
http://news.csdn.net/n/20070706/106194.html<br />
<br />
<img src ="http://www.blogjava.net/bacoo/aggbug/348912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bacoo/" target="_blank">so true</a> 2011-04-24 12:52 <a href="http://www.blogjava.net/bacoo/archive/2011/04/24/348912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>