??xml version="1.0" encoding="utf-8" standalone="yes"?>在线日韩视频,国产午夜精品久久久,亚洲欧美在线一区http://www.shnenglu.com/flyinghearts/category/14248.htmlzh-cnSun, 15 Jun 2014 08:04:46 GMTSun, 15 Jun 2014 08:04:46 GMT60SEH异常处理专利到期?/title><link>http://www.shnenglu.com/flyinghearts/archive/2014/06/15/207288.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Jun 2014 02:55:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2014/06/15/207288.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/207288.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2014/06/15/207288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/207288.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/207288.html</trackback:ping><description><![CDATA[<div>  <br />  Borland的那个恶心的SEH异常处理专利QNo:5,628,016  Filed: June, 15, 1997Q,l于到期了。希望GCC/CLANG能快点完成win32的C++异常的SEH实现Q下一版本的GCCQ能让用户不再纠lSJLJQDwarf2的选择?br /><br /></div><img src ="http://www.shnenglu.com/flyinghearts/aggbug/207288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2014-06-15 10:55 <a href="http://www.shnenglu.com/flyinghearts/archive/2014/06/15/207288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mingw gcc的头文g存在l构定义错误Q!http://www.shnenglu.com/flyinghearts/archive/2013/03/21/198694.htmlflyingheartsflyingheartsThu, 21 Mar 2013 13:51:00 GMThttp://www.shnenglu.com/flyinghearts/archive/2013/03/21/198694.htmlhttp://www.shnenglu.com/flyinghearts/comments/198694.htmlhttp://www.shnenglu.com/flyinghearts/archive/2013/03/21/198694.html#Feedback0http://www.shnenglu.com/flyinghearts/comments/commentRss/198694.htmlhttp://www.shnenglu.com/flyinghearts/services/trackbacks/198694.html准确的讲是mingw所用的sdk ——  w32apiQ存在结构定义错误?br /> 
 打开wingdi.h 定位?tagGCP_RESULTSW 的结构定义位|,
 
  typedef struct tagGCP_RESULTSW {
    DWORD lStructSize;
    LPWSTR lpOutString;
    UINT *lpOrder;
    int *lpDx;
    int *lpCaretPos;
    LPWSTR lpClass;         //正确的类型应该是 LPSTR
    LPWSTR lpGlyphs;
    UINT nGlyphs;
    int nMaxFit;
  } GCP_RESULTSW,*LPGCP_RESULTSW;

 Ҏmsdn, lpClass的类型应该是 LPSTRQ?w32api却将其声明ؓ LPWSTR?br /> 
  q个bugQ在2011q就有h报告了,据说cvs版本也修正了Q但是直到现在,官方下蝲q是2011q发布的那个有bug的版本(w32api-3.17-2-mingw32-dev.tar.lzmaQ?br /> 
  另外Qmingw-w64Q支持生?2位?4位程序)不存在这个问题?

 



flyinghearts 2013-03-21 21:51 发表评论
]]>
c++11 最反直觉的地方http://www.shnenglu.com/flyinghearts/archive/2012/11/22/195570.htmlflyingheartsflyingheartsThu, 22 Nov 2012 11:49:00 GMThttp://www.shnenglu.com/flyinghearts/archive/2012/11/22/195570.htmlhttp://www.shnenglu.com/flyinghearts/comments/195570.htmlhttp://www.shnenglu.com/flyinghearts/archive/2012/11/22/195570.html#Feedback4http://www.shnenglu.com/flyinghearts/comments/commentRss/195570.htmlhttp://www.shnenglu.com/flyinghearts/services/trackbacks/195570.html
1 auto 会自动把 引用 去除?br /> 
  int& get();
  auto k = get();     // k的类型是intQ而不是int&
 
  Derived object;
  auto&    same_object = (Base&)object;      
  auto  another_object = (Base&)object;  //会重新构造个Base对象  
 
    
2 decltype 有时会自动把 引用 加上

  int x;
  decltype((x)) ?decltype(*&x) 的类型是int&Q而不是int
 
  在宏中用decltypeӞ要特别注意别多加了括受?br /> 
  下面q段代码错在哪里Q?br />    template<typename T, typename R>
    auto min(T t, R r) -> decltype(t < r ? t : r)
    {
      return (t < r ? t : r);
    }
    
  decltype(t < r ? t : r)的类型是T&或R&Q而不是所希望的T或RQ?br /> 
 
  标准是这栯定的Q?br />
The type denoted by decltype(e) is defined as follows:
  — if e is an unparenthesized id-expression or an unparenthesized class member
     access (5.2.5), decltype(e) is the type of the entity named by e. If there
     is no such entity, or if e names a set of overloaded functions, the program
     is ill-formed;
  — otherwise, if e is an xvalue, decltype(e) is T&&, where T is the type of e;
  — otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;
  — otherwise, decltype(e) is the type of e.
 

