﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Kisser Leon-随笔分类-C++</title><link>http://www.cppblog.com/jacky2019/category/3690.html</link><description>这个kisser不太冷</description><language>zh-cn</language><lastBuildDate>Thu, 01 Apr 2010 17:08:38 GMT</lastBuildDate><pubDate>Thu, 01 Apr 2010 17:08:38 GMT</pubDate><ttl>60</ttl><item><title>c++ volatile关键字</title><link>http://www.cppblog.com/jacky2019/archive/2010/04/01/111249.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 01 Apr 2010 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2010/04/01/111249.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/111249.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2010/04/01/111249.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/111249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/111249.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span>c++中的volatile关键字一直没有使用过。最近使用了一下。该关键字的意思就是告诉编译器不要对该变量进行优化，使用地址对该变量进行取值而不要直接使用该变量已经存在cach/寄存器中的值。<br><br>测试代码如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;volatile.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_134_292_Open_Image onclick="this.style.display='none'; Codehighlighter1_134_292_Open_Text.style.display='none'; Codehighlighter1_134_292_Closed_Image.style.display='inline'; Codehighlighter1_134_292_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_134_292_Closed_Image onclick="this.style.display='none'; Codehighlighter1_134_292_Closed_Text.style.display='none'; Codehighlighter1_134_292_Open_Image.style.display='inline'; Codehighlighter1_134_292_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_134_292_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_134_292_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">volatile&nbsp;int&nbsp;a&nbsp;=&nbsp;1;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a&nbsp;=&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;a);<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;__asm<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_206_238_Open_Image onclick="this.style.display='none'; Codehighlighter1_206_238_Open_Text.style.display='none'; Codehighlighter1_206_238_Closed_Image.style.display='inline'; Codehighlighter1_206_238_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_206_238_Closed_Image onclick="this.style.display='none'; Codehighlighter1_206_238_Closed_Text.style.display='none'; Codehighlighter1_206_238_Open_Image.style.display='inline'; Codehighlighter1_206_238_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_206_238_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_206_238_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;DWORD&nbsp;ptr&nbsp;[ebp</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">],&nbsp;10h // 修改a的值为0x10<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a&nbsp;=&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;a);<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
</span><br>如果编译器没有优化的话，打印出来的值应该是1和16。反之，如果没有使用volatile，优化之后应该打印出来的是1和1<br><br>我在vc6和vc2008下测试了一下：<br>-----------------------------------------------------------------------------------------<br><br>vc2008<br>-----------------------------------------------------------------------------------------<br>没有关键字volatile<br>debug下打印的是 1 和 1 ---为什么会被优化了呢？我的优化编译选项是disabled的<br>release下打印的是 1 和 1<br>有关键字volatile<br><font face=宋体>debug下打印的是 1 和 1 --- 很奇怪！<br>release下打印的是 1 和 16<br><br>我想可能是编译器对debug下作了特殊处理。而且该程序非常简单</font><br><br>vc6.0<br><font face=宋体>-----------------------------------------------------------------------------------------<br>没有关键字volatile<br><font face=宋体>debug下打印的是 1 和 16<br>release下打印的是 1 和 1</font><br>有关键字volatile<br><font face=宋体>debug下打印的是 1 和 16<br>release下打印的是 1 和 1 --- 很奇怪！<br><br><br>小结：<br>在多线程多核的情况下，要防止被编译器优化！</font></font>
<img src ="http://www.cppblog.com/jacky2019/aggbug/111249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2010-04-01 10:54 <a href="http://www.cppblog.com/jacky2019/archive/2010/04/01/111249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>环形缓冲</title><link>http://www.cppblog.com/jacky2019/archive/2010/04/01/111243.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 01 Apr 2010 01:17:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2010/04/01/111243.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/111243.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2010/04/01/111243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/111243.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/111243.html</trackback:ping><description><![CDATA[<pre>环形缓冲是可以不用加锁的。下面是一个实现的环形缓冲。使用c实现，可能会出现write满情况，这种情况导致的结果就是write不成功，数据没写进去。</pre><pre>我这里只是简单的丢了。</pre><pre><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #008000; ">//<br></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">stdafx.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">time.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAX_BUF_LEN&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;buf&nbsp;len&nbsp;//&nbsp;必须要大于1</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nRead&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;read&nbsp;pos</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nWrite&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;write&nbsp;pos</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;buf[MAX_BUF_LEN]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">0</span><span style="color: #000000; ">};&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;loop&nbsp;buf</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;NN&nbsp;20000</span><span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #000000; ">__int64&nbsp;sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #000000; ">__int64&nbsp;lose&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #000000; ">__int64&nbsp;total&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(__int64)(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">+</span><span style="color: #000000; ">NN)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(__int64)NN</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;bWriteFinished&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;WriteBuf(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n)<br></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;rpos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nRead;<br></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;wpos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nWrite;<br></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;wpos</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;buf满（即write又追上了read）,&nbsp;注为了避免与初始状态重复判断<br></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;所以这里最后一个buf没有写就认为已经满了。所以MAX_BUF_LEN不能为1<br></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;这里，直接丢弃该buf</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(wpos&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;MAX_BUF_LEN&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;rpos&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;MAX_BUF_LEN)<br></span><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lose&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;n;<br></span><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;buf[nWrite]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;n;<br></span><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;nWrite</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(nWrite&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;MAX_BUF_LEN)<br></span><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nWrite&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ReadBuf()<br></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(nWrite&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nRead)<br></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;buf[nRead];<br></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;nRead</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(nRead&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;MAX_BUF_LEN)<br></span><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRead&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;n;<br></span><span style="color: #008080; ">&nbsp;49</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;51</span>&nbsp;<span style="color: #000000; ">DWORD&nbsp;WINAPI&nbsp;ReadThread(LPVOID&nbsp;lpParameter)<br></span><span style="color: #008080; ">&nbsp;52</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("ReadThread&nbsp;=&nbsp;%d\n",&nbsp;ReadBuf());</span><span style="color: #008000; "><br></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ReadBuf();<br></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;tmp)<br></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;tmp;<br></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(count&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NN)<br></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ReadThread&nbsp;finished!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bWriteFinished)<br></span><span style="color: #008080; ">&nbsp;70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ReadThread&nbsp;finished222!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">&nbsp;72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;74</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(rand()&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">&nbsp;76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #000000; ">DWORD&nbsp;WINAPI&nbsp;WriteThread(LPVOID&nbsp;lpParameter)<br></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)<br></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteBuf(n);<br></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(n&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NN)<br></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">&nbsp;89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">WriteThread&nbsp;finished!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">&nbsp;90</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bWriteFinished&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;92</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;93</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;94</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(rand()&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;srand(time(NULL));<br></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)<br></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">104</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("rand&nbsp;=&nbsp;%d\n",&nbsp;rand()&nbsp;%&nbsp;10);<br></span><span style="color: #008080; ">105</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br></span><span style="color: #008080; ">106</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br></span><span style="color: #008080; ">107</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;threadid[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">0</span><span style="color: #000000; ">};<br></span><span style="color: #008080; ">108</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hThread[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">0</span><span style="color: #000000; ">};<br></span><span style="color: #008080; ">109</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;param&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">110</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;hThread[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateThread(NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;ReadThread,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">param,&nbsp;CREATE_SUSPENDED,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">threadid[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">111</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ResumeThread(hThread[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">112</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;hThread[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateThread(NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;WriteThread,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">param,&nbsp;CREATE_SUSPENDED,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">threadid[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">113</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ResumeThread(hThread[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br></span><span style="color: #008080; ">114</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">115</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="color: #008080; ">116</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">117</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">total&nbsp;=&nbsp;%lld\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;total);<br></span><span style="color: #008080; ">118</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">lose&nbsp;=&nbsp;%lld\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;lose);<br></span><span style="color: #008080; ">119</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sum&nbsp;=&nbsp;%lld\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;sum);<br></span><span style="color: #008080; ">120</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">121</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(total&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;lose&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;sum)<br></span><span style="color: #008080; ">122</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">123</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">loop&nbsp;buf&nbsp;works&nbsp;well!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">124</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">125</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br></span><span style="color: #008080; ">126</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080; ">127</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">loop&nbsp;buf&nbsp;works&nbsp;wrong!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br></span><span style="color: #008080; ">128</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080; ">129</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">130</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br></span><span style="color: #008080; ">131</span>&nbsp;<span style="color: #000000; ">}<br></span><span style="color: #008080; ">132</span>&nbsp;<span style="color: #000000; "></span></div>上面是加了测试代码的，我测试了一下似乎没问题。</pre><pre>注意：这里只允许一个线程读，一个线程写。如果是多个线程读写的话，需要锁！</pre><pre>另外，很多细节都没考虑进去</pre><img src ="http://www.cppblog.com/jacky2019/aggbug/111243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2010-04-01 09:17 <a href="http://www.cppblog.com/jacky2019/archive/2010/04/01/111243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python与c++交互学习入门之5</title><link>http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Wed, 06 Jun 2007 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/25662.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/25662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/25662.html</trackback:ping><description><![CDATA[<p>这次讲讲，如何扩展c++库。通过boost.python把c++库编译成python能够调用的dll。</p>
<p><br>通过上一次的教程后，大家都应该会使用boost.python了。把c++程序编译成pyd文件。由于c++有很多特性，所以，如果你的程</p>
<p>序用了很多的c++特性的话，那么你必须做很多工作了。像虚拟函数，函数重载，继承，默认值等等。具体如何转化，请参</p>
<p>boost.python的文档了。</p>
<p><br>这几天尝试着把c++程序库编译成python可调用的dll，不知道为什么一直不可用。。很是郁闷。老是显示如下的错误：</p>
<p>Traceback (most recent call last):<br>&nbsp; File "&lt;pyshell#3&gt;", line 1, in &lt;module&gt;<br>&nbsp;&nbsp;&nbsp; import pydll<br>ImportError: No module named pydll</p>
<p>意思是说找不到dll。我把dll都copy到python/dlls下了还是不行，而且我确定python的sys.path包含了python/dlls目录了。</p>
<p>很是不解。网上也很难找到资料，google了很长时间找不到有用的资料，好像中文方面的资料很少的。今天尝试了一下google</p>
<p>英文资料，终于有了新的发现：<br><a href="http://mail.python.org/pipermail/c++-sig/2007-February/011971.html">http://mail.python.org/pipermail/c++-sig/2007-February/011971.html</a><br>You are using Python2.5. In this version of Python you have to have<br>file extension<br>to be "pyd" - sge.pyd</p>
<p>-- <br>Roman Yakovenko<br>C++ Python language binding<br><a href="http://www.language-binding.net/">http://www.language-binding.net/</a></p>
<p>有人碰到的问题跟我的是一样的。后面那个Roman回答了一下，是文件扩展名的问题！！！为什么不支持dll呢？不解。回去试</p>
<p>了一下把后缀名改了就成功了。。。why???</p>
<p><br>下面来看一下我的那个简单的例子：<br>这个例子来自于网上，<br><a href="http://www.vckbase.com/document/viewdoc/?id=1540">http://www.vckbase.com/document/viewdoc/?id=1540</a><br>C++ 扩展和嵌入 Python<br>作者：胡金山<br>源码下载地址：<a href="http://www.vckbase.com/code/downcode.asp?id=2777">http://www.vckbase.com/code/downcode.asp?id=2777</a></p>
<p><br>这是一个非常简单的dll工程。给python提供了一个函数static PyObject* Recognise(PyObject *self, PyObject *args)。</p>
<p><br>1、不使用boost.python库来直接构建dll<br>接下来，我们来用C++为Python编写扩展模块(动态链接库)，并在Python程序中调用C++开发的扩展功能函数。生成一个取名为</p>
<p>pyUtil的Win32 DLL工程，除了pyUtil.cpp文件以外，从工程中移除所有其它文件，并填入如下的代码： </p>
<p>// pyUtil.cpp<br>#ifdef PYUTIL_EXPORTS<br>#define PYUTIL_API __declspec(dllexport)<br>#else<br>#define PYUTIL_API __declspec(dllimport)<br>#endif</p>
<p>#include&lt;windows.h&gt;<br>#include&lt;string&gt;<br>#include&lt;Python.h&gt;<br>BOOL APIENTRY DllMain( HANDLE hModule, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; ul_reason_for_call, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID lpReserved<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>{<br>&nbsp;&nbsp;&nbsp; switch (ul_reason_for_call)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; case DLL_PROCESS_ATTACH:<br>&nbsp;&nbsp;&nbsp; case DLL_THREAD_ATTACH:<br>&nbsp;&nbsp;&nbsp; case DLL_THREAD_DETACH:<br>&nbsp;&nbsp;&nbsp; case DLL_PROCESS_DETACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>}<br>std::string Recognise_Img(const std::string url)<br>{<br>&nbsp;&nbsp;&nbsp; //返回结果<br>&nbsp;&nbsp;&nbsp; return "从dll中返回的数据... : " +url;<br>}<br>static PyObject* Recognise(PyObject *self, PyObject *args)<br>{<br>&nbsp;&nbsp;&nbsp; const char *url;<br>&nbsp;&nbsp;&nbsp; std::string sts;<br>&nbsp;&nbsp;&nbsp; if (!PyArg_ParseTuple(args, "s", &amp;url))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL;<br>&nbsp;&nbsp;&nbsp; sts = Recognise_Img(url);<br>&nbsp;&nbsp;&nbsp; return Py_BuildValue("s", sts.c_str() );<br>}<br>static PyMethodDef AllMyMethods[] = {<br>&nbsp;&nbsp;&nbsp; {"Recognise",&nbsp; Recognise, METH_VARARGS},//暴露给Python的函数<br>&nbsp;&nbsp;&nbsp; {NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Sentinel */<br>};<br>extern "C" PYUTIL_API void initpyUtil()<br>{<br>&nbsp;&nbsp;&nbsp; PyObject *m, *d;<br>&nbsp;&nbsp;&nbsp; m = Py_InitModule("pyUtil", AllMyMethods); //初始化本模块，并暴露函数<br>&nbsp;&nbsp;&nbsp; d = PyModule_GetDict(m);<br>}</p>
<p>在Python代码中调用这个动态链接库： (记得把dll的扩展名改为.pyd，另外dll的路径要能够被检索到)<br>import pyUtil<br>result = pyUtil.Recognise("input url of specific data")<br>print "the result is: "+ result</p>
<p>&nbsp;</p>
<p>2、使用boost.python库来构建dll<br>用C++为Python写扩展时，如果您愿意使用Boost.Python库的话，开发过程会变得更开心J，要编写一个与上述pyUtil同样功能</p>
<p>的动态链接库，只需把文件内容替换为下面的代码。当然，编译需要boost_python.lib支持，运行需要boost_python.dll支持</p>
<p>。 <br>#include&lt;string&gt;<br>#include &lt;boost/python.hpp&gt;<br>using namespace boost::python;<br>#pragma comment(lib, "boost_python.lib")<br>std::string strtmp;<br>char const* Recognise(const char* url)<br>{<br>&nbsp;&nbsp;&nbsp; strtmp ="从dll中返回的数据... : ";<br>&nbsp;&nbsp;&nbsp; strtmp+=url;<br>&nbsp;&nbsp;&nbsp; return strtmp.c_str();<br>}<br>BOOST_PYTHON_MODULE(pyUtil)<br>{<br>&nbsp;&nbsp;&nbsp; def("Recognise", Recognise);<br>}</p>
<p>可以非常明显地看到，用了boost.python库之后，简单了很多。因为boost.python为你做了很多的事情。。恩。</p>
<p>&nbsp;</p>
<p>好像没有讲很多有用的东西，光顾着讲了，呵呵。。。我也还在继续学习之中。下次写点什么呢？继续学习了哦</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/25662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-06-06 16:25 <a href="http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门4 之 Boost.Python</title><link>http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 01 Jun 2007 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/25254.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/25254.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/25254.html</trackback:ping><description><![CDATA[<p>坏境python25 + vs2005 (2005真耗资源阿。。。)</p>
<p>有一段时间没写blog了。这几天都在研究怎么封装c++，让python可以用c++的库。在网上发现了boost.python这个好咚咚。不</p>
<p>过在使用过程中碰到一点问题。本文教大家如何把</p>
<p>char const* greet()<br>{<br>&nbsp;&nbsp; return "hello, world";<br>}</p>
<p>封装成python。实际上这是python教程里面的咚咚。</p>
<p><br>首先下载Boost，<a href="http://www.boost.org/">www.boost.org</a>。boost.python在boost里面了。在visual studio 2005 command prompt中navigation到</p>
<p>boost\boost_1_34_0\下。记得一定要用visual studio 2005 command prompt这个vs2005带的tools，不要用cmd.exe，否则会</p>
<p>碰到很多错误的。然后就是把bjam.exe拷贝到一个能被找到的目录下，或者直接也拷贝到boost\boost_1_34_0\下即可。然后，</p>
<p>设置python的根目录和python的版本，也可直接把它们加到坏境目录中，那样就不用每次都设置一下。<br>set PYTHON_ROOT=c:/python25<br>set PYTHON_VERSION=2.5</p>
<p>接着就可以直接运行了，bjam -sTOOLS=vc-8_0<br>整个编译过程要很长时间。。。</p>
<p>成功之后，就会有好多个boost_python-vc80-****.dll,.lib的，把他们都拷贝到一个能被系统找到的目录，不妨直接把他们都</p>
<p>扔到c:\windows\system32下。</p>
<p>接着，我们开始编译hello。navigation到boost\boost_1_34_0\libs\python\example\tutorial下，bjam -sTOOLS=vc-8_0运行</p>
<p>，在bin的目录下即会生成hello.pyd。这下就基本成功了，如果没成功的话，check一下上面boost_python的那些dll能否被系</p>
<p>统找到。另外，这里有python25的一个bug。。。我花了很长时间才在python的mail lists中找到了。寒。。。</p>
<p>错误如下所示：<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\tutorial&gt;bjam<br>Jamroot:17: in modules.load<br>rule python-extension unknown in module Jamfile&lt;/D:/Learn/Python/boost/boost_1_3<br>4_0/libs/python/example/tutorial&gt;.<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2/build\project.jam:312: in load<br>-jamfile<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2/build\project.jam:68: in load<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2/build\project.jam:170: in proj<br>ect.find<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2\build-system.jam:237: in load<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\..\..\..\tools\build\v2/k<br>ernel\modules.jam:261: in import<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\..\..\..\tools\build\v2/k<br>ernel/bootstrap.jam:132: in boost-build<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\boost-build.jam:7: in mod<br>ule scope</p>
<p>解决办法如下：<br>在boost\boost_1_34_0\tools\build\v2\目录下找到user-config.jam文件，打开在<br>import toolset : using ;<br>下面加一行代码：<br>using python ;<br>再重新编译一下boost，然后就没问题了。tutorial里面的hello能顺利编译通过。ps.这个问题困扰了我好长时间。。sigh。。</p>
<p>。</p>
<p>编译成功后会产生一个hello.pyd，在bin的目录下面。</p>
<p><br>有好多办法测试此hello.pyd是否可以用。<br>方法一，把它拷贝到python25\dlls下，打开IDLE，<br>&gt;&gt;&gt; import hello<br>&gt;&gt;&gt; hello.greet()<br>'hello, world'<br>&gt;&gt;&gt; <br>方法二，直接在当前目录下写一个python文件，然后直接调用hello.pyd即可。总之，hello.pyd就是一个python文件了。。嗯</p>
<p>。操作hello.pyd根其他python文件是一样的。<br>这样就成功了。</p>
<p>如果碰到如下错误，是因为系统找不到boost_python的dll。强烈建议把他们都扔到system32下！。</p>
<p>&gt;&gt;&gt; import hello</p>
<p>Traceback (most recent call last):<br>&nbsp; File "&lt;pyshell#0&gt;", line 1, in &lt;module&gt;<br>&nbsp;&nbsp;&nbsp; import hello<br>ImportError: DLL load failed: 找不到指定的模块。<br>&gt;&gt;&gt; </p>
<p><br>说明，hello.cpp在boost\boost_1_34_0\libs\python\example\tutorial目录下。里面的内容是：</p>
<p>//&nbsp; Copyright Joel de Guzman 2002-2004. Distributed under the Boost<br>//&nbsp; Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt <br>//&nbsp; or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)<br>//&nbsp; Hello World Example from the tutorial<br>//&nbsp; [Joel de Guzman 10/9/2002]</p>
<p>char const* greet()<br>{<br>&nbsp;&nbsp; return "hello, world";<br>}</p>
<p>#include &lt;boost/python/module.hpp&gt;<br>#include &lt;boost/python/def.hpp&gt;<br>using namespace boost::python;</p>
<p>BOOST_PYTHON_MODULE(hello)<br>{<br>&nbsp;&nbsp;&nbsp; def("greet", greet);<br>}</p>
<p><br>其中<br>BOOST_PYTHON_MODULE(hello)<br>{<br>&nbsp;&nbsp;&nbsp; def("greet", greet);<br>}<br>是对greet从c++向python的一个封装声明吧，装换就交给boost了。</p>
<p>&nbsp;</p>
<p>先写到这里了。下次再写。。嗯<br></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/25254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-06-01 10:32 <a href="http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门3</title><link>http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 17 May 2007 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/24286.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/24286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/24286.html</trackback:ping><description><![CDATA[<p>这次主要讲讲怎么把python中的class嵌入到c++中去。<br>顺便讲讲元组的操作和怎么编译python源代码。</p>
<p>1. 首先讲讲元组的操作<br>由于参数是通过元组传进去的，所以我们不能老是通过Py_BuildValue这个函数来操作元组，那样太不方便了。<br>Python提供了元组相关的操作，下面这个例子演示了如何操作。主要是下面几个函数：<br>//new一个元组，传入size<br>pArgs = PyTuple_New(argc - 3);&nbsp;<br>//set元组的直，第一个为元组，第二个为index（从0开始），第三个为value<br>PyTuple_SetItem(pArgs,0,Py_BuildValue("i",2000) );<br>PyTuple_SetItem(pArgs,1,Py_BuildValue("i",8) );</p>
<p>来自python doc的一个例子</p>
<p>#include &lt;Python.h&gt;<br>int<br>main(int argc, char *argv[])<br>{<br>&nbsp;&nbsp;&nbsp; PyObject *pName, *pModule, *pDict, *pFunc;<br>&nbsp;&nbsp;&nbsp; PyObject *pArgs, *pValue;<br>&nbsp;&nbsp;&nbsp; int i;</p>
<p>&nbsp;&nbsp;&nbsp; if (argc &lt; 3) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Usage: call pythonfile funcname [args]\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; Py_Initialize();<br>&nbsp;&nbsp;&nbsp; pName = PyString_FromString(argv[1]);<br>&nbsp;&nbsp;&nbsp; /* Error checking of pName left out */</p>
<p>&nbsp;&nbsp;&nbsp; pModule = PyImport_Import(pName);<br>&nbsp;&nbsp;&nbsp; Py_DECREF(pName);</p>
<p>&nbsp;&nbsp;&nbsp; if (pModule != NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFunc = PyObject_GetAttrString(pModule, argv[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* pFunc is a new reference */</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pFunc &amp;&amp; PyCallable_Check(pFunc)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pArgs = PyTuple_New(argc - 3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; argc - 3; ++i) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pValue = PyInt_FromLong(atoi(argv[i + 3]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!pValue) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pArgs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pModule);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Cannot convert argument\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* pValue reference stolen here: */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyTuple_SetItem(pArgs, i, pValue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pValue = PyObject_CallObject(pFunc, pArgs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pArgs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pValue != NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Result of call: %ld\n", PyInt_AsLong(pValue));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pValue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pFunc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pModule);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Call failed\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (PyErr_Occurred())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_XDECREF(pFunc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pModule);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Py_Finalize();<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p><br>2. class操作<br>把下面加入到test2.py中去。定义了一个很简单的类，有一个name成员变量，一个printName成员函数<br>class TestClass:<br>&nbsp;&nbsp;&nbsp; def __init__(self,name):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.name = name</p>
<p>&nbsp;&nbsp;&nbsp; def printName(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print self.name</p>
<p>cpp文件<br>#include &lt;python.h&gt;<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pArg&nbsp;&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pClass&nbsp; = NULL;<br>&nbsp;PyObject * pObject = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test2");<br>&nbsp;pClass&nbsp; = PyObject_GetAttrString(pModule, "TestClass");//得到那个类<br>&nbsp;pArg = PyTuple_New(1);<br>&nbsp;PyTuple_SetItem(pArg, 0, Py_BuildValue("s", "Jacky"));<br>&nbsp;pObject = PyEval_CallObject(pClass, pArg);//生成一个对象，或者叫作实例</p>
<p>&nbsp;pFunc = PyObject_GetAttrString(pObject, "printName");//得到该实例的成员函数<br>&nbsp;PyEval_CallObject(pFunc, NULL);//执行该实例的成员函数</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p><br>没有什么资料，就先写到这里了。下面介绍一下怎么build python25的源代码</p>
<p>3. 编译python源代码<br>为什么要编译呢？因为没有python25_d.lib！呵呵。顺便可以了解一下代码结构。<br>解压缩后，有好多目录，其中pcbuild和pcbuild8是我们要的。pcbuild对应着vc7.1的,pcbuild8对应着vc8.0的<br>因为在用vc7.1，也就是2003了。所以我就说说怎么用2003来编译吧。事实上是从一位牛人那里学来的</p>
<p><a href="http://blog.donews.com/lemur/archive/2005/12/17/660973.aspx">http://blog.donews.com/lemur/archive/2005/12/17/660973.aspx</a>，那位大哥大概一年半前就在解剖python了，厉害</p>
<p>阿。看来我只能后来居上了，娃哈哈。我按照他说的试了一下，编译成功！</p>
<p>不过遇到一点小问题，用vc2003打开那个solution的时候，发现作者没有把source code control去掉，郁闷！害的我</p>
<p>们打开的时候一堆messagebox。不过不用管它就好了，一直确定。最后试了一下那个python25_d.lib，没问题。不过记</p>
<p>得把python25_d.dll copy到一个能被找到的目录，比如说c:\windows\system32\下面。python25.dll也在这个目录下</p>
<p>面。over。恩。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/24286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-05-17 15:16 <a href="http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门2</title><link>http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 17 May 2007 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/24276.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/24276.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/24276.html</trackback:ping><description><![CDATA[<p>1. 一个有一个参数的例子</p>
<p>python文件<br>#Filename test2.py</p>
<p>def Hello(s):<br>&nbsp;&nbsp;&nbsp; print "Hello, world!"<br>&nbsp;&nbsp;&nbsp; print s</p>
<p>cpp文件<br>#include &lt;python.h&gt;<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pArg&nbsp;&nbsp;&nbsp; = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test2");<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Hello");<br>&nbsp;pArg&nbsp;&nbsp;&nbsp; = Py_BuildValue("(s)", "function with argument");</p>
<p>&nbsp;PyEval_CallObject(pFunc, pArg);</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p>注意，参数要以tuple元组形式传入。因为这个函数只要一个参数，所以我们直接使用(s)构造一个元组了。</p>
<p>2. 一个有两个参数的例子</p>
<p>python文件中加入以下代码，一个加函数<br>def Add(a, b):<br>&nbsp;&nbsp;&nbsp; print "a+b=", a+b</p>
<p>cpp文件，只改了两行，有注释的那两行<br>#include &lt;python.h&gt;<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pArg&nbsp;&nbsp;&nbsp; = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test2");<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Add");//终于告别hello world了，开始使用新的函数<br>&nbsp;pArg&nbsp;&nbsp;&nbsp; = Py_BuildValue("(i,i)", 10, 15);//构造一个元组</p>
<p>&nbsp;PyEval_CallObject(pFunc, pArg);</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p>其它的就类似了。。。基本上，我们知道了怎么在c++中使用python中的函数。接下来学习一下如何使用python中的</p>
<p>class。</p>
<p>附：Py_BuildValue的使用例子，来自python documentation：</p>
<p>&nbsp;&nbsp;&nbsp; Py_BuildValue("")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; None<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("i", 123)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 123<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("iii", 123, 456, 789)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123, 456, 789)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("s", "hello")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'hello'<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("ss", "hello", "world")&nbsp;&nbsp;&nbsp; ('hello', 'world')<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("s#", "hello", 4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'hell'<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("()")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ()<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("(i)", 123)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123,)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("(ii)", 123, 456)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123, 456)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("(i,i)", 123, 456)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123, 456)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("[i,i]", 123, 456)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [123, 456]<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("{s:i,s:i}",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "abc", 123, "def", 456)&nbsp;&nbsp;&nbsp; {'abc': 123, 'def': 456}<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("((ii)(ii)) (ii)",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 2, 3, 4, 5, 6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (((1, 2), (3, 4)), (5, 6))<br></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/24276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-05-17 11:28 <a href="http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门1</title><link>http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 17 May 2007 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/24269.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/24269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/24269.html</trackback:ping><description><![CDATA[<p>本人是用vc2003+python2.5学习的，其它的也应该差不了多少</p>
<p>0. 坏境设置<br>把python的include/libs目录分别加到vc的include/lib directories中去。另外，由于python没有提供debug lib，体地说，就是没有提供python25_d.lib了。你可以自己编译python的源代码来得到python25_d.lib的，偶还没试过，呵呵。而且网上找了一下也没下载到。所以，如果你想要在debug下运行程序的话，你要把pyconfig.h（在python25/include/目录下）的大概是在283行，把pragma comment(lib,"python25_d.lib")改成pragma comment(lib,"python25.lib")，让python都使用非debug lib.</p>
<p>1. 开始编程了<br>#include &lt;python.h&gt;<br>第一步就是包含python的头文件</p>
<p>2. 看一个很简单的例子<br>1)python文件test.py，很简单的定义了一个函数</p>
<p>#Filename test.py<br>def Hello():<br>&nbsp;&nbsp;&nbsp; print "Hello, world!"</p>
<p>这个应该能看懂的吧？否则的话，回去再练练python吧，呵呵。《简明Python教程》Swaroop, C. H. 著。沈洁元&nbsp; 译。</p>
<p><br>2)cpp文件</p>
<p>#include &lt;python.h&gt; //包含头文件，在c++中嵌入python，这是必须的<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test");<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Hello");<br>&nbsp;PyEval_CallObject(pFunc, NULL);</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p>第一步还是包含头文件</p>
<p>第二步，使用python之前，要调用Py_Initialize();这个函数进行初始化。<br>帮助文档中如是说：<br>The basic initialization function is Py_Initialize(). This initializes the table of loaded modules, and creates the fundamental modules __builtin__, __main__, sys, and exceptions. It also initializes the module search path (sys.path). </p>
<p>反正，一开始你一定要调用。</p>
<p>第三步，声明一些Python的变量，PyObject类型的。其实声明也可放在前面，这个倒是无所谓的。</p>
<p>第四步，import module，也就是你的脚本名字，不需要加后缀名，否则会出错的。</p>
<p>第五步，从你import进来的module中得到你要的函数<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Hello");<br>上面的例子已经够清楚的了，最后一个是你要得到的函数的名字</p>
<p>第六步，调用PyEval_CallObject来执行你的函数，第二个参数为我们要调用的函数的函数，本例子不含参数，所以设置为NULL。</p>
<p>第七步，调用Py_Finalize，这个根Py_Initialize相对应的。一个在最前面，一个在最后面。</p>
<p>&nbsp;</p>
<p>第一次写教程。这个例子非常简单，本人也还在学习当中阿，只能保证大家能够把这个例子运行起来。建议大家去看python的documentaion，里面有讲怎么embedding python的。先写到这里，其实目前也只学到这么多，呵呵。下次学了更多以后再写。Over。恩。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/24269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-05-17 11:03 <a href="http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>认识理解volatile关键字</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Wed, 04 Apr 2007 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21233.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21233.html</trackback:ping><description><![CDATA[<span>这个关键字告诉编译器不要持有变量的临时性拷贝。它可以适用于基础类型，如</span>int<span>或</span>long<span>，也适用于一整个</span>c<span>结构或</span>c++<span>类。</span>
<p><span>为什么要有这个关键字呢？因为编译器在优化的时候，会把常用到的数据放在</span>CPU<span>的内部寄存器中。数据从寄存器中读取，远比从内存中读取要快！但是，如果另一个线程改变了内存中的变量值，那么此变量在寄存器中的值就过期了。</span></p>
<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-04 14:15 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>链接器都干了些什么？</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 29 Mar 2007 11:10:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20891.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20891.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前项目在不停的增长，我想还是在它规模仍旧很小的时候把它的模块分清楚，不同模块分到不同的				projects				里面，这里面出现了很多问题，也反映了我知识上的很多不足。								1				，				project				最后的输出要设置清楚，有的是				static lib				，有的是				dll				，有的是				ex...&nbsp;&nbsp;<a href='http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html'>阅读全文</a><img src ="http://www.cppblog.com/jacky2019/aggbug/20891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-29 19:10 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编译选项学习</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Mon, 19 Mar 2007 16:42:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20176.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20176.html</trackback:ping><description><![CDATA[
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
				<span lang="EN-US">
						<span>1、</span>
				</span>
				<span style="FONT-FAMILY: 宋体">如何判断是</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">位的还是</span>
				<span lang="EN-US">64</span>
				<span style="FONT-FAMILY: 宋体">位的</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 0cm">
				<span lang="EN-US">/* Find the arch type */<br />#if defined(__x86_64__) || defined(_M_X64)<br />#  </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">64</span>
				<span style="FONT-FAMILY: 宋体">位的</span>
				<span lang="EN-US">
						<br />#else<br />#  </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">位的</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 0cm">
				<span lang="EN-US">
						<?xml:namespace prefix = o /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
				<span lang="EN-US">
						<span>2、</span>
				</span>
				<span style="FONT-FAMILY: 宋体">如何判断使用的是什么编译器</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 0cm">
				<span lang="EN-US">#if defined( _MSC_VER )<br />#   </span>
				<span style="FONT-FAMILY: 宋体">说明是微软的</span>
				<span lang="EN-US">vc</span>
				<span style="FONT-FAMILY: 宋体">编译器</span>
				<span lang="EN-US">
						<br />#elif defined( __GNUC__ )<br />#   </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">GNU</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">
						<br />#elif defined( __BORLANDC__ )<br />#   </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">borland</span>
				<span style="FONT-FAMILY: 宋体">的</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/20176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-20 00:42 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再次探讨双分派double dispatch</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 13 Mar 2007 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/19755.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/19755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/19755.html</trackback:ping><description><![CDATA[前几次写了一下关于c++不支持多分派（包括双分派）的问题，应该说是学习了，本人还是个菜鸟啊。<br />发现我自己把多分派给搞复杂了！其实双分派这个概念也是从学visitor模式看到的，其意义在于接受者和参数都能在运行时决定它的类型，但是c++只支持单分派，也就是说参数的类型将在编译阶段决定。所以其实想要演示一下这个问题的话，其实，是非常简单的！如下：<br />///////////////////////////////////////////////////////////////////<br />#include &lt;iostream&gt;<br />using namespace std;<br /><br />class BE;<br /><br />//B<br />class B<br />{<br />public:<br /> void virtual output(B * b){cout &lt;&lt; "B:B" &lt;&lt; endl;}<br /> void virtual output(BE * be){cout &lt;&lt; "B:BE" &lt;&lt; endl;}<br />};<br />class BE : public B<br />{<br />public:<br /> void output(B * b){cout &lt;&lt; "BE:B" &lt;&lt; endl;}<br /> void output(BE * be){cout &lt;&lt; "BE:BE" &lt;&lt; endl;}<br />};<br /><br />int main()<br />{<br />    B * p1 = new BE;<br />    B * p2 = new BE;<br />    p1-&gt;output(p2);<br /> <br /> return 0;<br />}<br />///////////////////////////////////////////////////////////////////<br />如果参数能够在运行时决定类型的话，那么输出来的信息应该是BE:BE，因为p2的实际类型是BE。但是，事实上输出来的结果是BE:B。也就是说p2的类型被误解为B了！这就是问题的所在了。<br />把简单的事情搞复杂了，那真是折腾啊，呵呵。<br />Over。<br /><br /><br /><img src ="http://www.cppblog.com/jacky2019/aggbug/19755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-13 16:02 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++只支持单分派(single dispatch) 探讨2</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 13 Mar 2007 03:36:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/19704.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/19704.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/19704.html</trackback:ping><description><![CDATA[上次写了一下，结果漏洞百出，sigh。不过在高手的批评下，本人再多try了几下，似乎又明白了不少，呵呵。如果有问题，请各位高手不吝赐教。谢谢哈！<br />下面演示了一下c++不支持双分派。一共有四各类，A, AD, B, BE, 其中AD是A的子类，BE是B的子类。他们都有一个叫output的函数（函数名不一定要一样的）。问题出现在哪里呢？问题出现在A或AD类中output函数里的b-&gt;output(a);这个语句。其中b是能够动态track到他自己的类型的，但是a就不行了！因为它已经被静态绑定到A类型了，所以输出结果是：<br />output信息：<br />///////////////////////////////<br />AD:BE<br />BE:A //如果正确的话，这里应该输出BE:AD<br />AD:B<br />B:A  //如果正确的话，这里应该输出B:AD<br /><br />AD:BE<br />BE:A<br />A:B<br />B:A<br /><br />///////////////////////////////<br />现在把接口改成AD*a, 显示出错信息：<br />error: invalid conversion from `A*' to `AD*'<br />///////////////////////////////<br /><br />现在把b-&gt;output(a)改成b-&gt;output(this)，输出结果如下：<br />AD:BE<br />BE:AD<br />AD:B<br />B:AD<br /><br />AD:BE<br />BE:A<br />A:B<br />B:A<br />///////////////////////////////<br />结果就正确了！因为this显然已经指向了正确的类型，而且也没有经过中间步骤地转换，所以其信息还是能够runtime找到的。<br />over。<br /><br />不知上面的解释是否正确，如果有问题，请各位高手赐教了。小弟先谢谢了。<br /><br /><br /><br />代码如下：<br />////////////////////////////////////<br />#include &lt;iostream&gt;<br />#include &lt;list&gt;<br />using namespace std;<br /><br />class A;<br />class AD;<br />//B<br />class B<br />{<br />public:<br /> void virtual output(A * a){cout &lt;&lt; "B:A" &lt;&lt; endl;}<br /> void virtual output(AD * ad){cout &lt;&lt; "B:AD" &lt;&lt; endl;}<br />};<br />class BE : public B<br />{<br />public:<br /> void output(A * a){cout &lt;&lt; "BE:A" &lt;&lt; endl;}<br /> void output(AD * ad){cout &lt;&lt; "BE:AD" &lt;&lt; endl;}<br />};<br /><br />//A<br />class A<br />{<br />public:<br /> void virtual output(B * b, A * a){cout &lt;&lt; "A:B" &lt;&lt; endl;b-&gt;output(a);}<br /> void virtual output(BE * b, A * a){cout &lt;&lt; "A:BE" &lt;&lt; endl;b-&gt;output(a);}<br />};<br />class AD : public A<br />{<br />public:<br /> void output(B * b, A * a){cout &lt;&lt; "AD:B" &lt;&lt; endl;b-&gt;output(a);}<br /> void output(BE * b, A * a){cout &lt;&lt; "AD:BE" &lt;&lt; endl;b-&gt;output(a);}<br />};<br /><br />int main()<br />{<br />    A * pAD = new AD;<br />    pAD-&gt;output(new BE, pAD);<br />    pAD-&gt;output(new B, pAD);<br /><br />cout&lt;&lt;endl;<br /><br />    A * pA = new A;<br />    pA-&gt;output(new BE, pA);<br />    pA-&gt;output(new B, pA);<br /> <br /> return 0;<br />}<br /><br /><img src ="http://www.cppblog.com/jacky2019/aggbug/19704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-13 11:36 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++只支持单分派(single dispatch)</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 09 Mar 2007 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/19476.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/19476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/19476.html</trackback:ping><description><![CDATA[
		<div class="sysBr500 text" id="articleText4b419a3f010008sa" align="left">
				<div>第三个版本了！居然有搞错了。原本以为已经理解了多分派，写出来以后才知道问题那么多！所以说要多实践，多和高手讨论讨论阿。<br />如果还有问题，请大家不吝赐教。谢谢哈！<br />#include &lt;iostream&gt;<br />#include &lt;list&gt;<br />using namespace std;<br />//B<br />class B<br />{<br />};<br />class BE : public B<br />{<br />};</div>
				<div>//A<br />class A<br />{<br />public:<br /> void virtual output(B * b){cout &lt;&lt; "A:B" &lt;&lt; endl;}<br /> void virtual output(BE * b){cout &lt;&lt; "A:BE" &lt;&lt; endl;}<br />};<br />class AD : public A<br />{<br />public:<br /> void output(B * b){cout &lt;&lt; "AD:B" &lt;&lt; endl;}<br /> void output(BE * b){cout &lt;&lt; "AD:BE" &lt;&lt; endl;}<br />};</div>
				<div>int main()<br />{<br /> A * pA = new AD;<br /> pA-&gt;output(new BE);<br /> list&lt;B*&gt; * listb = new list&lt;B*&gt;();<br /> listb-&gt;push_back(new BE);<br /> pA-&gt;output(listb-&gt;back());<br /> <br /> return 0;<br />}</div>
				<div>
						<br />////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><font color="#ff0000">以下有问题！！</font><br />居然写错了！哈哈。谢谢各位大哥的评论阿。这个代码是我以前写的，我还以为是正确的。。。晕了。哈哈<br />下面的代码是改过以后的，不知道还有没有问题？希望各位多提意见哈<br />#include &lt;iostream&gt;<br />using namespace std;<br />//B<br />class B<br />{<br />public:<br /> virtual void print()<br /> {cout &lt;&lt; "B" &lt;&lt; endl;}<br />};<br />class BE : public B<br />{<br />public:<br /> void print()<br /> {cout &lt;&lt; "BE" &lt;&lt; endl;}<br /> void print(int i)<br /> {cout &lt;&lt; "BE:" &lt;&lt; i &lt;&lt; endl;}<br />};<br /><br />//A<br />class A<br />{<br />public:<br /> void output(int i)<br /> {<br />     B * b = new B;<br />     B * be = new BE;<br />     b-&gt;print();<br />     be-&gt;print();<br />     be-&gt;print(i);//问题出现在这里！！！如改为((BE*)be)-&gt;print(i)就OK了。<br /> }<br />};<br /><br />int main()<br />{<br /> A a;<br /> a.output(99);<br /> <br /> return 0;<br />}<br /><br />--------------------Configuration: test - Debug--------------------<br />Compiling source file(s)...<br />test.cpp<br />test.cpp: In member function `void A::output(int)':<br />test.cpp:29: error: no matching function for call to `B::print(int&amp;)'<br />test.cpp:8: note: candidates are: virtual void B::print()<br /><br />test.exe - 2 error(s), 0 warning(s)<br /><br /><br /><br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br /><font color="#ff0000">以下代码有问题！</font><br /></div>
				<div>////////////////////////////////////////////////////////////////////////////////////////////////////// <br /></div>
				<div>c++不支持双分派(double dispatch)和多分派(multi-dispatch)，只支持单分派(single dispatch)。一个典型的不支持双分派的例子如下所示：<br />#include &lt;iostream&gt;<br />using namespace std;</div>
				<div>class B<br />{<br />public:<br /> virtual void print()<br /> {cout &lt;&lt; "c" &lt;&lt; endl;}<br />};</div>
				<div>class E1 : public B<br />{<br />public:<br /> void print()<br /> {cout &lt;&lt; "E1" &lt;&lt; endl;}</div>
				<div>};</div>
				<div>class E2 : public B<br />{<br />public:<br /> void print()<br /> {cout &lt;&lt; "E2" &lt;&lt; endl;}</div>
				<div>};</div>
				<div>class A<br />{<br />public:<br /> virtual void output(B* p)<br /> {cout &lt;&lt; "A" &lt;&lt; endl;p-&gt;print();}<br />};</div>
				<div>class D1 : public A<br />{<br />public:<br /> void output(B* p)<br /> {cout &lt;&lt; "D1" &lt;&lt; endl;p-&gt;print();}<br />};</div>
				<div>class D2 : public A<br />{<br />public:<br /> void output(B* p)<br /> {cout &lt;&lt; "D2" &lt;&lt; endl;p-&gt;print();}<br />};</div>
				<div>void f(A* p, B* q)<br />{<br /> p-&gt;output(q);<br />}</div>
				<div>int main()<br />{<br /> A * pd1 = new D1;<br /> B * pe1 = new E1;<br /> <br /> f(pd1, pe1);<br /> <br /> end:<br /> int end;<br /> cin &gt;&gt; end;<br /> return 0;<br />}</div>
		</div>
<img src ="http://www.cppblog.com/jacky2019/aggbug/19476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-09 10:36 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>