<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[我是程序员   -Shosh's Blog]]></title>
<link>http://www.wscxy.com/shosh/</link>
<description><![CDATA[]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[shosh.zhu@qisda.com(shosh)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>我是程序员   -Shosh&#39;s Blog</title>
	<url>http://www.wscxy.com/shosh/images/logos.gif</url>
	<link>http://www.wscxy.com/shosh/</link>
	<description>我是程序员   -Shosh&#39;s Blog</description>
</image>

			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=126</link>
			<title><![CDATA[头文件的部分规则：重定义相关]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[C/C++]]></category>
			<pubDate>Thu,28 Jan 2010 00:32:30 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=126</guid>
		<description><![CDATA[Author: Shosh<br/>Site: <a href="http://www.wscxy.com" target="_blank" rel="external">http://www.wscxy.com</a><br/><br/>RULE1: 每个头文件都用以下宏包起来，防止被其他文件多次包含。<br/>&nbsp;&nbsp;&nbsp;&nbsp;#ifndef __FILENAME_H__<br/>&nbsp;&nbsp;&nbsp;&nbsp;#define __FILENAME_H__<br/>&nbsp;&nbsp;&nbsp;&nbsp;（……文件内容……）<br/>&nbsp;&nbsp;&nbsp;&nbsp;#endif //__FILENAME_H__<br/><br/>RULE2: 在定义一个宏的时候，考虑是否需要检测是否已经被定义过。<br/>&nbsp;&nbsp;&nbsp;&nbsp;#ifndef MACRO_NAME<br/>&nbsp;&nbsp;&nbsp;&nbsp;#define MACRO_NAME&nbsp;&nbsp;&nbsp;&nbsp; MACRO_VALUE<br/>&nbsp;&nbsp;&nbsp;&nbsp;#endif<br/><br/>RULE3：头文件中不要去定义全局变量，也就是说头文件中的所有语句不能涉及实际内存的分配。<br/><br/>对于RULE1，基本上大家都会这么做，当然也可以用pragma once来代替，只是pragma once的通用性不好，所以大家大多选择比较麻烦一点的RULE1中的做法。RULE1不是我想说的重点。<br/><br/>RULE2主要是为了防止宏重定义。在同一个工程中，尤其是一较大的工程中，同一个名字的宏在多个文件被定义是很正常的，比如BREW中RELEASEIF往往在多处被定义。在VC的编译器中，即使重定义也不会报错，甚至连Warning都没有，但是TCC会作为Error来处理。<br/>举例：a.h中定义了宏A，b.h中也定义了宏A，他们都没有用ifndef包起来。然后某个源文件同时包含了这两个文件。对于严格的编译器来说，会出现重定义的错误，而对于检查较松的编译器，后者的定义会覆盖前者的定义（有的时候不同地方对同一个宏的定义不同）。有的时候，某些头文件我们需要包含进来，但是我们不关心那些头文件有没有已经定义了自己想要定义的宏或者自己想要定义的宏名被那些头文件定义成了什么样子，我们可以先undef掉那个宏，然后再定义自己的宏，这样可以保证自己用的宏是自己想要的定义。用RULE2的做法确实存在这样一个问题，我们不能确定自己用的宏是什么样子的（和包含的头文件以及它们的顺序有关系，这意味着本来都正常的代码，忽然有一天你又把另外一个头文件包含进来，结果这个宏的定义可能就不再是原来的那个了）。如果需要确认，可以让编译器生成预处理后的文件查看，不过一般情况下不需要这么做。<br/><br/>今天有个同事碰到了这样一个问题，让我过去帮他看看：我看到的错误是说某个头文件的某个宏重定义了。据他描述是因为他在某个C源文件里包含了多个头文件导致的。可是这些被他包含进来的头文件中却没有那个提示出错的头文件，另外这个重定义的宏对他来说一点用也没有。当时我怎么也没想不明白，既然没有包含进那个出错的头文件，怎么会是因为加了这一堆头文件导致的，就算是有重定义的错误也该发生在这些被包含进来的头文件才对呀。原来这些被包含的头文件往往又会包含其它头文件，这样扩展开来是类似树状的结构，一种情况是那个出错的文件被这些头文件直接或间接地包含进来了一次，但是还有其他被比较或间接包含进来的进来的头文件也同时定义了这个宏，只是那个出错的文件被包含的顺序比较靠后一点，所以出错并提示该头文件的那个宏重定义；另一种情况是这个这个出错的头文件被间接地包含了多次，并且这个头文件没有用RULE1去做，当然这种可能性很小。解决该问题的方法是找到去找到被他包含进来的（包括间接包含进来的）的头文件哪里定义了这个宏，却没有用RULE2去定义的。但是这样找很多文件，即使使用Source Insight搜索到所有的包含该宏定义的头文件，也要去确认那些头文件是否属于被他包含的头文件之列，比较麻烦。如果使用#error通过二分法查找，需要不停地编译数次可以找到。另一种方法是在他的某处合适的头文件包含语句之间添加#undef那个宏的语句，可以解决掉这个问题（别人忽然看到可能会觉得奇怪，如果找到精确位置还是要一定功夫的，如果每个包含头文件语句之间都添加这样的语句，会显得很冗赘）。还有专门的工具可以生成文件包含关系，如果手头有这样的工具的话，找起来还是很方便的。<br/><br/>RULE3比较容易理解：如果没有遵循RULE3的头文件被多个源文件包含的时候，链接的时候编译器就会发现不知道该使用哪个符号了。<br/><br/>总结：RULE1 是作为预防头文件被重复的做法，虽然能够保证头文件不被重复包含，但是却不能预防宏的重定义。在多文件工程的头文件中，应该按此法去做。RULE2可以有效防止宏的重定义，但是某些检查较松的编译器如VC的CL是允许宏重定义的。RULE2可能会让你使用的宏的实际定义变得模糊，有的时候你可能只想使用自己定义的宏，但是你包含的其他头文件可能会已经包含了这个宏名，可以先undef掉。另外，我们应该尽量避免在不同头文件定义同名的宏，而比较公用的、可能会被多个其他文件包含的头文件应该使用RULE2去定义宏，以防止重定义。RULE3是必须遵循的。]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=125</link>
			<title><![CDATA[杂谈：Brew上的应用开发]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[brew开发]]></category>
			<pubDate>Sun,24 Jan 2010 01:27:38 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=125</guid>
		<description><![CDATA[<p>Author: Shosh<br />
Site: <a href="http://www.wscxy.com/">http://www.wscxy.com</a></p>
<p>对于MMI工程师在BREW上的开发需求，往往是以Applet为单位的。Brew上的Applet就是一个应用程序，和Application的概念类似。</p>
<p>大多数Applet都需要UI界面（Daemon程序的需求往往很少），他们往往需要完成一定的功能，所以有逻辑的部分，如计算器程序，就是要处理用户输入的数据并给出计算结果；另外，我们需要提供显示界面和用户进行交互，越是动感越是绚丽的界面效果越能赢得用户的喜爱。话说回来，MMI层次上开发的应用，逻辑上大多比较简单，不需要复杂的算法。开发者不必了解太多的底层知识和硬件知识，只要有扎实的程序语言开发功底（BREW上多数用C，也有用C++的），基本上都能写出一般的应用来。另外，逻辑部分的代码变动性不强，而界面效果在不同的工程间则可以相差很大，还是拿计算器程序来举例，我们在不同的手机上看到的计算器程序，有的界面效果看上去很一般，而有的则很漂亮，但是他们完成的功能是差不多的。而对于一个公司来讲，他们往往希望同一套代码能够适应不同工程项目上的需求，这样可以在很大程度上减少工作量。其实这是客制化的一部分，最理想的客制化是不需要修改代码，只要替换图片资源、字符串资源和其他一些资源如音频资源即可达到目的。但是如果差异较大，光靠资源的替换是很难满足需求的，还是需要修改到代码的。我们会希望尽量少地改动到逻辑代码，最好是只需要修改到一些数据，而不用去修改实质性的代码，而功能逻辑上的一致性给了我们一定的可能。说了这么多，其实是说：我们在设计的时候尽量考虑通用性，以提高代码的复用率以及风格变换的简易性。</p>
<p>目前，在Brew上开发界面，主要使用BUIW。在BUIW中，主要有Form, RootForm, Container, Widget, Decorator, Model等概念。下面简单介绍一下这些基本概念：</p>
<p>Model：其实Model是一个用来存放数据的结构。它提供专门的接口让用户设置Model的值或得到Model的值。另外Model还负责维护Listener List，并提供接口允许对象监听它（将Listener加入到Listener List中）。当用户通过Model提供的设置数据的接口改变Model的值的时候，Model就会逐个给监听它的Listener对象发送消息（实际上是直接调用Listener注册的回调函数），监听的对象再做出相应的动作，如使用新设置进来的数据更新画面等。其实这里应用了设计模式中的观察者模式（Abserver Pattern）。Model分很多种，比较常用的有Value Model, Interface Model, Vector&nbsp;Model等，不同种类的Model存放的数据类型不同。一般情况下，一个Widget会关联上一种Model，并监听Model数据的改动。</p>
<p>Widget：Widget是BUIW中一个最小的UI元素，可以理解成控件，比如按钮(Button Widget)、图片（Image&nbsp;Widget）、静态文本框（Static&nbsp;Widget）、可编辑文本框（Text Widget）、滚动条（Scroolbar Widget）等。它们会根据需要关联Model，如Static Widget，它需要记录显示的字符串内容，所以会关联一个Value&nbsp;Model，而对于Image&nbsp;Widget，则关联Interface Model。一般Model存放的是一些允许用户设置或修改的数据，比如一个Static Widget，有的时候显示&ldquo;你好&rdquo;，有的时候显示&ldquo;这是一段文本&rdquo;，这些不确定的可随时修改的数据就存放在它关联的Model中。这样当这些数据更改的时候，Model会通知Widget你需要更新你的长相，和你的数据保持同步了。当然监听者对于数据的改动也可以做出不同的反应。</p>
<p>Container：一个个Widget创建好之后，它们该怎么摆放是一个问题。因为Widget只知道自己长什么样子，却不知道自己该站在什么地方。Container就是Widget的家，它是用来组织管理Widget的，一个个Widget会依次插入到Container合适的位置去（什么是合适的位置？就是在这个Container中，除了相对于Container的相对位置以外，还有Z轴方向上的叠放次序，也就是说在垂直于屏幕的方向上，Widget之间还是有先后顺序的，位于上层的Widget有可能挡住位于其下的Widget，这就是Z-Order的概念）。Widget本身是有大小的，Container本身也是有大小的，所谓大小就是矩形区域的意思。所以位于Container中的Widget与它的Parent Container有一定的位置关系，分别是完全位于Container中、与Container一部分相交和完全位于Container外部。位于Container外部的那部分是肯定不会被显示出来的，而位于Container内部的那部分如果在其上没有被其它Widget遮挡住，就可以显示出来。Container同样根据定位方式可以分成以下几种：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYContainer，这是一种最简单的Container，通过Widget的左上角位置和Container的左上角位置的偏移量确定Widget的相对位置。这里水平方向为X方向，向右为正，竖直方向为Y方向，向下为正（一般程序中坐标系都是这么定的）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropContainer：这里的Prop是Proportion的缩写，也就是比例的意思。所以PropContainer实际上就是通过给它包含的Widget在空间上按照比例分配大小来实现定位的。PropContainer需要指定是在X方向上的按比例分配还是Y方向上的按比例分配，不能同时在X方向和Y方向按比例分配。PropContainer的好处是在不同分辨率的情况下，它都能够布局得很好。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConstrainContainer：这是通过约束来实现定位的Container，Widget可以通过相对于Parent Container的上下左右边界的距离或者相对于Sibling Widgets边界的距离进行定位，使用起来比XYContainer和PropContainer都来得复杂，在特殊场合会比较有用，平时一般用得比较少。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CardContainer：CardContainer很特殊，也很简单，因为它只考虑Z方向的叠放次序，而忽略X方向和Y方向的位置距离。它就像一叠堆放整齐的纸牌，我们只能看到最上面的一张，而位于下面的是无法看到的。前面提到的3种Container，其实我们都是在X方向和Y方向对它们进行定位，CardContainer根本不需要，所以它最简单。CardContainer的典型应用是和TabWidget的搭配。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有的Container在Z方向的叠放次序都是在插入的时候指定的。另外，我们可以把一个Container看成是一个比较复杂的Widget，因为我们可以通过ISHELL_QueryInterface(, AEEIID_WIDGET,)获取到与它相应的IWidget*，然后当做是一个简单的Widget调用WIDGET提供的方法。正因为如此，我们可以把Container作为Child Widget插入到另一个Container中，来实现比较复杂的界面组织。也正因为如此，我们可以把Container作为WID_FORM插入到Form中，作为Form的Widget。若不是如此，界面结构将是多么单调，所以对于Container来说，它本身可以作为Widget来使用是极具意义的。</p>
<p>Decorator：Decorator和Container类似，也可以往里面装入Widget，只是Decorator只能往里面装入一个Widget。它也不是用来给Widget布局的，而只是为Widget提供修饰服务的。Decorator同样可以被看成是一个Widget，通过ISHELL_QueryInterface(, AEEIID_WIDGET,)获取到与它相应的IWidget*。MMI在开发Applet设计Form的时候，一般不会用到Decorator。它主要在设计某些Widget的时候被用到，如Border&nbsp;Widget, TabWidget, ScrollbarWidget等。所以这里也不讨论其具体用法。</p>
<p>FORM：比较传统的理解可以这样认为：每个界面差不多都是一个FORM，正常情况下它包括顶上标题Title、底部的软键SoftKeys和中间的那个ID为WID_FORM的Widget（前面提到过了），这个WID_FORM的Widget是Form中最重要的一部分，设计和创建Form的时候，主要在设计和创建这个Widget（前面说过多数情况下它是Container，里面可以包含多个Widget和子Container，这种包含关系是树形结构）。但是其实也可以这么理解，其实Form只是保存着一部分用来显示的信息，包括Title, WID_FORM的Widget和Softkeys等相关的数据；另外一部分重要的功能就是处理事件（IFORM&nbsp;是直接从 IHANDLER继承下来的，本身没有增加任何方法），像IFORM_GetWidget(), IFORM_GetRootForm之类的接口实际上都不是IFORM虚函数表中的实现，都只是普通的inline函数。Form的很多功能包括显示都是依赖RootForm的。</p>
<p>ROOTFORM：比较传统的理解可以这样认为：RootForm继承自Form，基本上每个Applet（只后台运行的Daemon程序除外）都会创建一个属于自己的RootForm，负责维护应用中所有创建出来的Form。事实上，我们看到的Applet画面就是RootForm绘制的，也可以理解成我们看到的是RootForm，因为RootForm才真正创建了........（待续）.......</p>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=124</link>
			<title><![CDATA[最新Android SDK 地址]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[Android开发]]></category>
			<pubDate>Fri,11 Dec 2009 19:09:30 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=124</guid>
		<description><![CDATA[最新Android开发地址： <a href="http://developer.android.com/sdk/index.html" target="_blank" rel="external">http://developer.android.com/sdk/index.html</a><br/>以前在国内这个地址好像是打不开的，不过现在可以了。<br/><br/>Android快速起步（搭建Android环境）<br/>Quick Start：<br/>The steps below provide an overview of how to get started with the Android SDK. For detailed instructions, start with the Installing guide. <br/><br/>0. Prepare your development computer<br/><br/>Read the System Requirements document and make sure that your development computer meets the hardware and software requirements for the Android SDK. Install any additional software needed before downloading the Android SDK. In particular, if you plan to develop Android applications in the Eclipse IDE using the ADT Plugin (see below), make sure that you have the correct version of Eclipse installed. <br/><br/>1. Download and install the SDK starter package<br/><br/>Sel&#101;ct a starter package from the table at the top of this page and download it to your development computer. To install the SDK, simply unpack the starter package to a safe location and then add the location to your PATH. <br/><br/>2. Install the ADT Plugin for Eclipse<br/><br/>If you are developing in Eclipse, set up a remote up&#100;ate site and install the Android Development Tools (ADT) plugin. For detailed instructions, see Installing and Updating ADT.<br/><br/>3. Add Android platforms to your SDK<br/><br/>Use the Android SDK and AVD Manager, included in the SDK starter package, to add one o&#114; more Android platforms (for example, Android 1.6 o&#114; Android 2.0) to your SDK. In most cases, you will want to download multiple platforms, so that you can build your application on the lowest version you want to support, but test against higher versions that you intend the application to run on. Information about each platform is available at left, under &#34;Downloadable SDK Components.&#34;<br/><br/>To launch the Android SDK and AVD Manager on Windows, execute SDK Setup.exe, at the root of the SDK directory. On Mac OS X o&#114; Linux, execute the android tool in the &lt;sdk&gt;/tools/ folder. For more information about how to add platforms and other components, see Adding SDK Components. <br/><br/>4. Get the latest documentation<br/><br/>If you develop while offline, use the Android SDK and AVD Manager to download the latest documentation package. The documentation covers all versions of the API and lets you filter out those versions that your application won&#39;t support. Once installed, the documentation is also available to you directly from the Eclipse IDE. <br/><br/>5. Download other SDK components<br/><br/>You can use the Android SDK and AVD Manager to download other SDK components, such as the SDK add-ons. An SDK add-on provides a development environment for an Android external library o&#114; a customized Android system image. For example, the Google APIs Add-On lets you develop an application that takes advantage of the Google Maps external library. <br/><br/>6. Get started with an application project<br/><br/>Once you&#39;ve set up your SDK, the next step is to start a new application project o&#114; move existing applications into the new SDK.<br/><br/>If you are new to Android, you can use the Hello World tutorial to get started quickly. Next Steps offers other suggestions of how to begin. Welcome!<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=123</link>
			<title><![CDATA[第三章： 进程同步机制]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[操作系统]]></category>
			<pubDate>Sun,15 Nov 2009 02:52:52 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=123</guid>
		<description><![CDATA[<p>第三章： 进程同步机制</p>
<p>3.1 信号量和P、V操作</p>
<p>信号量：表示资源使用情况的一种数据结构</p>
<pre>
struct{
	int n; //正数表示当前可用的资源个数，负数表示等待该种资源的进程个数
	PCB* pcbList; //等待该种资源的进程(PCB)列表
}
</pre>
<p>信号量的值仅由P、V操作来改变 </p>
<p>原语：机器指令的延生，往往是为完成某些特定功能而编制的一段系统程序，其操作具有不可分割性（一次性完成）</p>
<p>P操作P(S)：也叫wait操作，S为相应的信号量</p>
<pre>
S = S - 1;
if (S < 0)
{
    //资源不足，得不到分配的情况
    将本进程链入 S 的队尾；
    阻塞本进程；
}
else
{
    本进程继续执行；
}
</pre>
<p>V操作V(S): 也叫signal操作
<pre>
S = S + 1;
if (S > 0)
{
    //说明目前没有进场在等待该资源
    本进程继续执行；
}
else
{
    //说明有进程在等待该资源
    释放S队列上的第一个PCB；
    本进程继续执行；
}
</pre>
<p>3.2 同步机制的应用</p>
<p>使用PV操作实现进程互斥</p>
<ul>
  <li>在每个进程中，P(mutex)和V（mutex）必须成对出现，并且先P后V</li>
  <li>互斥信号量mutex的初值一般为1</li>
</ul>
<p>使用PV操作实现简单同步</p>
<p>例如 ： 供者和用者共同使用缓冲区的问题 </p>
<p>分析和解答：供者和用者两个需要合作来完成，它们之间的桥梁是缓冲区，它们之间的动作需要按照一定的先后顺序才能顺利进行，它们之间的关系是同步。临界资源是缓冲区，因为供者在向缓冲区写入数据的时候，用者不能从缓冲区读数据，同样，在缓冲区数据写满后，用者开始读缓冲区数据，这时供者不能往缓冲区里写数据，直到用者从缓冲区中取完数据。缓冲区有两个临界状态，一是空了，一是满了。使用两个信号量来表示，E表示空了的状态，F表示满了的状态，初始状态下缓冲区是空着的，所以E = 1, F = 0。对于供者，先用P操作获得空着的缓冲区，在写满数据之后，再用V操作释放一个满了的缓冲区的信号量；而用者则使用P操作获得写满的缓冲区，在取完数据之后，再用V操作释放清空的缓冲区的信号量。
所以供者的程序如下：
<br />P(E);
<br />写数据到缓冲区;
<br />V(F);
<br />
用者的程序如下：
<br />P(F);
<br />将缓冲区中的数据全部取走;
<br />V(E);</p>
<p>
不难理解为什么P操作又叫wait操作，而V操作又叫signal操作。因为P操作会确保获得满足信号量要求的临界资源，如果暂时没有，会等待直到其他进程释放出该临界资源并得到后再继续执行；V操作会释放出一种临界资源，发出一个信号，如果有其他进程在等待该资源，会将该资源交给队列最前面的那个进程。</p>
<p>这里有个比较容易混淆的问题：既然临界资源只有缓冲区一种，为什么使用两个信号量E和F？回顾一下什么是信号量,信号量并不代表临界资源，而是临界资源的状态，既然临界资源有两种状态空着和满了，就可以用两个信号量来表示。另外初始值E = 1表示有一个空着的缓冲区，而不是表示缓冲区是空着的，F = 0 表示没有满了的缓冲区，而不是表示缓冲区没有满（或者是空着的）。</p>

<p>使用PV操作的说明：</p>
<ul>
  <li>确定彼此关系和信号量种类</li>
  <li>设定信号量初值</li>
  <li>同一信号量的PV操作要成对出现，只是互斥的PV操作在同一进程中成对出现，而同步的PV操作在不同进程中成对出现。</li>
</ul>
<p>同步互斥的经典例子：生产者和消费者</p>
<p>生产者和消费者的问题和上面提到的供着和用者的例子类似，只是供着和用者只有一个缓冲区，而生产者和消费者有N个缓冲区，构成缓冲池。当N=1时候，本问题就成为了供者和用者的问题，可见，供者和用者的问题只是本问题的一个特例而已。</p>
<p>1、消费者只有在生产者生产出产品之后才能消费（缓冲池中有满的缓冲区时才可以让消费者从缓冲区取走产品消费）<br />
2、生产者在缓冲池满了以后要暂停生产，直到有空的缓冲区出现<br />
3、为避免混乱，生产者和消费者互斥使用缓冲池</p>
<p>上面的1、2点讲的就是供者和用者中提到的同步问题，第3点讲的是互斥问题。</p>
<p>同步问题同样设E和F两个信号量，E表示缓冲池中空缓冲区的数目，初始状态下E = 0; F表示缓冲池中满了的缓冲区的个数，初始状态下F = N。另外增加缓冲池的互斥信号量M， 初始状态下M = 1(表示只用一个缓冲池可供使用）</p>
<p>对于生产者，他要做的事情是：1、等待获得空缓冲区；2、等待获得缓冲池的使用权；3、往空缓冲区中放入产品；4、释放缓冲池使用权（通知缓冲池可以使用了）；5、通知新增一个满的缓冲区（一个新产品）</p>
<p>对于消费者，他要做的事情是：1、等待获得满的缓冲区；2、等待获得缓冲池的使用权；3、从满的缓冲区中取走产品；4、释放缓冲池使用权（通知缓冲池可以使用了）；5、通知新增一个空的缓冲区</p>

<p>生产者和消费者都要做5步动作，其中他们的第4步和第5步都是可以互换的，但是其他步骤是不能改变顺序的，尤其是第一步和第二步。如果第一步和第二步颠倒，很可能发生锁住的问题（死锁），导致生产者和消费者都不能往下进行。举个例子：假如消费者先获得了缓冲池的使用权，然后等待获得满的缓冲区，不过当时没有满的缓冲区，它就在一直占用缓冲池的情况下处于等待状态；而生产者因为得不到缓冲池的使用权，也无法让缓冲区变慢，这样消费者也就永远无法获得满的缓冲区（产品），于是生产者和消费者谁也干不了活了。不过有个原则是：互斥信号量的PV操作要成对出现在临界区的前后，所以第4步和第5步最好不要颠倒，既便于记忆，又避免出错。</p>
<p>上面的步骤中凡是使用了”等待获得“来描述的，都是P操作，要获得的东西是P操作的信号量；凡是用到了”释放“或”通知“的步骤都是V操作，释放或通知的东西就是V操作的信号量。</p>

<p>注意：</p>
<ul>
  <li>P(mutex)和V(mutex)分别出现在临界区的前后</li>
  <li>各信号量的P、V操作都要成对出现</li>
  <li>两个P操作的顺序不能颠倒</li>
</ul>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=122</link>
			<title><![CDATA[第二章： 进程概念]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[操作系统]]></category>
			<pubDate>Sat,14 Nov 2009 17:54:22 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=122</guid>
		<description><![CDATA[<p>第二章： 进程概念</p>
<p>2.1 进程的概念</p>
<p>资源的分配单位、并发执行的基本单位、能独立运行的单位</p>
<p>进程：程序在并发环境中的执行过程。</p>
<p>程序本身是具有顺序性的（顺序执行），它的并发执行是通过进程来实现的。</p>
<p>一个程序可由多个进程共用，一个进程可顺序执行多个程序。</p>
<p>特征：</p>
<ul>
    <li>动态性</li>
    <li>并发性</li>
    <li>调度性：资源的分配单位</li>
    <li>异步性：（走走停停）</li>
    <li>结构性： PCB</li>
</ul>
<p>进程的组成：</p>
<ul>
    <li>进程控制块PCB</li>
    <li>程序</li>
    <li>数据集合</li>
</ul>
<p>进程和PCB的关系：</p>
<ul>
    <li>每个进程有唯一的PCB</li>
    <li>OS依赖PCB管理进程</li>
    <li>利用PCB实现进程的动态和并发</li>
    <li>PCB是进程存在的唯一标志</li>
</ul>
<p>2.2 进程的状态及其转换</p>
<ul>
    <li>状态存在于PCB</li>
    <li>基本状态
    <ul>
        <li>运行态：分到CPU，真正在运行</li>
        <li>就绪态：万事具备，只差CPU</li>
        <li>阻塞态：等待设备资源</li>
    </ul>
    </li>
</ul>
<p>2.3 进程的同步与互斥</p>
<p>进程活动中会相互制约</p>
<ul>
    <li>所有进程均相互独立</li>
    <li>以异步方式并发执行</li>
</ul>
<p>同步：进程间共同完成一项任务时直接发生相互作用的关系</p>
<p>举例：供者和用者的关系（供者把数据放入缓冲区，用者从缓冲区提取数据）</p>
<p>说明：</p>
<ul>
    <li>同步进程间具有合作关系</li>
    <li>在执行顺序上须按照一定的顺序协调进行</li>
</ul>
<p>互斥：并发执行的多个进程由于竞争同一资源而产生的相互排斥的关系</p>
<p>说明：</p>
<ul>
    <li>互斥进程在逻辑上是完全无关的</li>
    <li>他们的运行不具有时间次序的特征（对同一资源的使用并无谁先谁后的规定）</li>
</ul>
<p>2.4 临界资源和临界区</p>
<p>临界资源（Critical Resource）：一次仅允许一个进程使用的共享资源（包含硬件资源和软件资源）</p>
<p>临界区（Critical Section）:在每个进程中访问临界资源的那段程序（简称CS区）</p>
<p>进入临界区的准则：</p>
<ul>
    <li>单一进入：进入临界区的进程在任何时候最多只能有一个</li>
    <li>独自占用：进入临界区的进程单独占用临界资源</li>
    <li>尽快退出：使用完临界资源后尽快释放临界资源并退出临界区</li>
    <li>等则让权：在等待临界资源的时候，需让出CPU使用权</li>
</ul>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=121</link>
			<title><![CDATA[第一章： 操作系统引论]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[操作系统]]></category>
			<pubDate>Fri,13 Nov 2009 23:31:50 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=121</guid>
		<description><![CDATA[<p>都是概念性的东西，稍微了解下即可。</p>
<p>操作系统的功能：</p>
<ul>
    <li>存储器管理
    <ul>
        <li>内存分配</li>
        <li>地址映射：把逻辑地址映射为内存的物理地址</li>
        <li>内存保护：各程序之间的内存如何做到不冲突</li>
        <li>内存扩充：提供虚拟内存</li>
    </ul>
    </li>
    <li>处理机管理
    <ul>
        <li>作业调度</li>
        <li>进程调度</li>
        <li>进程控制</li>
        <li>进程通信</li>
    </ul>
    </li>
    <li>设备管理
    <ul>
        <li>缓冲区管理</li>
        <li>设备分配</li>
        <li>设备驱动</li>
        <li>设备无关性：方便编程使用</li>
    </ul>
    </li>
    <li>文件管理
    <ul>
        <li>文件存储空间管理</li>
        <li>文件操作</li>
        <li>目录管理</li>
        <li>读写管理和存取控制</li>
    </ul>
    </li>
    <li>用户接口
    <ul>
        <li>命令界面</li>
        <li>程序界面</li>
        <li>图形界面</li>
    </ul>
    </li>
</ul>
<p>操作系统的特点：</p>
<ul>
    <li>并发（宏观上的，与并行相区分）</li>
    <li>共享</li>
    <li>异步</li>
</ul>
<p>操作系统的类型：</p>
<ul>
    <li>批处理系统：单道+多道（作业）批处理系统
    <ul>
        <li>多道批处理系统虽然多个作业成批进行，但是缺乏与用户的交互性</li>
    </ul>
    </li>
    <li>分时系统
    <ul>
        <li>分时：若干并发程序对CPU时间的共享</li>
        <li>多个用户终端共用主机</li>
        <li>特点：
        <ul>
            <li>同时性：多个用户同时使用</li>
            <li>交互：用户可控制程序的运行</li>
            <li>独立：用户感觉不到其它用户的存在，感觉自己在独立使用计算机</li>
            <li>及时：计算机对命令及时响应</li>
        </ul>
        </li>
    </ul>
    </li>
    <li>实时系统
    <ul>
        <li>响应时间更短，比分时系统的&ldquo;及时&rdquo;更为&ldquo;及时&rdquo;</li>
        <li>特点：
        <ul>
            <li>专用</li>
            <li>实时</li>
            <li>高可靠</li>
        </ul>
        </li>
    </ul>
    </li>
    <li>个人机系统
    <ul>
        <li>分类
        <ul>
            <li>单用户操作系统</li>
            <li>多用户操作系统</li>
        </ul>
        </li>
    </ul>
    </li>
    <li>网络操作系统
    <ul>
        <li>多个主机通过网络互联</li>
    </ul>
    <ul>
        <li>特征
        <ul>
            <li>分布式</li>
            <li>自治性：各台主机可自行运行</li>
            <li>互连性</li>
            <li>可见性：知道对方计算机地址</li>
        </ul>
        </li>
    </ul>
    </li>
    <li>分布式操作系统
    <ul>
        <li>特征
        <ul>
            <li>分布式处理</li>
            <li>模块化结构</li>
            <li>利用信息通信</li>
            <li>实施整体控制</li>
        </ul>
        </li>
        <li>特点
        <ul>
            <li>透明：不知道资源位于何处</li>
            <li>灵活：得益于模块化结构，系统的修改很方便</li>
            <li>可靠：一部分发生故障并不影响整体的使用</li>
            <li>高性能</li>
            <li>可扩充</li>
        </ul>
        </li>
    </ul>
    </li>
</ul>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=120</link>
			<title><![CDATA[win7下同步播放麦克风声音]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[电脑综合]]></category>
			<pubDate>Fri,13 Nov 2009 01:27:30 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=120</guid>
		<description><![CDATA[<p>在windows&nbsp;7 下，如何让麦克风的声音直接从电脑上的扬声器输出呢？</p>
<p>右击任务栏角上的小喇叭，选择Recording&nbsp;devices（录音设备），可以看到下图窗口：<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/playmic1.jpg" /> <br />
如果不能看不到上图中的麦克风和立体声混音，在窗口内部空白处右击，在弹出的右键菜单中选中&quot;Show Disconnected Devices（显示未连接设备）&quot;即可。</p>
<p><strong>以下几张图是麦克风的属性设置：</strong> <br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/playmic2.jpg" /><br />
此处关键，usage必须选中&ldquo;Use this device (enable)&rdquo;（使用此设备）<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/playmic3.jpg" /><br />
此处关键，必须选中&ldquo;Listen to this device（监听此设备）&rdquo;。<strong>其实原理就是监听麦克风的输入，通过回放设备（扬声器）进行播放。以后要不要播放麦克风的声音，就是在这里控制切换的。<br />
</strong><img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/playmic4.jpg" /><br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/playmic5.jpg" /><br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/playmic6.jpg" />&nbsp;</p>
<p>如果按照以上设置，你就可以对这麦克风说话，你的声音就直接从扬声器上播出了。只不过效果肯定没KTV的好，它会有一定的滞后（不过不怎么严重），用来说话扩音是没有问题的，如果是K歌的话，可能会影响你的发挥。</p>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=119</link>
			<title><![CDATA[再说strcpy + 面试中的算法题笔试]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[C/C++]]></category>
			<pubDate>Fri,06 Nov 2009 22:12:29 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=119</guid>
		<description><![CDATA[<p>strcpy这个函数是很考验一个人的，其实很早（大二的时候）就看过林锐的《高质量C/C++代码》，里面对strcpy做了很详细的分析，以及哪些需要注意的地方。</p>
<p>其实C语言课上的时候，老师也分析过strcpy，甚至老师将该函数体的循环部分简化为一个语句。另外，本人也一直对自己的编码风格、C语言和一些比较常见的算法都很自信的，不过今天自己写了strcpy()这个函数，回来后发现自己还是载在了这个上面（其实也不是太影响面试结果）。反省一下！</p>
<p>当时写strcpy函数的时候，有几个没有记清的地方的：<br />
1、strcpy会不会主动给strDest的末尾加上'\0'，当时当成不加了来处理。<br />
2、参数是否该去检测NULL，因为strcpy作为比较常用的库函数，感觉程序员理应为主动为其保证正确性（现在想起来林锐当时好像用的是assert），不过我们写嵌入式的好像不怎么习惯用assert，也可能是我个人的情况。），即使可以保证指针为有效的地址值，也无法保证strDest分配的空间是足够的。不过这个判断语句还是写上了，因为写上去至少不会说是错。<br />
3、其他错误（如果调试运行一下就可以发现）。</p>
<p>不怕丢脸，贴出我写的那个错误版本的strcpy函数：</p>
<ol id="shoCodeMain39ID" style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 2px; background-color: #dcf5dc; list-style-type: decimal; margin: 0px; padding-left: 2px; padding-right: 2px; font-family: Courier New; color: #2f4f4f; word-break: break-all; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 2px">
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#0000ff">char</font><font color="#4b0082">*</font>&nbsp;strcpy<font color="#4b0082"><b>(</b></font><font color="#0000ff">char</font>&nbsp;<font color="#4b0082">*</font>strDest<font color="#4b0082">,</font>&nbsp;<font color="#0000ff">const</font>&nbsp;<font color="#0000ff">char</font>&nbsp;<font color="#4b0082">*</font>strSrc<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">char</font>&nbsp;<font color="#4b0082">*</font>p&nbsp;<font color="#4b0082">=</font>&nbsp;strSrc<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;<font color="#4b0082"><b>(</b></font>NULL&nbsp;<font color="#4b0082">==</font>&nbsp;strDest&nbsp;<font color="#4b0082">||</font>&nbsp;NULL&nbsp;<font color="#4b0082">==</font>&nbsp;strSrc<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font>&nbsp;NULL<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">while</font>&nbsp;<font color="#4b0082"><b>(</b></font><font color="#800000">'\0'</font>&nbsp;<font color="#4b0082">!=</font>&nbsp;<font color="#4b0082">*</font>p<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082">*</font>strDest&nbsp;<font color="#4b0082">=</font>&nbsp;<font color="#4b0082">*</font>p<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strDest<font color="#4b0082">++;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p<font color="#4b0082">++;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font>&nbsp;strDest<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#4b0082"><b>}</b></font>&nbsp;</span></li>
</ol>
<p>函数中申请了临时变量p，不过没有用它来存放strDest。当初只想着把传入的strDest返回去就好了，结果忽略了过程中把它移动了。所以，其实这个是最大的错误，但是调试运行一下是很容易发现的。当时给strSrc设置了个变量的原因是因为const，其实我知道这里const修饰的是char*，也就是说地址strSrc指向的那片空间的数据在本函数中是不可以去修改的。但是当时也是为了&ldquo;双保险&rdquo;，就来了个char* p = strSrc; 。实际上这句话是有warning的，如果当时调试了，估计就把它删除掉了（因为我更讨厌强转，且这句话是非必须的）。</p>
<p>在讨论到要不要判断入参是否为NULL的时候，主考官的说法是：必须要，因为如果用户传入的是NULL，向0地址写数据，那会引起系统崩溃。本来是想和他说系统应该会有保护的，不过因为没有经过测试，也就只说了程序员在调用该函数的时候在调试过程会发现的。 所以晚上故意测试了一下，在windows上，这样做会导致程序本身不能运行，并不会导致系统崩溃，所以我那系统有保护的想法是正确的。其实这跟系统是否提供保护机制有关系。（不过肯定的是：对入参是应该进行有效性检测的）。</p>
<p>其实第6到第11行可以简化为一行，不过因为不会提高执行效率，反而会降低可读性，所以就没那么写，同时也降低了出错的机率。</p>
<p>另外经过测试库函数strcpy发现：它是会给strDest的最后加上字符串结束符的（测试方法很简单，使用局部变量char str[n]，不要给他初始化就直接strcpy后输出，看后面是不是有乱码输出&mdash;&mdash;这里必须使用局部变量，因为申请到的局部变量的初始值是随机的，而全局变量或静态变量是会被初始化为0的）。</p>
<p>最后本人修改函数如下：</p>
<ol id="shoCodeMain40ID" style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 2px; background-color: #dcf5dc; list-style-type: decimal; margin: 0px; padding-left: 2px; padding-right: 2px; font-family: Courier New; color: #2f4f4f; word-break: break-all; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 2px">
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#0000ff">char</font><font color="#4b0082">*</font>&nbsp;strcpy1<font color="#4b0082"><b>(</b></font><font color="#0000ff">char</font>&nbsp;<font color="#4b0082">*</font>strDest<font color="#4b0082">,</font>&nbsp;<font color="#0000ff">const</font>&nbsp;<font color="#0000ff">char</font>&nbsp;<font color="#4b0082">*</font>strSrc<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">char</font>&nbsp;<font color="#4b0082">*</font>p&nbsp;<font color="#4b0082">=</font>&nbsp;strDest<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;<font color="#4b0082"><b>(</b></font>NULL&nbsp;<font color="#4b0082">==</font>&nbsp;strDest&nbsp;<font color="#4b0082">||</font>&nbsp;NULL&nbsp;<font color="#4b0082">==</font>&nbsp;strSrc<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font>&nbsp;NULL<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">while</font>&nbsp;<font color="#4b0082"><b>(</b></font><font color="#800000">'\0'</font>&nbsp;<font color="#4b0082">!=</font>&nbsp;<font color="#4b0082">*</font>strSrc<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082">*</font>strDest&nbsp;<font color="#4b0082">=</font>&nbsp;<font color="#4b0082">*</font>strSrc<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strDest<font color="#4b0082">++;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strSrc<font color="#4b0082">++;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082">*</font>strDest&nbsp;<font color="#4b0082">=</font>&nbsp;<font color="#800000">'\0'</font><font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font>&nbsp;p<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#4b0082"><b>}</b></font>&nbsp;</span></li>
</ol>
<p>其实在这类函数中使用assert比判断指针是否为空更好，因为assert是用来调试的，而判断指针是否为空是防错性编程。所以第4行和第5行可以修改为：<br />
assert(NULL&nbsp;!= strDest &amp;&amp;&nbsp;NULL&nbsp;!= strSrc);<br />
其实判断多个指针都不能为NULL，还可以优化为：if (NULL&nbsp;!= p1 |&nbsp;p2&nbsp;|&nbsp;p3 | ... |&nbsp;pn)</p>
<p>其实这道题目考的不是算法，而是编程习惯，所以我在这题上的得分基本上是0分。</p>
<p>如果其他算法题目，大家在笔试的时候是不需要完全做正确的（当然了，如果能够完全正确是最好不过的），因为那个主要考的是你的思路，是你的逻辑思维能力，当然还有你的编码风格。之所以说不需要完全正确是因为，在不调试的情况下，如果算法不怎么简单，是很少有人一写就正确的。当然写好后最好再检查一遍（类似Code Review），这样可以发现一些笔误和一些简单的逻辑错误。但是还是可能会有一些错误是你一时发现不了的。</p>
<p>刚才我抽取了两道在展讯做的算法题，竟然发现没有错误，欣喜！<br />
而运行了在今天面试的那家公司的排序算法题，其中方法一也没有错误，方法二有逻辑错误，少了一句break（其实是当时考虑遗漏的地方）。虽然这错误影响运行结果，这个break在该函数中的作用也是举足轻重的，但是我个人认为：这不算失败，在没有调试的情况下，一个较复杂的算法有这样一个未察觉的错误是正常的现象。</p>
<p>算了，想想还是把我做的这个题贴出来吧，反正也没有告诉大家这是哪家公司的题目：</p>
<ol id="shoCodeMain47ID" style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 2px; background-color: #dcf5dc; list-style-type: decimal; margin: 0px; padding-left: 2px; padding-right: 2px; font-family: Courier New; color: #2f4f4f; word-break: break-all; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 2px">
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#0000ff">int</font>&nbsp;<font color="#4b0082">*</font>getASCArray<font color="#4b0082"><b>(</b></font><font color="#0000ff">int</font>&nbsp;srcArray<font color="#4b0082"><b>[]</b></font><font color="#4b0082">,</font>&nbsp;<font color="#0000ff">int</font>&nbsp;len<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">int</font>&nbsp;i<font color="#4b0082">,</font>&nbsp;j<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">int</font>&nbsp;<font color="#4b0082">*</font>destArray&nbsp;<font color="#4b0082">=</font>&nbsp;<font color="#4b0082"><b>(</b></font><font color="#0000ff">int</font><font color="#4b0082">*</font><font color="#4b0082"><b>)</b></font>&nbsp;malloc<font color="#4b0082"><b>(</b></font><font color="#0000ff">sizeof</font><font color="#4b0082"><b>(</b></font><font color="#0000ff">int</font><font color="#4b0082"><b>)</b></font>&nbsp;<font color="#4b0082">*</font>&nbsp;len<font color="#4b0082"><b>)</b></font><font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;<font color="#4b0082"><b>(</b></font>NULL&nbsp;<font color="#4b0082">==</font>&nbsp;destArray<font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font>&nbsp;NULL<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;destArray<font color="#4b0082"><b>[</b></font><font color="#ff0000">0</font><font color="#4b0082"><b>]</b></font>&nbsp;<font color="#4b0082">=</font>&nbsp;srcArray<font color="#4b0082"><b>[</b></font><font color="#ff0000">0</font><font color="#4b0082"><b>]</b></font><font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">for</font>&nbsp;<font color="#4b0082"><b>(</b></font>i&nbsp;<font color="#4b0082">=</font>&nbsp;<font color="#ff0000">1</font><font color="#4b0082">;</font>&nbsp;i&nbsp;<font color="#4b0082">&lt;</font>&nbsp;len<font color="#4b0082">;</font>&nbsp;i<font color="#4b0082">++</font><font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;<font color="#4b0082"><b>(</b></font>srcArray<font color="#4b0082"><b>[</b></font>i<font color="#4b0082"><b>]</b></font>&nbsp;<font color="#4b0082">&gt;=</font>&nbsp;destArray<font color="#4b0082"><b>[</b></font>i&nbsp;<font color="#4b0082">-</font>&nbsp;<font color="#ff0000">1</font><font color="#4b0082"><b>])</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destArray<font color="#4b0082"><b>[</b></font>i<font color="#4b0082"><b>]</b></font>&nbsp;<font color="#4b0082">=</font>&nbsp;srcArray<font color="#4b0082"><b>[</b></font>i<font color="#4b0082"><b>]</b></font><font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">else</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font>&nbsp;&nbsp;&nbsp;</span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">for</font>&nbsp;<font color="#4b0082"><b>(</b></font>j&nbsp;<font color="#4b0082">=</font>&nbsp;i&nbsp;<font color="#4b0082">-</font>&nbsp;<font color="#ff0000">1</font><font color="#4b0082">;</font>&nbsp;j&nbsp;<font color="#4b0082">&gt;=</font>&nbsp;<font color="#ff0000">0</font><font color="#4b0082">;</font>&nbsp;j<font color="#4b0082">--</font><font color="#4b0082"><b>)</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;<font color="#4b0082"><b>(</b></font>srcArray<font color="#4b0082"><b>[</b></font>i<font color="#4b0082"><b>]</b></font>&nbsp;<font color="#4b0082">&gt;=</font>&nbsp;destArray<font color="#4b0082"><b>[</b></font>j<font color="#4b0082"><b>])</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destArray<font color="#4b0082"><b>[</b></font>j&nbsp;<font color="#4b0082">+</font>&nbsp;<font color="#ff0000">1</font><font color="#4b0082"><b>]</b></font>&nbsp;<font color="#4b0082">=</font>&nbsp;srcArray<font color="#4b0082"><b>[</b></font>i<font color="#4b0082"><b>]</b></font><font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">break</font><font color="#4b0082">;</font>&nbsp;<font color="#008000">//完成该数的插入</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">else</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>{</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//直接把数据往后移一步</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destArray<font color="#4b0082"><b>[</b></font>j&nbsp;<font color="#4b0082">+</font>&nbsp;<font color="#ff0000">1</font><font color="#4b0082"><b>]</b></font>&nbsp;<font color="#4b0082">=</font>&nbsp;destArray<font color="#4b0082"><b>[</b></font>j<font color="#4b0082"><b>]</b></font><font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#4b0082"><b>}</b></font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font>&nbsp;destArray<font color="#4b0082">;</font></span></li>
    <li style="border-left: silver 2px ridge; line-height: 18px; background-color: #f5fffa; margin: 0px 0px 0px 50px; padding-left: 6px"><span style="color: black"><font color="#4b0082"><b>}</b></font>&nbsp;</span></li>
</ol>
<p>其中第22行的break是晚上调试后补充上的，其他代码是在笔试的时候做的。</p>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=118</link>
			<title><![CDATA[建议大家玩英文版的孤岛惊魂FarCry]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[电脑综合]]></category>
			<pubDate>Sun,01 Nov 2009 10:55:03 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=118</guid>
		<description><![CDATA[<p>记得在大学的时候在同学的电脑上玩过一款射击类游戏，画面很逼真，也很刺激很好玩。不过没记住那款有时叫什么。</p>
<p>毕业后买了这台笔记本，是联想的Y530，Pei的那一款，P8600的CPU，9600m gs的显卡，4g的DDR3内存。想起大学里玩的那款游戏，后来发现原来名叫FarCry，中文名为孤岛惊魂。当是在vista下下载并安装了FarCry的Demo版，就几百兆的，是英文版的（估计也没人愿意给他汉化），如果把配置调高了，会玩不起来（画面不正常），但是如果合理地选择高级视频选项，还是可以玩起来的（多数设置成中或低）。后来下了个中文版，不管怎么设置都玩不起来。</p>
<p>后来安装了windows 7，前几天又更新了驱动程序（包括显卡驱动程序）。在更新驱动之前（使用Vista上的驱动），Windows Experience Index（Windows体验指数）的各项分数如下：<br />
Prosessor（处理器）：5.9<br />
Memory(RAM)（内存）：5.5<br />
Graphics（Aero图像）：4.9<br />
Gaming graphics（游戏画面）：4.8<br />
Primary hard disk（主硬盘）：5.5<br />
综合分数为4.8（以最低分数计算的），而在vista下的综合分数是5.0的，可能是因为给显卡做了一些设置（比如选择了最好画面，打开了各种效果）的原因。<br />
更新驱动之后的各项分数如下：<br />
Prosessor（处理器）：5.9<br />
Memory(RAM)（内存）：5.5<br />
Graphics（Aero图像）：4.9<br />
Gaming graphics（游戏画面）：6.2<br />
Primary hard disk（主硬盘）：5.5<br />
综合分数为4.9，可以看到其他都没有变化，但是游戏画面的分数却变得高。感觉游戏性能会提高不少，安装孤岛惊魂v1.4中文版，发现玩起来还是很吃力，虽然设置第一点可以玩。于是猜测是不是人家汉化得不好，导致游戏运行性能大大下降。于是又找了个英文版的（网上中文版的容易找到，英文版资源相对少些），安装后验证了我的猜测。</p>
<p>只要把纹理质量设置成低（不然近处的草地是黑色的），其他的都可以设置成最高。各种设置如下图（不知道为什么游戏内置的F12截图功能无效，所以窗口化后截了整个桌面的图片）：<br />
视频选项（抗锯齿开到8x后，玩的时候有时候会小卡，实际上效果也并不会提高多少，因为显卡本身就打开了抗锯齿功能）：<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/VideoOptions.jpg" /><br />
高级视频选项(其中的Texture Quality纹理质量设置成低，其它都设置生最高的)：<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/AdvancedVideoOptions.jpg" /><br />
声音选项：<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/SoundOptions.jpg" /><br />
游戏选项：<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/GameOptions.jpg" /><br />
效果图：<br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/effect0.jpg" /><br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/effect1.jpg" /><br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/effect2.jpg" /><br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/effect3.jpg" /><br />
<img alt="" src="http://www.wscxy.com/shosh/attachments/month_0911/effect4.jpg" /><br />
&nbsp;</p>
<p>如果你的计算机配置不是很高，想玩这款游戏的话，建议安装英文版的试试。如果你的配置很高，也建议玩英文版的，至少可以减少发热量，哈哈。</p>
<p>电脑一玩这游戏，风扇就会吱吱吱地吹起来，所以要保证它的散热才行，尤其是笔记本，一般笔记本散热都不会太理想。</p>]]></description>
		</item>
		
			<item>
			<link>http://www.wscxy.com/shosh/article.asp?id=117</link>
			<title><![CDATA[win7计算机右键管理功能失效的解决方法]]></title>
			<author>shosh.zhu@qisda.com(shosh)</author>
			<category><![CDATA[电脑综合]]></category>
			<pubDate>Sat,31 Oct 2009 20:26:29 +0800</pubDate>
			<guid>http://www.wscxy.com/shosh/default.asp?id=117</guid>
		<description><![CDATA[问题描述：在windows 7下，在计算机上右击鼠标弹出右键菜单，选择右键菜单中的管理，本来应该弹出计算机管理窗口（默认UAC设置还会先弹出确认操作窗口），不过有的计算机不能打开计算机管理窗口（也没任何提示）。虽然说我们还是可以通过其他方法打开计算机管理窗口的（如直接在开始菜单的搜索框里搜索Computer management，中文版的可能需要输入计算机管理——未测试，然后点击搜索到的那个项目打点击即可打开），但是这种方法打不开，心里老感觉不舒服。<br/><br/>这个好像是比较容易碰到的问题，网上问的比较多，不过多数没有给出正确的解决方案。<br/>不过解决该问题也简单，只需要将本文的附件 <a target="_blank" href="http://www.wscxy.com/shosh/attachments\month_0910\shoComputerManage.reg" rel="external">shoComputerManage.reg </a>导入到注册表即可（下载后双击打开，弹出询问窗口的时候选择确定即可）。<br/><br/>懒得下载的朋友可以自己制作该文件，文件内容如下：<br/><br/>Windows Registry Editor Version 5.00<br/><br/>[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage]<br/>@=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,74,\<br/>00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,\<br/>79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\<br/>00,34,00,30,00,30,00,00,00<br/>&#34;MUIVerb&#34;=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,\<br/>6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,\<br/>00,6d,00,79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,\<br/>2c,00,2d,00,34,00,30,00,30,00,00,00<br/>&#34;SuppressionPolicy&#34;=dword:4000003c<br/>&#34;HasLUAShield&#34;=&#34;&#34;<br/>[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\command]<br/>@=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,\<br/>00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,6d,00,63,00,2e,00,65,00,78,00,\<br/>65,00,20,00,2f,00,73,00,20,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,\<br/>00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6f,00,\<br/>6d,00,70,00,6d,00,67,00,6d,00,74,00,2e,00,6d,00,73,00,63,00,00,00&nbsp;&nbsp;]]></description>
		</item>
		
</channel>
</rss>