3 std::move、std::forward、右值引?br /> 
  C++11 引入 叛_引用,可以做到Q函数{发、针对时对象优?br />  move是动词,从字面上理解好像是要Ud对象Q其实std::move只是单的类型{成右值引用而已Q!Q?可以理解?cast_to_rvalue_reference ?treat_as_temporal_object?br /> 

  void test1(int&&) {}
 
  void test2(int&& value)  //注意Qvalue的类型是intQ而不是int&&
  {
     test1(value);    //无法~译通过Q因为value的类型是intQ?必须转换cd
     test1(static_cast<int&&>(value));      //或?br />     test1(std::forward<int>(value));
  }
 
  test2函数中,value的类型是intQ而不是int&&?br />  q是一个不得已的选择。如果value的类型是int&&的话Q就会有副作用:
 
  void increase(int& value) { ++value; }
  void test3(int&& value) { increase(value); }
 
  char ch = 'a';
  test3(ch);  //本意是改变ch|但实际上chg会改变,改变的是临时对像
  通过转发函数test3Qincrease函数可以修改临时对像Q?br />  q造成E序员犯的错误(如上面的例子Q,难以在编译时p扑և来?br /> 
 
  std::forward<T>(value) {h?static_cast<T&&>(value)Q感觉后者更Ҏ理解?br />  std::forward 起到的{发作用。如果Tcd?R&?R&&Q经q类型{换后Q其cdq是和原来的一栗?br />  在C++11?
    R&  &   {同?R&   Q在c++03中,R& &q种写法是非法的Q?br />    R&& &   {同?R&
    R&  &&  {同?R&
    R&& &&  {同?R&&
 

flyinghearts 2012-11-22 19:49 发表评论
]]>
decltype的小“陷阱?/title><link>http://www.shnenglu.com/flyinghearts/archive/2012/08/14/187204.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 14 Aug 2012 13:19:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2012/08/14/187204.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/187204.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2012/08/14/187204.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/187204.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/187204.html</trackback:ping><description><![CDATA[int x;<br /><div>decltype(x) ?nbsp; decltype((x))    的类型是不一L?/div><div>decltype(x) ?nbsp; decltype(*&x)   的类型是不一L?br /><div></div><br /><div>decltype(x)的类型是 int<br />decltype((x)) ?decltype(*&x)  的类型是 int&<br /><div><br />C++11标准Q?/div></div></div><div>The type denoted by decltype(e) is defined as follows:<br />  — if e is an unparenthesized id-expression or an unparenthesized class member<br />     access (5.2.5), decltype(e) is the type of the entity named by e. If there<br />     is no such entity, or if e names a set of overloaded functions, the program<br />     is ill-formed;<br />  — otherwise, if e is an xvalue, decltype(e) is T&&, where T is the type of e;<br />  — otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;<br />  — otherwise, decltype(e) is the type of e.</div><img src ="http://www.shnenglu.com/flyinghearts/aggbug/187204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2012-08-14 21:19 <a href="http://www.shnenglu.com/flyinghearts/archive/2012/08/14/187204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内嵌汇编实现的函数{?/title><link>http://www.shnenglu.com/flyinghearts/archive/2012/08/05/186382.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 05 Aug 2012 13:02:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2012/08/05/186382.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/186382.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2012/08/05/186382.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/186382.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/186382.html</trackback:ping><description><![CDATA[  弄着玩的。功能是单的实现函数转发Q即<br />      调用CALL(func)Q{用func()Q?div>      调用CALL(func, arg1, arg2) Q{用func(arg1, arg2)</div><br /><div>  代码中,宏CALL/STDCALL分别用来调用  __cdecl/__stdcall 调用规定的函?br />             unsafe_call 两者都可调用,但它不是多线E安全的?br /><br />  代码只支持x86 32位, 除内嵌汇~部分,量W合C++11标准?br />       </div>原理Q?br />     刚进入函数时Q?br />     [esp]           函数q回地址<br />     [esp + 4]     W一个参敎ͼ卌{发函数的地址<br /><div>     [esp + 8]     W二个参敎ͼ卌{发函数的的第一个参?/div>     ...  <br />    <br />      只要写三行汇~指令实C个c_call函数Q就可调用{发函?br /><div>      pop eax                             ; eax为函数返回地址<br />      xchg dword ptr[esp], eax     ; eax{发函数的地址Q[esp]为函数返回地址<br />      jmp eax<br />      <br /><div>     当{发函数是__cdeclQ即转发函数不会调节栈,׃在c_callQpop eaxQesp多加?Q因而在调用完c_call后应该手动将esp值减4Q保证栈q?br />    <div>    当{发函数是__stdcallQ{发函C调节栈,调用转发函数完毕后,栈已l保持^衡,因而调用c_call完毕Q不应该q行栈指针调节。似乎将c_call的调用改为__stdcall卛_Q但实际上c_call有变长参敎ͼҎ__stdcall没效果,每次调用~译器还是会自动生成调节栈指针代码。因而只能每ơ调用完毕,~译器给esp加了多少Q就手动减多。(~译器不一定会生成 call  xxxx; add esp, xxq样的代码,通过改函数返回地址Q忽略后面的add esp, xx指o是很p糕的做法。)</div></div> </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"><img id="Code_Closed_Image_202018" onclick="this.style.display='none'; Code_Closed_Text_202018.style.display='none'; Code_Open_Image_202018.style.display='inline'; Code_Open_Text_202018.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_202018" style="display: none" onclick="this.style.display='none'; Code_Open_Text_202018.style.display='none'; Code_Closed_Image_202018.style.display='inline'; Code_Closed_Text_202018.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_202018" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">call_redirect</span><span id="Code_Open_Text_202018" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">  1</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">  2</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">cstdarg</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">  3</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">  4</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">  5</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> CALL(<img src="http://www.shnenglu.com/Images/dot.gif" alt="" />)    c_call(__VA_ARGS__); ASM_SUB_ESP(4);</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">  6</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> STDCALL(<img src="http://www.shnenglu.com/Images/dot.gif" alt="" />) c_call(__VA_ARGS__); ASM_SUB_ESP(MACRO_ARGS(__VA_ARGS__) * 4);</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">  7</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">  8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> MACRO_EXPAND(x) x</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">  9</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> MACRO_NTH_ARG(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />) a9</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 10</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> MACRO_ARGS(<img src="http://www.shnenglu.com/Images/dot.gif" alt="" />) \</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 11</span> <span style="color: #000000; ">    MACRO_EXPAND(MACRO_NTH_ARG(__VA_ARGS__, </span><span style="color: #000000; ">9</span><span style="color: #000000; ">, </span><span style="color: #000000; ">8</span><span style="color: #000000; ">, </span><span style="color: #000000; ">7</span><span style="color: #000000; ">, </span><span style="color: #000000; ">6</span><span style="color: #000000; ">, </span><span style="color: #000000; ">5</span><span style="color: #000000; ">, </span><span style="color: #000000; ">4</span><span style="color: #000000; ">, </span><span style="color: #000000; ">3</span><span style="color: #000000; ">, </span><span style="color: #000000; ">2</span><span style="color: #000000; ">, </span><span style="color: #000000; ">1</span><span style="color: #000000; ">, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; "> 12</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 13</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">  __GNUC__</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 14</span> <span style="color: #000000; ">  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> please enable option, -masm=intel</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 15</span> <span style="color: #008000; "></span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> ASM_SUB_ESP(x) asm("lea esp, dword ptr[esp - %0]" : : "i"(x))</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 16</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 17</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> c_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; "> pfn, <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />) asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">c_call</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; "> 18</span> <span style="color: #000000; ">  asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">                          \n\</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 19</span> <span style="color: #000000; "></span><span style="color: #000000; ">    c_call:                      \n\<br /></span><span style="color: #008080; "> 20</span> <span style="color: #000000; ">      pop eax;                   \n\<br /></span><span style="color: #008080; "> 21</span> <span style="color: #000000; ">      xchg dword ptr[esp], eax;  \n\<br /></span><span style="color: #008080; "> 22</span> <span style="color: #000000; ">      jmp eax;                   \n\<br /></span><span style="color: #008080; "> 23</span> <span style="color: #000000; ">  </span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 24</span> <span style="color: #000000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 25</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> unsafe_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; "> pfn, <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />)  asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unsafe_call</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; "> 26</span> <span style="color: #000000; ">  asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">                                   \n\</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 27</span> <span style="color: #000000; "></span><span style="color: #000000; ">      .lcomm old_ret_addr, </span><span style="color: #000000; ">4</span><span style="color: #000000; ">              \n\<br /></span><span style="color: #008080; "> 28</span> <span style="color: #000000; ">      .lcomm old_esp_value,</span><span style="color: #000000; ">4</span><span style="color: #000000; ">              \n\<br /></span><span style="color: #008080; "> 29</span> <span style="color: #000000; ">    unsafe_call:                          \n\<br /></span><span style="color: #008080; "> 30</span> <span style="color: #000000; ">      pop  dword ptr old_ret_addr;        \n\<br /></span><span style="color: #008080; "> 31</span> <span style="color: #000000; ">      mov  dword ptr old_esp_value, esp;  \n\<br /></span><span style="color: #008080; "> 32</span> <span style="color: #000000; ">      mov eax, dword ptr[esp];            \n\<br /></span><span style="color: #008080; "> 33</span> <span style="color: #000000; ">      mov dword ptr[esp], offset last;    \n\<br /></span><span style="color: #008080; "> 34</span> <span style="color: #000000; ">      jmp eax;                            \n\<br /></span><span style="color: #008080; "> 35</span> <span style="color: #000000; ">    last:                                 \n\<br /></span><span style="color: #008080; "> 36</span> <span style="color: #000000; ">      mov esp, dword ptr old_esp_value;   \n\<br /></span><span style="color: #008080; "> 37</span> <span style="color: #000000; ">      jmp  dword ptr old_ret_addr;        \n\<br /></span><span style="color: #008080; "> 38</span> <span style="color: #000000; ">  </span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 39</span> <span style="color: #000000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 40</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#elif</span><span style="color: #000000; ">  _MSC_VER</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 41</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> ASM_SUB_ESP(x) __asm lea esp, dword ptr [esp - x]</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 42</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 43</span> <span style="color: #000000; ">  __declspec(naked) </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> c_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; "> pfn, <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />)<br /></span><span style="color: #008080; "> 44</span> <span style="color: #000000; ">  {<br /></span><span style="color: #008080; "> 45</span> <span style="color: #000000; ">    __asm {<br /></span><span style="color: #008080; "> 46</span> <span style="color: #000000; ">      pop eax;<br /></span><span style="color: #008080; "> 47</span> <span style="color: #000000; ">      xchg dword ptr[esp], eax;<br /></span><span style="color: #008080; "> 48</span> <span style="color: #000000; ">      jmp eax;<br /></span><span style="color: #008080; "> 49</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; "> 50</span> <span style="color: #000000; ">  }<br /></span><span style="color: #008080; "> 51</span> <span style="color: #000000; ">  __declspec(naked) </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> unsafe_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; "> pfn, <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />)<br /></span><span style="color: #008080; "> 52</span> <span style="color: #000000; ">  {<br /></span><span style="color: #008080; "> 53</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; "> old_ret_addr;<br /></span><span style="color: #008080; "> 54</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; "> old_esp_value;<br /></span><span style="color: #008080; "> 55</span> <span style="color: #000000; ">    __asm {<br /></span><span style="color: #008080; "> 56</span> <span style="color: #000000; ">      pop  old_ret_addr;<br /></span><span style="color: #008080; "> 57</span> <span style="color: #000000; ">      mov  old_esp_value, esp;<br /></span><span style="color: #008080; "> 58</span> <span style="color: #000000; ">      mov eax, dword ptr[esp];<br /></span><span style="color: #008080; "> 59</span> <span style="color: #000000; ">      mov dword ptr[esp], offset last;<br /></span><span style="color: #008080; "> 60</span> <span style="color: #000000; ">      jmp eax;<br /></span><span style="color: #008080; "> 61</span> <span style="color: #000000; ">    last:<br /></span><span style="color: #008080; "> 62</span> <span style="color: #000000; ">      mov esp, old_esp_value;<br /></span><span style="color: #008080; "> 63</span> <span style="color: #000000; ">      jmp  old_ret_addr;<br /></span><span style="color: #008080; "> 64</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; "> 65</span> <span style="color: #000000; ">  }<br /></span><span style="color: #008080; "> 66</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 67</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 68</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">#error</span><span style="color: #000000; "> "only gcc and msvc are supported"</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 69</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 70</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 71</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 72</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> show(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; "> format, <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />)<br /></span><span style="color: #008080; "> 73</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 74</span> <span style="color: #000000; ">  va_list args;<br /></span><span style="color: #008080; "> 75</span> <span style="color: #000000; ">  va_start(args, format);<br /></span><span style="color: #008080; "> 76</span> <span style="color: #000000; ">  vprintf(format, args);<br /></span><span style="color: #008080; "> 77</span> <span style="color: #000000; ">  va_end (args);<br /></span><span style="color: #008080; "> 78</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; "> 79</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 80</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> mysleep() { Sleep(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">); }<br /></span><span style="color: #008080; "> 81</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 82</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> test1()<br /></span><span style="color: #008080; "> 83</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 84</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> a </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">5</span><span style="color: #000000; ">, b </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">6</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 85</span> <span style="color: #000000; ">  show(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d + %d = %d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, a, b, a </span><span style="color: #000000; ">+</span><span style="color: #000000; "> b);<br /></span><span style="color: #008080; "> 86</span> <span style="color: #000000; ">  CALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)printf, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d + %d = %d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, a, b, a </span><span style="color: #000000; ">+</span><span style="color: #000000; "> b);<br /></span><span style="color: #008080; "> 87</span> <span style="color: #000000; ">  CALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)mysleep);<br /></span><span style="color: #008080; "> 88</span> <span style="color: #000000; ">  CALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)show,   </span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d + %d = %d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, a, b, a </span><span style="color: #000000; ">+</span><span style="color: #000000; "> b);<br /></span><span style="color: #008080; "> 89</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; "> 90</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 91</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> test2()<br /></span><span style="color: #008080; "> 92</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 93</span> <span style="color: #000000; ">  STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA, NULL, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">text1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, MB_OK);<br /></span><span style="color: #008080; "> 94</span> <span style="color: #000000; ">  STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep, </span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; "> 95</span> <span style="color: #000000; ">  STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA, NULL, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">text2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, MB_OK);<br /></span><span style="color: #008080; "> 96</span> <span style="color: #000000; ">  STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep, </span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; "> 97</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; "> 98</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 99</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> test3()<br /></span><span style="color: #008080; ">100</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; ">101</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> a </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">5</span><span style="color: #000000; ">, b </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">6</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">102</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)printf, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d + %d = %d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, a, b, a </span><span style="color: #000000; ">+</span><span style="color: #000000; "> b);<br /></span><span style="color: #008080; ">103</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)mysleep);<br /></span><span style="color: #008080; ">104</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)show,   </span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d + %d = %d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, a, b, a </span><span style="color: #000000; ">+</span><span style="color: #000000; "> b);<br /></span><span style="color: #008080; ">105</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA, NULL, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">text1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, MB_OK);<br /></span><span style="color: #008080; ">106</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep, </span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">107</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA, NULL, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">text2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, MB_OK);<br /></span><span style="color: #008080; ">108</span> <span style="color: #000000; ">  unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep, </span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">109</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">110</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">111</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br /></span><span style="color: #008080; ">112</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; ">113</span> <span style="color: #000000; ">  test1();<br /></span><span style="color: #008080; ">114</span> <span style="color: #000000; ">  test2();<br /></span><span style="color: #008080; ">115</span> <span style="color: #000000; ">  test3();<br /></span><span style="color: #008080; ">116</span> <span style="color: #000000; ">  </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">117</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">118</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">119</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">120</span> <span style="color: #000000; "></span></span></div><img src ="http://www.shnenglu.com/flyinghearts/aggbug/186382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2012-08-05 21:02 <a href="http://www.shnenglu.com/flyinghearts/archive/2012/08/05/186382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>避免计算q程中出现溢出的一个技?/title><link>http://www.shnenglu.com/flyinghearts/archive/2012/03/18/168267.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 18 Mar 2012 13:16:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2012/03/18/168267.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/168267.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2012/03/18/168267.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/168267.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/168267.html</trackback:ping><description><![CDATA[<div> <p> </p> <p style="text-indent: 21pt;"><span style="font-family: 宋体;">先看一道面试题Q?/span></p><p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman""><br /></span></p> <p style="text-indent:23.6pt;"><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">长度?/span></strong><strong><span style="font-size:12.0pt">n</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">的数l,由数?/span></strong><strong><span style="font-size:12.0pt">1</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">?/span></strong><strong><span style="font-size:12.0pt">n</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">l成Q其中数?/span></strong><strong><span style="font-size:12.0pt">a</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">不出玎ͼ数字</span></strong><strong><span style="font-size:12.0pt">b</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">出现两次Q其它的数字恰好出现一ơ。怎样通过只读遍历一ơ数l,扑և数字</span></strong><strong><span style="font-size:12.0pt">a</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">?/span></strong><strong><span style="font-size:12.0pt">b</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman";Times New Roman"">?/span></strong></p> <p> </p> <p> </p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">׃只能遍历一ơ,在遍历数l?/span>arr<span style="font-family:宋体;Times New Roman";Times New Roman"">Ӟ出</span> a<span style="font-family: 宋体;Times New Roman";Times New Roman"">?/span>b<span style="font-family:宋体;Times New Roman";Times New Roman"">的差|以及</span>a<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>b<span style="font-family: 宋体;Times New Roman";Times New Roman"">的^方差Q通过解方E,卛_求得</span>a<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>b<span style="font-family:宋体;Times New Roman";Times New Roman"">。具体做法ؓQ?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">设:</span></p> <p><span><span>      </span>s1 = 1 + 2 + ... + n           (= n * (n + 1) / 2)</span></p> <p><span><span>      </span>s2 = arr[0] + arr[1] + ... + arr[n - 1]</span></p> <p><span>    </span></p> <p><span><span>      </span>r1 = 1 + 4 + ... + n^2          (= n * (n + 1) * (2 * n + 1) / 6)</span></p> <p><span><span>      </span>r2 = arr[0]^2 + arr[1]^2 + ... + arr[n - 1]^2</span></p> <p><span><span>      </span></span></p> <p><span>     c = a - b = s1 - s2</span></p> <p><span>     d = a^2 - b^2 = r1 - r2</span></p> <p> <span>   </span><span style="font-family:宋体;Times New Roman";Times New Roman"">昄Q?/span> <span> a + b = (r1 - r2) / (s1 - s2) </span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">Ҏ</span>a+b<span style="font-family: 宋体;Times New Roman";Times New Roman"">的值和</span>a-b<span style="font-family:宋体;Times New Roman";Times New Roman"">的|很容易就可算?/span>a<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>b<span style="font-family: 宋体;Times New Roman";Times New Roman"">?/span></p> <p> </p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">法虽然单,但实现v来,却有一个很大问题:计算</span> s1<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>s2<span style="font-family: 宋体;Times New Roman";Times New Roman"">?/span>r1<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>r2<span style="font-family:宋体;Times New Roman";Times New Roman"">q?/span>4<span style="font-family: 宋体;Times New Roman";Times New Roman"">个数Ӟ计算q程中可能出现溢出,造成l果不准。由于最l目的是Z计算?/span>c<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>d<span style="font-family:宋体;Times New Roman";Times New Roman"">Q一个改q的Ҏ是:</span></p> <p><span> c = s1 - s2 = (1 - arr[0]) + (2 - arr[1]) + ... + (n - arr[n - 1])</span></p> <p><span> d = (1 - arr[0]^2) + (4 - arr[1]^2) + ... + (n^2 - arr[n - 1]^2)</span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">但这L做法Qƈ不能解决问题Q?/span>n<span style="font-family:宋体;Times New Roman";Times New Roman"">E微大点Q照样存在溢出问题?/span></p> <p> </p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">那么怎样才能避免计算溢出呢?{案很简单,<strong><span style="color:red">用模q算Q?/span></strong>每进行一ơ加减运时Q都取结果ؓ原结果除以一个够大的常?/span>M<span style="font-family:宋体;Times New Roman";Times New Roman"">的余数。这样加减运中Q就不会现现溢出问题。最后再?/span> c % M<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>d % M<span style="font-family:宋体;Times New Roman";Times New Roman"">Q推出</span>c<span style="font-family: 宋体;Times New Roman";Times New Roman"">?/span>d<span style="font-family:宋体;Times New Roman";Times New Roman"">的具体倹{比如说Q计?/span>s2<span style="font-family:宋体;Times New Roman";Times New Roman"">改ؓ计算Q?/span></p> <p> <span>  s2 % M = ((((arr[0] % M) + arr[1]) % M + ...) % M + arr[n - 1]) %M</span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">从表面上看,采用模运后Q计量会增加很多。但实际上,?/span>M<span style="font-family:宋体;Times New Roman";Times New Roman"">取合适的值时Q计量q不会增加!Q?/span></p> <p> </p> <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">先回下计算机基本知识:两个?/span>N<span style="font-family:宋体;Times New Roman";Times New Roman"">位(寄存器ؓ</span>N<span style="font-family:宋体;Times New Roman";Times New Roman"">位)的二q制无符h?/span>a<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>b<span style="font-family: 宋体;Times New Roman";Times New Roman"">相加Q若l果溢出了,</span>CPU<span style="font-family:宋体;Times New Roman";Times New Roman"">会怎么处理Q当然是溢出的那一位忽略掉Q可能还要设|下溢出标志Q,得到的结果实际上是:</span>(a + b) mod 2^N<span style="font-family:宋体;Times New Roman";Times New Roman"">?strong><span style="color:red">无符h间的术q算Q本质上是模运?/span></strong>。现在的</span>CPU<span style="font-family:宋体;Times New Roman";Times New Roman"">?strong><span style="color:red">采用二补数来表示负整敎ͼ本质上也是运用模q算</span></strong>Q教U书二补数表示的负整数单定义ؓQ对正整数取反后?/span>1<span style="font-family:宋体;Times New Roman";Times New Roman"">Q,q与无符h间的q算是一致的Q在实现上,比用其它ҎQ比如说一补数Q表C整数Q要优美易实现?/span></p> <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>32<span style="font-family:宋体;Times New Roman";Times New Roman"">位^CQ?/span> <span>-x mod 2^32 = 2^32 – x (x > 0)</span><span style="font-family:宋体;Times New Roman";Times New Roman"">Q?/span> </p> <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">因?/span>-1<span style="font-family:宋体;Times New Roman";Times New Roman"">的二q制表示是Q?/span>0xFFFFFFFF</p> <p> </p> <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">了解了这些,׃会奇?/span>C/C++<span style="font-family:宋体;Times New Roman";Times New Roman"">标准的规定:无符h间的q算是模q算不会溢出Q有W号数{为无W数Q采用模q算后的倹{(Z兼容没采用二补数的机器,无符h转ؓ有符hӞ若无W号数的数DZ有符h可表C的范围Q结果是q_相关的。)</span></p> <p> </p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">因而,在对</span>32<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>CPU<span style="font-family: 宋体;Times New Roman";Times New Roman"">q_Q可以先有W号数{为无W号敎ͼ再取</span>M = 2 ^32<span style="font-family:宋体;Times New Roman";Times New Roman"">。需要特别注意的是,应该采用多少位的无符h保存计算中用到的数|如何避免模运可能带来的问题Q?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">① 无符hcd的选择Q?/span></p> <p style="margin-left:27.0pt; text-indent:-6.0pt;">a<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>b<span style="font-family: 宋体;Times New Roman";Times New Roman"">的取D围ؓQ?/span>[1, n]<span style="font-family:宋体;Times New Roman";Times New Roman"">Q?/span> </p> <p style="text-indent:21.0pt;">c % M = (a - b) % M <span style="font-family:宋体;Times New Roman";Times New Roman"">的取D围ؓQ?/span>[1, n] (a > b<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>)<span style="font-family:宋体;Times New Roman";Times New Roman"">Q?/span><span>   [M - n, M - 1] (a < b</span><span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>)</p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">q两个范围不能重叠,而因</span> n < M - n <span style="font-family:宋体;Times New Roman";Times New Roman"">?/span> 2 * n < M</p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">?/span> M<span style="font-family: 宋体;Times New Roman";Times New Roman"">?/span>2^32<span style="font-family:宋体;Times New Roman";Times New Roman"">的话Q且</span><span> n < 2^31</span><span style="font-family:宋体;Times New Roman";Times New Roman"">Q?/span> <span style="font-family: 宋体;Times New Roman";Times New Roman"">可以采用</span>32<span style="font-family:宋体;Times New Roman";Times New Roman"">位无W号数表C?/span>c<span style="font-family:宋体;Times New Roman";Times New Roman"">的倹{?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">Ҏ</span>c % M<span style="font-family:宋体;Times New Roman";Times New Roman"">值在哪一个范_可以定</span>a > b<span style="font-family:宋体;Times New Roman";Times New Roman"">q是</span>a < b<span style="font-family:宋体;Times New Roman";Times New Roman"">Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">׃q算q程中都是采用无W号数计,?/span> a < b<span style="font-family:宋体;Times New Roman";Times New Roman"">Ӟ必须q行如下调整Q?/span></p> <p><span>        c % M </span><span style="font-family: 宋体;Times New Roman";Times New Roman"">调整?/span> (-c) % M</p> <p><span>        d % M </span><span style="font-family: 宋体;Times New Roman";Times New Roman"">调整?/span> (-d) % M</p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman";Times New Roman"">q样才能保证l果的正性?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">②</span> <span style="font-family: 宋体;Times New Roman";Times New Roman"">用公式计所有数字的和、^方和Ӟ可能出现的问题:</span></p> <p><span>   </span><span style="font-family:宋体;Times New Roman";Times New Roman"">模运满I</span><span> (a <strong>*</strong> b) % M  = ((a % M) <strong>*</strong> (b % M)) % M</span></p> <p><span>     </span><span style="font-family:宋体;Times New Roman";Times New Roman"">?strong>不满?/strong>Q?/span><span> (a<strong> /</strong> b) % M  = ((a % M) <strong>/</strong> (b % M)) % M</span></p> <p><span>   </span><span style="font-family:宋体;Times New Roman";Times New Roman"">在计?/span> (n * (n + 1) / 2) % M<span style="font-family:宋体;Times New Roman";Times New Roman"">Ӟ</span> <span style="font-family:宋体;Times New Roman";Times New Roman"">不能写成Q?/span></p> <p> <span>     s = ((n * (n + 1)) % M / 2) % M</span><span style="font-family:宋体;Times New Roman";Times New Roman"">Q?/span></p> <p><span>   </span><span style="font-family:宋体;Times New Roman";Times New Roman"">而应该写成:</span></p> <p><span>     if  (n % 2 == 0)   s = ((n / 2) * (n + 1)) % M</span></p> <p> <span>    else             s = (((n + 1) / 2) * n) % M</span></p> <p><span>   </span><span style="font-family:宋体;Times New Roman";Times New Roman"">或者:</span><span>s = (INT((n + 1) / 2) * (n + (n + 1) % 2)) % M </span><span style="font-family:宋体;Times New Roman";Times New Roman"">Q其?/span>INT(x)<span style="font-family:宋体;Times New Roman";Times New Roman"">为取数</span>x<span style="font-family: 宋体;Times New Roman";Times New Roman"">的整数部份)?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">完整代码Q?/span></p> <p style="text-align: left;" align="left"> </p><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: #000000; "><br />#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">climits</span><span style="color: #000000; ">></span><span style="color: #000000; "><br />#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">cassert</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> SMALL_ARRAY 0</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> Pair {<br />  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> zero;<br />  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> twice;<br />};<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">32位CPUq_Q长度n一定小?^16ơ方Ӟ表示一个数的^方|可用32位无W号数类型,效率很高?br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">长度n若在[2^16, 2^31]区间Q就必须用到64位无W号数类型,效率较高?br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">长度n若在[2^31, 2^32)Ӟ表示 所有数的和sumQ就必须改用64位无W号数类型,效率不高?nbsp; </span><span style="color: #008000; "><br /></span><span style="color: #000000; ">Pair find_number(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> arr[], unsigned len)<br />{<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned bits </span><span style="color: #000000; ">=</span><span style="color: #000000; "> CHAR_BIT </span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(unsigned);<br /></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; "> SMALL_ARRAY</span><span style="color: #000000; "><br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned max_len </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1u</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; "> (bits </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; ">);<br />  typedef unsigned </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned max_len </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1u</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; "> (bits </span><span style="color: #000000; ">-</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />  typedef unsigned </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /><br />  assert(arr </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> len </span><span style="color: #000000; ">>=</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> len </span><span style="color: #000000; "><</span><span style="color: #000000; "> max_len);<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned</span><span style="color: #000000; ">*</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> data </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arr;<br />  unsigned sum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />  </span><span style="color: #0000FF; ">uint</span><span style="color: #000000; "> square_sum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />  </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (unsigned i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span><span style="color: #000000; "> len; </span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)  {<br />    </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned value </span><span style="color: #000000; ">=</span><span style="color: #000000; "> data[i];<br />    sum </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> value;<br />    square_sum </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">)value </span><span style="color: #000000; ">*</span><span style="color: #000000; "> value;     </span><span style="color: #008000; ">//</span><span style="color: #008000; ">注意两个数的乘积是否会溢?nbsp; </span><span style="color: #008000; "><br /></span><span style="color: #000000; ">  }<br />  <br />  </span><span style="color: #008000; ">//</span><span style="color: #008000; ">1 + 2 + 3 + <img src="http://www.shnenglu.com/Images/dot.gif" alt="" /> + len = len * (len + 1) / 2</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">uint</span><span style="color: #000000; "> sum_all </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">) </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">)(len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> (len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">) </span><span style="color: #000000; ">%</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; ">);<br />  <br />  </span><span style="color: #008000; ">//</span><span style="color: #008000; ">1^2 + 2^2 + 3^2 + <img src="http://www.shnenglu.com/Images/dot.gif" alt="" /> + len^2 = len * (len + 1) * (2 * len + 1) / 6</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned len2 </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> len </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">uint</span><span style="color: #000000; "> square_sum_all </span><span style="color: #000000; ">=</span><span style="color: #000000; "> len2 </span><span style="color: #000000; ">%</span><span style="color: #000000; "> </span><span style="color: #000000; ">3u</span><span style="color: #000000; "> </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; "> </span><span style="color: #000000; ">?</span><span style="color: #000000; "> len2 </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">3u</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> sum_all : sum_all </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">3u</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; "> len2;<br />  <br />  unsigned difference </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (unsigned)sum_all </span><span style="color: #000000; ">-</span><span style="color: #000000; "> sum;<br />  </span><span style="color: #0000FF; ">uint</span><span style="color: #000000; "> square_difference </span><span style="color: #000000; ">=</span><span style="color: #000000; "> square_sum_all </span><span style="color: #000000; ">-</span><span style="color: #000000; "> square_sum;<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">bool</span><span style="color: #000000; "> is_negative </span><span style="color: #000000; ">=</span><span style="color: #000000; "> difference </span><span style="color: #000000; ">></span><span style="color: #000000; "> INT_MAX;<br /><br />  </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (is_negative) {<br />    difference </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">-</span><span style="color: #000000; ">difference;<br />    square_difference </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">-</span><span style="color: #000000; ">square_difference;<br />  } <br />   <br />  assert(difference </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; "> </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> square_difference </span><span style="color: #000000; ">%</span><span style="color: #000000; "> difference </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned sum_two </span><span style="color: #000000; ">=</span><span style="color: #000000; "> square_difference </span><span style="color: #000000; ">/</span><span style="color: #000000; "> difference;<br />  <br />  assert((sum_two </span><span style="color: #000000; ">+</span><span style="color: #000000; "> difference) </span><span style="color: #000000; ">%</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; "> </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned larger  </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (sum_two </span><span style="color: #000000; ">+</span><span style="color: #000000; "> difference) </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; ">;<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> unsigned smaller </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (sum_two </span><span style="color: #000000; ">-</span><span style="color: #000000; "> difference) </span><span style="color: #000000; ">/</span><span style="color: #000000; "> </span><span style="color: #000000; ">2u</span><span style="color: #000000; ">;<br />  <br />  </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (is_negative) {<br />    </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Pair result </span><span style="color: #000000; ">=</span><span style="color: #000000; "> { smaller, larger};<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> result;<br />  }<br />  </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Pair result </span><span style="color: #000000; ">=</span><span style="color: #000000; "> { larger, smaller};<br />  </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> result;<br />}<br /><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br />{<br /><br />}<br /><br /><br /></span></div></div><img src ="http://www.shnenglu.com/flyinghearts/aggbug/168267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2012-03-18 21:16 <a href="http://www.shnenglu.com/flyinghearts/archive/2012/03/18/168267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC 2010 error D8027Q无法执行c1xx.dll的解x?/title><link>http://www.shnenglu.com/flyinghearts/archive/2011/07/19/151417.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 19 Jul 2011 14:07:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2011/07/19/151417.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/151417.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2011/07/19/151417.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/151417.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/151417.html</trackback:ping><description><![CDATA[<br /><div>  晚上惌个程序,l果VC 2010头一ơŞ工: <br />            cl: 命o?error D8027 :无法执行“E:\prog\vc2010\bin\c1xx.dll”<br />     上网搜烦了下Q也没找C个解x法(<a >官方说明</a>Q。正郁闷着Q突焉惛_cl.exe可以正常q行Q而c1xx.dll不能正常q行Q会不会是c1xx.dll的依赖库出问题了Q于是调出dependency一查,果然了个msvcp100.dllQ估计是某个卸蝲软g造成的)Q从别处拯一个到bin目录Q问题解冟?br /></div><img src ="http://www.shnenglu.com/flyinghearts/aggbug/151417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-19 22:07 <a href="http://www.shnenglu.com/flyinghearts/archive/2011/07/19/151417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用asio传文?/title><link>http://www.shnenglu.com/flyinghearts/archive/2011/07/07/150421.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 07 Jul 2011 15:01:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2011/07/07/150421.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/150421.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2011/07/07/150421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/150421.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/150421.html</trackback:ping><description><![CDATA[<div><p>    看了几天asio文档Qȝ可以写点程序了。有些细节还是没弄明白,同步IO好像q不能设时Q服务器端采用异步IOQ客L则采用同步IO。传送文Ӟ不得不注意到 C/C++ 2G文g限制Q好像没通用的解x法?br /></p><p> </p><p>先定义下头文Ӟl一下asio和boost_asio?/p></div><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;"><br />#ifndef _FILE_INFO_H_<br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;"> _FILE_INFO_H_</span><span style="color: #000000;"><br /><br />  </span><span style="color: #0000ff;">#if</span><span style="color: #000000;"> USE_ASIO_ALONE</span><span style="color: #000000;"><br />    #include </span><span style="color: #000000;"><</span><span style="color: #000000;">asio.hpp</span><span style="color: #000000;">></span><span style="color: #000000;"><br />  </span><span style="color: #0000ff;">#else</span><span style="color: #000000;"><br />    #include </span><span style="color: #000000;"><</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">asio.hpp</span><span style="color: #000000;">></span><span style="color: #000000;"><br />    </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> asio {<br />      </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> boost::asio;<br />      </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> boost::system::error_code;<br />    }<br />  </span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br />  <br />  </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> File_info {<br />    typedef unsigned </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> Size_type;<br />    Size_type filesize;<br />    size_t filename_size;<br />    File_info() : filesize(</span><span style="color: #000000;">0</span><span style="color: #000000;">), filename_size(</span><span style="color: #000000;">0</span><span style="color: #000000;">) {}<br />  };<br />  <br /></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br /></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><img id="Code_Closed_Image_230019" onclick="this.style.display='none'; Code_Closed_Text_230019.style.display='none'; Code_Open_Image_230019.style.display='inline'; Code_Open_Text_230019.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img id="Code_Open_Image_230019" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_230019.style.display='none'; Code_Closed_Image_230019.style.display='inline'; Code_Closed_Text_230019.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><span id="Code_Closed_Text_230019" style="border: 1px solid #808080; background-color: #ffffff;">client_sender</span><span id="Code_Open_Text_230019" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;"><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">www.cnblogs.com/flyinghearts</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">iostream</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">cstdio</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">cstring</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">shared_ptr.hpp</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;">"</span><span style="color: #000000;">file_info.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br /><br /><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sender(asio::io_service</span><span style="color: #000000;">&</span><span style="color: #000000;"> io, </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;"> ip_address, unsigned port, </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;"> filename)<br />{<br />  typedef asio::ip::tcp TCP;<br />  <br />  FILE </span><span style="color: #000000;">*</span><span style="color: #000000;">fp </span><span style="color: #000000;">=</span><span style="color: #000000;"> fopen(filename, </span><span style="color: #000000;">"</span><span style="color: #000000;">rb</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />  </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fp </span><span style="color: #000000;">==</span><span style="color: #000000;"> NULL) {<br />    std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">cannot open file\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />  }<br />  <br />  </span><span style="color: #008000;">//</span><span style="color: #008000;">使用指针Q防止程序出现异常时Qfclose未被调用?/span><span style="color: #008000;"><br /></span><span style="color: #000000;">  boost::shared_ptr</span><span style="color: #000000;"><</span><span style="color: #000000;">FILE</span><span style="color: #000000;">></span><span style="color: #000000;"> file_ptr(fp, fclose);<br />  <br />  clock_t cost_time </span><span style="color: #000000;">=</span><span style="color: #000000;"> clock();<br />  <br />  </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> size_t k_buffer_size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">32</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;">;<br />  </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> buffer[k_buffer_size];<br />  File_info file_info;<br />  <br />  </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> filename_size  </span><span style="color: #000000;">=</span><span style="color: #000000;"> strlen(filename) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />  size_t file_info_size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(file_info);<br />  size_t total_size </span><span style="color: #000000;">=</span><span style="color: #000000;"> file_info_size </span><span style="color: #000000;">+</span><span style="color: #000000;"> filename_size;<br />  </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (total_size </span><span style="color: #000000;">></span><span style="color: #000000;"> k_buffer_size) {<br />    std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">File name is too long</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />  }<br />  file_info.filename_size </span><span style="color: #000000;">=</span><span style="color: #000000;"> filename_size;<br />  <br />  fseek(fp, </span><span style="color: #000000;">0</span><span style="color: #000000;">, SEEK_END);<br />  file_info.filesize </span><span style="color: #000000;">=</span><span style="color: #000000;"> ftell(fp);<br />  rewind(fp);<br /><br />  memcpy(buffer, </span><span style="color: #000000;">&</span><span style="color: #000000;">file_info, file_info_size);<br />  memcpy(buffer </span><span style="color: #000000;">+</span><span style="color: #000000;"> file_info_size, filename, filename_size);<br /><br />  TCP::socket socket(io);<br />  socket.connect(TCP::endpoint(asio::ip::address_v4::from_string(ip_address), port));<br />  <br />  std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Sending file : </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> filename </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />  size_t len </span><span style="color: #000000;">=</span><span style="color: #000000;"> total_size;<br />  unsigned </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> total_bytes_read </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />  </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">true</span><span style="color: #000000;">) {<br />    socket.send(asio::buffer(buffer, len), </span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (feof(fp)) </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />    len </span><span style="color: #000000;">=</span><span style="color: #000000;"> fread(buffer, </span><span style="color: #000000;">1</span><span style="color: #000000;">, k_buffer_size, fp);<br />    total_bytes_read </span><span style="color: #000000;">+=</span><span style="color: #000000;"> len;<br />  }<br />  <br />  cost_time </span><span style="color: #000000;">=</span><span style="color: #000000;"> clock() </span><span style="color: #000000;">-</span><span style="color: #000000;"> cost_time;<br />  </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (cost_time </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">) cost_time </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />  </span><span style="color: #0000ff;">double</span><span style="color: #000000;"> speed </span><span style="color: #000000;">=</span><span style="color: #000000;"> total_bytes_read </span><span style="color: #000000;">*</span><span style="color: #000000;"> (CLOCKS_PER_SEC </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">1024.0</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">1024.0</span><span style="color: #000000;">) </span><span style="color: #000000;">/</span><span style="color: #000000;"> cost_time;<br />  std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">cost time: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> cost_time </span><span style="color: #000000;">/</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">double</span><span style="color: #000000;">) CLOCKS_PER_SEC  </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> s </span><span style="color: #000000;">"</span><span style="color: #000000;"> <br />    </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">  transferred_bytes: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> total_bytes_read </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> bytes\n</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />    </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">speed: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;">  speed </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> MB/s\n\n</span><span style="color: #000000;">"</span><span style="color: #000000;">; <br />}<br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> args, </span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;"> argc[])<br />{<br />  </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (args </span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">) {<br />    std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Usage: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> argc[</span><span style="color: #000000;">0</span><span style="color: #000000;">] </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> ip_address  filename1 filename2 <img src="http://www.shnenglu.com/Images/dot.gif" alt="" />\n</span><span style="color: #000000;">"</span><span style="color: #000000;">; <br />    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />  }<br />  <br />  asio::io_service io;<br />  </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">; i </span><span style="color: #000000;"><</span><span style="color: #000000;"> args; </span><span style="color: #000000;">++</span><span style="color: #000000;">i) {<br />    </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { sender(io, argc[</span><span style="color: #000000;">1</span><span style="color: #000000;">], </span><span style="color: #000000;">1345</span><span style="color: #000000;">, argc[i]); }<br />    </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (std::exception</span><span style="color: #000000;">&</span><span style="color: #000000;"> err) {<br />      std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> err.what() </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    }<br />  }<br />}<br /><br /></span></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><img id="Code_Closed_Image_230056" onclick="this.style.display='none'; Code_Closed_Text_230056.style.display='none'; Code_Open_Image_230056.style.display='inline'; Code_Open_Text_230056.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img id="Code_Open_Image_230056" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_230056.style.display='none'; Code_Closed_Image_230056.style.display='inline'; Code_Closed_Text_230056.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><span id="Code_Closed_Text_230056" style="border: 1px solid #808080; background-color: #ffffff;">server_receiver</span><span id="Code_Open_Text_230056" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;"><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">www.cnblogs.com/flyinghearts</span><span style="color: #008000;"><br /></span><span style="color: #000000;">#include </span><span style="color: #000000;"><</span><span style="color: #000000;">iostream</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">cstdio</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">bind.hpp</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">shared_ptr.hpp</span><span style="color: #000000;">></span><span style="color: #000000;"><br />#include </span><span style="color: #000000;"><</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">enable_shared_from_this.hpp</span><span style="color: #000000;">></span><span style="color: #000000;"><br /><br />#include </span><span style="color: #000000;">"</span><span style="color: #000000;">file_info.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Session : </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> boost::enable_shared_from_this</span><span style="color: #000000;"><</span><span style="color: #000000;">Session</span><span style="color: #000000;">></span><span style="color: #000000;"> {<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />  typedef asio::ip::tcp TCP;<br />  typedef asio::error_code Error; <br />  typedef boost::shared_ptr</span><span style="color: #000000;"><</span><span style="color: #000000;">Session</span><span style="color: #000000;">></span><span style="color: #000000;"> Pointer;<br />  typedef File_info::Size_type Size_type;<br />  <br />  </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> print_asio_error(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> Error</span><span style="color: #000000;">&</span><span style="color: #000000;"> error) { std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> error.message() </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;}<br />  <br />  </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> Pointer create(asio::io_service</span><span style="color: #000000;">&</span><span style="color: #000000;"> io) { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Pointer(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Session(io));}<br />  <br />  TCP::socket</span><span style="color: #000000;">&</span><span style="color: #000000;"> socket() { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> socket_; }<br />  <br />  </span><span style="color: #000000;">~</span><span style="color: #000000;">Session() <br />  {<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fp_) fclose(fp_);<br />    clock_ </span><span style="color: #000000;">=</span><span style="color: #000000;"> clock() </span><span style="color: #000000;">-</span><span style="color: #000000;"> clock_;<br />    Size_type bytes_writen </span><span style="color: #000000;">=</span><span style="color: #000000;"> total_bytes_writen_;<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (clock_ </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">) clock_ </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />    </span><span style="color: #0000ff;">double</span><span style="color: #000000;"> speed </span><span style="color: #000000;">=</span><span style="color: #000000;"> bytes_writen </span><span style="color: #000000;">*</span><span style="color: #000000;"> (CLOCKS_PER_SEC </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">1024.0</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">1024.0</span><span style="color: #000000;">) </span><span style="color: #000000;">/</span><span style="color: #000000;"> clock_ ;<br />    std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">cost time: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> clock_ </span><span style="color: #000000;">/</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">double</span><span style="color: #000000;">) CLOCKS_PER_SEC </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> s  </span><span style="color: #000000;">"</span><span style="color: #000000;"> <br />       </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">bytes_writen: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> bytes_writen </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> bytes\n</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />       </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">speed: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;">  speed </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> MB/s\n\n</span><span style="color: #000000;">"</span><span style="color: #000000;">; <br />  }<br />  <br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> start()<br />  {<br />    clock_ </span><span style="color: #000000;">=</span><span style="color: #000000;"> clock();<br />    std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">client: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> socket_.remote_endpoint().address() </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    socket_.async_receive(<br />      asio::buffer(reinterpret_cast</span><span style="color: #000000;"><</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*></span><span style="color: #000000;">(</span><span style="color: #000000;">&</span><span style="color: #000000;">file_info_), </span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(file_info_)),<br />      boost::bind(</span><span style="color: #000000;">&</span><span style="color: #000000;">Session::handle_header, shared_from_this(), asio::placeholders::error)); <br />  }<br />  <br /></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />  Session(asio::io_service</span><span style="color: #000000;">&</span><span style="color: #000000;"> io) : socket_(io), fp_(NULL), total_bytes_writen_(</span><span style="color: #000000;">0</span><span style="color: #000000;">) { }<br />  <br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handle_header(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> Error</span><span style="color: #000000;">&</span><span style="color: #000000;"> error) <br />  {<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (error) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> print_asio_error(error);<br />    size_t filename_size </span><span style="color: #000000;">=</span><span style="color: #000000;"> file_info_.filename_size;<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (filename_size </span><span style="color: #000000;">></span><span style="color: #000000;"> k_buffer_size) {<br />      std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Path name is too long!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />      </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />    }<br />    </span><span style="color: #008000;">//</span><span style="color: #008000;">得用async_read, 不能用async_read_someQ防止\径名长Ӟ一ơ接收不?/span><span style="color: #008000;"><br /></span><span style="color: #000000;">    asio::async_read(socket_, asio::buffer(buffer_, file_info_.filename_size),<br />      boost::bind(</span><span style="color: #000000;">&</span><span style="color: #000000;">Session::handle_file, shared_from_this(), asio::placeholders::error)); <br />  }<br />  <br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handle_file(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> Error</span><span style="color: #000000;">&</span><span style="color: #000000;"> error)<br />  {<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (error) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> print_asio_error(error);<br />    </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">basename </span><span style="color: #000000;">=</span><span style="color: #000000;"> buffer_ </span><span style="color: #000000;">+</span><span style="color: #000000;"> file_info_.filename_size </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />    </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (basename </span><span style="color: #000000;">>=</span><span style="color: #000000;"> buffer_ </span><span style="color: #000000;">&&</span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">basename </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">\\</span><span style="color: #000000;">'</span><span style="color: #000000;"> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">basename </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">/</span><span style="color: #000000;">'</span><span style="color: #000000;">)) </span><span style="color: #000000;">--</span><span style="color: #000000;">basename;<br />    </span><span style="color: #000000;">++</span><span style="color: #000000;">basename;<br />    <br />    std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Open file: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> basename </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> (</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> buffer_ </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">)\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />    <br />    fp_ </span><span style="color: #000000;">=</span><span style="color: #000000;"> fopen(basename, </span><span style="color: #000000;">"</span><span style="color: #000000;">wb</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fp_ </span><span style="color: #000000;">==</span><span style="color: #000000;"> NULL) {<br />      std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Failed to open file to write\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />      </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />    }<br />    receive_file_content();<br />  }<br />  <br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> receive_file_content()<br />  {<br />    socket_.async_receive(asio::buffer(buffer_, k_buffer_size), <br />      boost::bind(</span><span style="color: #000000;">&</span><span style="color: #000000;">Session::handle_write, shared_from_this(), asio::placeholders::error,<br />        asio::placeholders::bytes_transferred)); <br />  }<br />  <br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handle_write(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> Error</span><span style="color: #000000;">&</span><span style="color: #000000;"> error, size_t bytes_transferred)<br />  {<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (error) {<br />      </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (error </span><span style="color: #000000;">!=</span><span style="color: #000000;"> asio::error::eof) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> print_asio_error(error);<br />      Size_type filesize </span><span style="color: #000000;">=</span><span style="color: #000000;"> file_info_.filesize;<br />      </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (total_bytes_writen_ </span><span style="color: #000000;">!=</span><span style="color: #000000;"> filesize) <br />          std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;">  </span><span style="color: #000000;">"</span><span style="color: #000000;">Filesize not matched! </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> total_bytes_writen_ <br />            </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> filesize </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />      </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;     <br />    }  <br />    total_bytes_writen_ </span><span style="color: #000000;">+=</span><span style="color: #000000;"> fwrite(buffer_, </span><span style="color: #000000;">1</span><span style="color: #000000;">, bytes_transferred, fp_);<br />    receive_file_content();<br />  }<br />  <br />  clock_t clock_;<br />  TCP::socket socket_;<br />  FILE </span><span style="color: #000000;">*</span><span style="color: #000000;">fp_;<br />  File_info file_info_;<br />  Size_type total_bytes_writen_;<br />  </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> unsigned k_buffer_size </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">32</span><span style="color: #000000;">;<br />  </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> buffer_[k_buffer_size];<br />};<br /><br /></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Tcp_server<br />{<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br />  typedef asio::ip::tcp TCP;<br />  typedef asio::error_code Error;<br />  <br />  Tcp_server(asio::io_service</span><span style="color: #000000;">&</span><span style="color: #000000;"> io, unsigned port) : <br />      acceptor_(io, TCP::endpoint(TCP::v4(), port))<br />  {<br />    start_accept();<br />  }<br /><br />  </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> print_asio_error(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> Error</span><span style="color: #000000;">&</span><span style="color: #000000;"> error) { std::cerr </span><span style="color: #000000;"><<</span><span style="color: #000000;"> error.message() </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;}<br /><br /></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> start_accept()<br />  {<br />    Session::Pointer session </span><span style="color: #000000;">=</span><span style="color: #000000;"> Session::create(acceptor_.get_io_service());<br />    acceptor_.async_accept(session</span><span style="color: #000000;">-></span><span style="color: #000000;">socket(),<br />      boost::bind(</span><span style="color: #000000;">&</span><span style="color: #000000;">Tcp_server::handle_accept, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">, session, asio::placeholders::error));<br />  }<br />  <br />  </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handle_accept(Session::Pointer session, </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> Error</span><span style="color: #000000;">&</span><span style="color: #000000;"> error)<br />  {<br />    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (error) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> print_asio_error(error);<br />    session</span><span style="color: #000000;">-></span><span style="color: #000000;">start();<br />    start_accept();<br />  }<br />  <br />  TCP::acceptor acceptor_;<br />};<br /><br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> main()<br />{<br />  std::cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Auto receive files and save then in current directory.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />  asio::io_service io;<br />  Tcp_server receiver(io, </span><span style="color: #000000;">1345</span><span style="color: #000000;">);  <br />  io.run();<br />}<br /><br /></span></span></div><img src ="http://www.shnenglu.com/flyinghearts/aggbug/150421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-07 23:01 <a href="http://www.shnenglu.com/flyinghearts/archive/2011/07/07/150421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组左旋转k?—?C++标准法库中最悲剧的函敎ͼrotatehttp://www.shnenglu.com/flyinghearts/archive/2011/05/27/147403.htmlflyingheartsflyingheartsFri, 27 May 2011 13:04:00 GMThttp://www.shnenglu.com/flyinghearts/archive/2011/05/27/147403.htmlhttp://www.shnenglu.com/flyinghearts/comments/147403.htmlhttp://www.shnenglu.com/flyinghearts/archive/2011/05/27/147403.html#Feedback2http://www.shnenglu.com/flyinghearts/comments/commentRss/147403.htmlhttp://www.shnenglu.com/flyinghearts/services/trackbacks/147403.html

要将一个数l的所有元素向左旋?/span>k位,通常有三U算法:

 

1Q?/span>分组交换Q:

若a长度大于bQ将ab分成a0a1bQ交换a0和bQ得ba1a0Q只需再交换a1 和a0?/span>

若a长度于bQ将ab分成ab0b1Q交换a和b0Q得b0ab1Q只需再交换a 和b1?/span>

不断数l划分和交换Q直C能再划分为止。分l过E与求最大公U数很相伹{?/span>

 d内存?n?*n?/span>

 

2 (三次反{)

利用ba=(br)r(ar)r=(arbr)rQ先分别反{a、bQ最后再Ҏ有元素进行一ơ反转?/span>

d内存各约2*n?/span>

 

法3 Q用@环链Q?/span>

假设 n、k的最大公U数为MQ则所有序号ؓ (i + j*k) % n (0<= i < M, 0 <= j < n/M)的元素,构成M个@环链Qi值相同的在同一个@环链上)Q?每个循环链上的元素移动到前一个元素的元素Q就可以交换到最l结果上的位|,因而d只要d内存各nơ。(比如Q?1 2 3 4 5 6Q左U?位, 1 3 5 ?2 4 6分别构成两个循环链。)

 

事实?/span>C++标准法库提供了现成的函敎ͼrotate函数。按理说Q几U算法都比较单,~译器的库函数又是经q时间检验的Q效率即使比手写的差Q也不会差太多。但如果?/span>rotate函数q行试的话Q可能会发现标准库的版本慢得可不是一点点?/span>

?/span>VC 2010Q运行后面的试E序Q自定义函数Q采用算?/span>2Q要?/span>99msQ?/span>std::rotate却要1656ms。是库的实现者不懂得用这个简单的法吗?查下库的源代码,׃发现Q标准算法库中,?/span>C++的三UP代器Q前向P代器、双向P代器Q随问P代器Q,分别采用了上面三U算法。直接调用其内部的实玎ͼstd::_Rotat函数Q,重新试下,可得C面结果:

 

q代?/span>

前向Q算?/span>1Q?/span>

双向Q算?/span>2Q?/span>

随机讉KQ算?/span>3Q?/span>

旉Q?/span>msQ?/span>

46

99

1651

        Q?/span>GCC的,L版本号低?/span>4.5的进行测试)

 

    从结果可以看出,效率是:1 > 2 >>> 3?/span> 

 

从理ZԌ法3只要d内存?/span>nơ,应该是效率最高的法。这在每ơ内存读写的开销相差不大时成立。但实际上,׃g限制Q?/span>CPU对内存的讉K采用分~存机制Q一U缓存容量很但讉K速度最快,存放E序的指令和最常用的数据,而二、三U缓存容量较大但讉K速度要慢很多?/span>CPU是无法绕q缓存直接访问内存数据(某些Ҏ指o可以不用一二三U缓存,但它也要用到其它专用~存Q,对不在缓存中的数据,必须先蝲入到~存中,q个操作是相当昂늚。对大数l来_不可能将所有数据都存放在缓存中Q而对内存的不q箋讉KQ?/span>CPU对内存定位的开销Q各U缓存间数据的调_反复Ud或移出数据到~存Q是巨大的,q就造成了算?/span>3的性能在该情况下非常差。测试发玎ͼk = 3Ӟ该算法的效率已l相当差了。对数l,管该算法读写次数少Q但׃各种法所用时间都很小Q这U优势很难体现出来。可以说Q?strong>3在数学上是非怼的Q但是在实际应用中,是一U相当差的算法?/span>

对算法的选择Q不应该忽视内存因素?/span>在对随机讉Kq代器版本的roate实现上犯q个错误的,可不仅仅?/span>VCQ还有著名的STL Port?/span>GCCQ?/span>GCC?/span>4.5开?/span>libstdc++改用法1Qƈ做了些优化)Q以及新兴的libc++。(其它的编译器/库没用过Q也没有测试。)

 

另外Q测试时发现VC 2010的一?/span>bugQ前向P代器的实现版本,?/span>k = 0ӞE序直接挂了?/span>

 

试代码Q?/p>


rotate


flyinghearts 2011-05-27 21:04 发表评论
]]>
从字W串中提取数字ƈ排序输出http://www.shnenglu.com/flyinghearts/archive/2011/03/31/143167.htmlflyingheartsflyingheartsThu, 31 Mar 2011 15:56:00 GMThttp://www.shnenglu.com/flyinghearts/archive/2011/03/31/143167.htmlhttp://www.shnenglu.com/flyinghearts/comments/143167.htmlhttp://www.shnenglu.com/flyinghearts/archive/2011/03/31/143167.html#Feedback0http://www.shnenglu.com/flyinghearts/comments/commentRss/143167.htmlhttp://www.shnenglu.com/flyinghearts/services/trackbacks/143167.html阅读全文

flyinghearts 2011-03-31 23:56 发表评论
]]>
《编E之》读书笔?2Q? 1.16 24Ҏ戏(补充Q?/title><link>http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123531.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Aug 2010 15:35:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123531.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/123531.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/123531.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/123531.html</trackback:ping><description><![CDATA[     摘要: 《编E之》读书笔?2Q?nbsp;   1.16  24Ҏ戏(补充Q?  l定n个数Q能否只通过加减乘除计算得到24Q? 书上l出的最后一U解法,通过使用集合记录中间l果来减冗余计。本以ؓQ程序会占用大量的内存,用一个极端的例子Q?3, 773, 28, 98, 731, 1357,97357246q?个数Q测试了一下实现的E序Q发现程序竟?..  <a href='http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123531.html'>阅读全文</a><img src ="http://www.shnenglu.com/flyinghearts/aggbug/123531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-08-15 23:35 <a href="http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>N个数计算24?/title><link>http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123529.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Aug 2010 15:20:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123529.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/123529.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/123529.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/123529.html</trackback:ping><description><![CDATA[     摘要: N个数计算24?问题Q?    N??3之间的自然数Q找出所有能通过加减乘除计算Q每个数有且只能用一ơ)得到24的组合?   计算24点常用的法有:?d两个敎ͼ计算后,结果放回去Q再从剩下的Cd两个Q如此反复直到只剩下一个数Q② 先构建前~/后缀表达式,再计该表达式;?用集合保存中间结果,集合间两两进行合q计得到新集合Q或者对...  <a href='http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123529.html'>阅读全文</a><img src ="http://www.shnenglu.com/flyinghearts/aggbug/123529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-08-15 23:20 <a href="http://www.shnenglu.com/flyinghearts/archive/2010/08/15/123529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编E之》读书笔?2Q? 1.16 24Ҏ?/title><link>http://www.shnenglu.com/flyinghearts/archive/2010/08/01/121907.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 01 Aug 2010 14:50:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2010/08/01/121907.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/121907.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2010/08/01/121907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/121907.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/121907.html</trackback:ping><description><![CDATA[     摘要: 《编E之》读书笔?2Q?nbsp;   1.16  24Ҏ? l定4个数Q能否只通过加减乘除计算得到24Q由于只?个数Q弄个多重@环,可以。如果要推广到n个数Q有两种思\Q??采用前缀/后缀表达式。相当于n个数用n-1个括hhQ其数目是一个catlan数。最多可得到 f(n) = (1/n * (2*n - 2)! / (n-1)! / (...  <a href='http://www.shnenglu.com/flyinghearts/archive/2010/08/01/121907.html'>阅读全文</a><img src ="http://www.shnenglu.com/flyinghearts/aggbug/121907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-08-01 22:50 <a href="http://www.shnenglu.com/flyinghearts/archive/2010/08/01/121907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编E之》读书笔?1Q?2.4 1的数?/title><link>http://www.shnenglu.com/flyinghearts/archive/2010/07/21/120915.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 20 Jul 2010 16:25:00 GMT</pubDate><guid>http://www.shnenglu.com/flyinghearts/archive/2010/07/21/120915.html</guid><wfw:comment>http://www.shnenglu.com/flyinghearts/comments/120915.html</wfw:comment><comments>http://www.shnenglu.com/flyinghearts/archive/2010/07/21/120915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flyinghearts/comments/commentRss/120915.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flyinghearts/services/trackbacks/120915.html</trackback:ping><description><![CDATA[     摘要:  《编E之》读书笔?1Q?2.4 1的数?  问题Q?    l定一个十q制正整数NQ写下从1开始,到N的所有整敎ͼ     然后C下其中出现的所?#8220;1”的个数?     例如Q?       ...  <a href='http://www.shnenglu.com/flyinghearts/archive/2010/07/21/120915.html'>阅读全文</a><img src ="http://www.shnenglu.com/flyinghearts/aggbug/120915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-07-21 00:25 <a href="http://www.shnenglu.com/flyinghearts/archive/2010/07/21/120915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.4000300252.cn" target="_blank">Ůþþ</a>| <a href="http://www.bbctp.cn" target="_blank">þþþþþ97</a>| <a href="http://www.tongdiaocj.cn" target="_blank">ŷþþþþþѡ9999</a>| <a href="http://www.828wlp.cn" target="_blank">þҹɫƷav</a>| <a href="http://www.siteni.cn" target="_blank">þþþþƷAV</a>| <a href="http://www.blv5.cn" target="_blank">þAV˳׽ </a>| <a href="http://www.mailiangjin.cn" target="_blank">þþƷþý </a>| <a href="http://www.xxysw.com.cn" target="_blank">һõþۺϺݺݰ</a>| <a href="http://www.dm233.cn" target="_blank">պŷþþwwwۺ</a>| <a href="http://www.dmbetter.cn" target="_blank">ɫ͵͵88ŷƷþþ</a>| <a href="http://www.ditiewang.com.cn" target="_blank">þۺϾƷþ</a>| <a href="http://www.zhzzbjb.cn" target="_blank">þþþþ޾Ʒ</a>| <a href="http://www.tvhhm.cn" target="_blank">ŷ糱þþXXXXx</a>| <a href="http://www.3233567.cn" target="_blank">޹þþþþþ</a>| <a href="http://www.atbook.cn" target="_blank">ƷŮٸavѾþ</a>| <a href="http://www.51maicha.cn" target="_blank">պƷרþþ</a>| <a href="http://www.lc351.cn" target="_blank">þøݾƷԴվ</a>| <a href="http://www.commonsoft.cn" target="_blank">99ƷѾþþþþ</a>| <a href="http://www.xyq123.cn" target="_blank">ƷþþþþӰԺ</a>| <a href="http://www.17740.cn" target="_blank">һһþaaۺϾƷ</a>| <a href="http://www.gkxee.cn" target="_blank">þþûɫƬ</a>| <a href="http://www.xahyjtls.cn" target="_blank">Ʒ91þþþþþa</a>| <a href="http://www.18xh.cn" target="_blank">97rþþƷ99</a>| <a href="http://www.8806699.cn" target="_blank">պһþ99</a>| <a href="http://www.e-meng.com.cn" target="_blank">þþƷƷƷ</a>| <a href="http://www.syyinuo.cn" target="_blank">ŷ޾ƷþþavӰ</a>| <a href="http://www.vhcs.cn" target="_blank">þþƷа</a>| <a href="http://www.shjinhuashiye.cn" target="_blank">þٸ۲AV</a>| <a href="http://www.976z.cn" target="_blank">޾Ʒþþþþ</a>| <a href="http://www.z718.cn" target="_blank">þþþAVվ</a>| <a href="http://www.918gn.cn" target="_blank">91Ʒպþò</a>| <a href="http://www.e-li.cn" target="_blank">þ99Ʒþþþþhb</a>| <a href="http://www.jjzrhg.cn" target="_blank">˾þô߽AVۺӰԺ</a>| <a href="http://www.kuaiyanapp.com.cn" target="_blank">þ99ֻƵƷ6</a>| <a href="http://www.nfnv.cn" target="_blank">97þþþ</a>| <a href="http://www.cqzmz.cn" target="_blank">þùֱ</a>| <a href="http://www.shenhoulong.com.cn" target="_blank">þ99Ʒþþþþ9</a>| <a href="http://www.510dpw.cn" target="_blank">þ</a>| <a href="http://www.ningxue520.cn" target="_blank">޹Ʒþ66</a>| <a href="http://www.masiah.com.cn" target="_blank">þþžȫ</a>| <a href="http://www.99605.com.cn" target="_blank">þþþùƷ鶹ARӰԺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>