﻿<?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++博客-If I Rest I Rust!!!!!!!!!!</title><link>http://www.cppblog.com/wangqiulin/</link><description>路是自己走出来的！===wang</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 11:06:19 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 11:06:19 GMT</pubDate><ttl>60</ttl><item><title>二叉搜索树</title><link>http://www.cppblog.com/wangqiulin/archive/2011/06/16/148815.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Thu, 16 Jun 2011 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2011/06/16/148815.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/148815.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2011/06/16/148815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/148815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/148815.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在阅读本片代码的时候注意一下几点：# 用了泛型技术：templeate &lt;class T&gt;# const 引用 （C++程序员装B必备）在阅读代码的时候可能会不太习惯。1. 二叉搜索树的结构&nbsp;&nbsp;&nbsp; 一个二叉树的如果不为空便是由一个根节点和左右两个只树构成。&nbsp;&nbsp;&nbsp; 二叉搜索树可以提供对数时间的插入和访问，其节点的放置规则是：任何...&nbsp;&nbsp;<a href='http://www.cppblog.com/wangqiulin/archive/2011/06/16/148815.html'>阅读全文</a><img src ="http://www.cppblog.com/wangqiulin/aggbug/148815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2011-06-16 22:49 <a href="http://www.cppblog.com/wangqiulin/archive/2011/06/16/148815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试呀</title><link>http://www.cppblog.com/wangqiulin/archive/2011/06/04/148068.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Sat, 04 Jun 2011 14:05:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2011/06/04/148068.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/148068.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2011/06/04/148068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/148068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/148068.html</trackback:ping><description><![CDATA[来源：[url=http://it.chinawin.net/softwaredev/article-1855d.html]http://it.chinawin.net/softwaredev/article-1855d.html[/url] 8月13日在中软参加首次面试。由于事先我也没有好好准备，所以当进入会议室的时候心里还是挺紧张的。等了几分钟后，来了一位青年考官。他进来后首先朝我笑了笑，我连忙站起来也笑了笑。之后他开始提问我，问我的问题比较基础。比如说面向对象有哪些特征、如何用JAVA实现线程、接口和抽象类有何区别、是否听说过面向接口的编程、使用过哪些集合、ArrayList和Vector有什么区别、使用过什么数据库、servlet的生命周期、使用过什么[url=http://www.chinawin.net/tag/j2ee/]j2ee[/url]框架、webService是什么等等。前面关于语法基础等我对答如流，只有在多态的时候卡了一下。而当问到servlet的生命周期的时候，我仅说出了编译运行和doGet，doPost，并未说出destroyed和init过程，这很失误。最惨的是当问道webService的时候，我傻眼了。本来关于webService的了解就云里雾里的，现在突然一问，心里更是没底。一紧张一句话也说不出，最后只好说我关于webService的开发经验不足，认识还不够充分，但是今后会努力学习的。回来后，我打听得知考官对我的评价是基础知识扎实，但是缺乏实际项目经验。我心知肚明，j2ee的项目至今还是空白。的确如考官所说，这是我的弱项。 事后做了中软的两份试卷，一份是中文试卷，另外一份是英文试卷。题型是选择题、问答题（英文的没有）、汉译英、英译汉。总体上感觉难度不高，但是英译汉的那篇短文把我难住了，让我深感自己专业词汇的匮乏。交上去后，经过漫长的等待终于拿到了批改后的结果。不知道中软怎么搞的，面试题目有些题目出的有问题；有的题目没答案，有的题目明明让你选2个选项，但是符合条件的不止2个。关于JAVA基础篇的题目我做得还不错，关于J2EE的基础题我做得不好，尤其是名词解释，几乎全写错了。（JNDI,JMS）让我郁闷的是有两道题目被批错了。一道是short s1=1;s1+=1;明明是可以正确编译的，但是他却批我错。另一道是说说redirect和forward的区别。明明forward是请求转发，redirect是重定位，他偏偏批我写反了。事后负责我的助理告诉我说我通过了中软的面试，之后可以面试中软在IBM的外包部门。出了公司大门，坐着公交心里有些小兴奋。 通过这次面试，我学会了一些实用的面试技巧：1,身体不要僵硬，要与考官保持适当距离。2，不要紧张，要努力表现自己。要扩展回答面试官的问题。3，碰到不会的问题或者暴露自己缺点的问题可以用一些圆滑的借口，比如时间不够啦，这是多年以前的学习（开发）经历，所以记不清楚等等。另外，我也发现了自己的不足之处。1，j2ee的基础不扎实。关于jsp、servlet、struts、webService和web应用服务器知之甚少。2，没有实际的j2ee开发工程。至今写过的j2ee程序只有一个简单的银行排队放票系统。 因此我决定为了将来成功面试IBM，我必须制定一个学习计划。学习计划如下所示： 早上6:30 起床 6:30~7:00 洗漱，吃早饭 7:00~7:30 看笔记，回顾昨日的学习情况。 7:30~10:30 学习。每学习40分钟，就休息10分钟做总结。充分利用笔记本，不要浪费。遇到问题记在一本专门的笔记本上。（以看ppt为主，首先学习整体框架。然后再看书本来学习。） 10:30~11:10 外出散步，锻炼。 12点左右吃午饭。午睡1小时时间。 13:30~18:00 使用框架开发j2ee项目。下载开源代码并进行阅读研究。每30分钟休息10分钟，做思考、回顾。 18:00~18:50 外出散步，锻炼。 19:00以后 写笔记来总结当日的学习。 22:30左右 睡觉。 (中赢网chinawin.net)<img src ="http://www.cppblog.com/wangqiulin/aggbug/148068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2011-06-04 22:05 <a href="http://www.cppblog.com/wangqiulin/archive/2011/06/04/148068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存</title><link>http://www.cppblog.com/wangqiulin/archive/2011/04/11/143960.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Mon, 11 Apr 2011 10:35:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2011/04/11/143960.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/143960.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2011/04/11/143960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/143960.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/143960.html</trackback:ping><description><![CDATA[<div class=content>
<pre id=best-answer-content class="reply-text mb10">五大内存分区
在C++中，内存分成5个区，他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆，就是那些由new分配的内存块，他们的释放编译器不去管，由我们的应用程序去控制，一般一个new就要对应一个delete。如果程序员没有释放掉，那么在程序结束后，操作系统会自动回收。
自由存储区，就是那些由malloc等分配的内存块，他和堆是十分相似的，不过它是用free来结束自己的生命的。
全局/静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的C语言中，全局变量又分为初始化的和未初始化的，在C++里面没有这个区分了，他们共同占用同一块内存区。
常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改</pre>
</div>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/143960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2011-04-11 18:35 <a href="http://www.cppblog.com/wangqiulin/archive/2011/04/11/143960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深刻理解Linux进程间通信(管道、有名管道)</title><link>http://www.cppblog.com/wangqiulin/archive/2010/12/06/135611.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Mon, 06 Dec 2010 13:23:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/12/06/135611.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/135611.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/12/06/135611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/135611.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/135611.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; 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"><span class=Apple-style-span style="FONT-SIZE: 13px; LINE-HEIGHT: 19px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif">
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><a style="COLOR: rgb(102,102,102); BACKGROUND-COLOR: transparent; TEXT-DECORATION: none; background-origin: initial; background-clip: initial" name=N1003C>1、 管道概述及相关API应用</a></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><a style="COLOR: rgb(102,102,102); BACKGROUND-COLOR: transparent; TEXT-DECORATION: none; background-origin: initial; background-clip: initial" name=N10042><span class=smalltitle>1.1 管道相关的关键概念</span></a></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">管道是Linux支持的最初Unix IPC形式之一，具有以下特点：</p>
<ul>
    <li>管道是半双工的，数据只能向一个方向流动；需要双方通信时，需要建立起两个管道；</li>
    <li>只能用于父子进程或者兄弟进程之间（具有亲缘关系的进程）；</li>
    <li>单独构成一种独立的文件系统：管道对于管道两端的进程而言，就是一个文件，但它不是普通的文件，它不属于某种文件系统，而是自立门户，单独构成一种文件系统，并且只存在与内存中。</li>
    <li>数据的读出和写入：一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾，并且每次都是从缓冲区的头部读出数据。</li>
</ul>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><a style="COLOR: rgb(102,102,102); BACKGROUND-COLOR: transparent; TEXT-DECORATION: none; background-origin: initial; background-clip: initial" name=N1005A><span class=smalltitle>1.2管道的创建：</span></a><br><br>#include &lt;unistd.h&gt;<br>&nbsp;&nbsp;int pipe(int fd[2])<br><br></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">该函数创建的管道的两端处于一个进程中间，在实际应用中没有太大意义，因此，一个进程在由pipe()创建管道后，一般再fork一个子进程，然后通过管道实现父子进程间的通信（因此也不难推出，只要两个进程中存在亲缘关系，这里的亲缘关系指的是具有共同的祖先，都可以采用管道方式来进行通信）。</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><a style="COLOR: rgb(102,102,102); BACKGROUND-COLOR: transparent; TEXT-DECORATION: none; background-origin: initial; background-clip: initial" name=N10067><span class=smalltitle>1.3管道的读写规则：</span></a></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">管道两端可分别用描述字fd[0]以及fd[1]来描述，需要注意的是，管道的两端是固定了任务的。即一端只能用于读，由描述字fd[0]表示，称其为管道读端；另一端则只能用于写，由描述字fd[1]来表示，称其为管道写端。如果试图从管道写端读取数据，或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道，如close、read、write等等。</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">从管道中读取数据：</p>
<ul>
    <li>如果管道的写端不存在，则认为已经读到了数据的末尾，读函数返回的读出字节数为0；</li>
    <li>当管道的写端存在时，如果请求的字节数目大于PIPE_BUF，则返回管道中现有的数据字节数，如果请求的字节数目不大于PIPE_BUF，则返回管道中现有数据字节数（此时，管道中数据量小于请求的数据量）；或者返回请求的字节数（此时，管道中数据量不小于请求的数据量）。注：（PIPE_BUF在include/linux/limits.h中定义，不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至少为512字节，red hat 7.2中为4096）。</li>
</ul>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">关于管道的读规则验证：<br></p>
<p dir=ltr style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px" align=left><span style="FONT-FAMILY: Verdana">/**************<br>* readtest.c *<br>**************/<br>#include &lt;unistd.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include &lt;errno.h&gt;<br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pipe_fd[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char r_buf[100];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char w_buf[4];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* p_wbuf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int r_num;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int cmd;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(r_buf,0,sizeof(r_buf));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(w_buf,0,sizeof(r_buf));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_wbuf=w_buf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pipe(pipe_fd)&lt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pipe create error\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pid=fork())==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(3);//确保父进程关闭写端<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r_num=read(pipe_fd[0],r_buf,100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "read num is %d&nbsp;&nbsp; the data read from the pipe is %d\n",r_num,atoi(r_buf));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(pid&gt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[0]);//read<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(w_buf,"111");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(write(pipe_fd[1],w_buf,4)!=-1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("parent write over\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[1]);//write<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("parent close fd[1] over\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class=Apple-converted-space>&nbsp;</span><br>}<br></span>/**************************************************<br>* 程序输出结果：<br>* parent write over<br>* parent close fd[1] over<br>* read num is 4&nbsp;&nbsp; the data read from the pipe is 111<br>* 附加结论：<br>* 管道写端关闭后，写入的数据将一直存在，直到读出为止.<br>****************************************************/<span class=Apple-converted-space>&nbsp;</span><br><br>向管道中写入数据：</p>
<ul>
    <li>向管道中写入数据时，linux将不保证写入的原子性，管道缓冲区一有空闲区域，写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据，那么写操作将一直阻塞。<span class=Apple-converted-space>&nbsp;</span><br>注：只有在管道的读端存在时，向管道中写入数据才有意义。否则，向管道中写入数据的进程将收到内核传来的SIFPIPE信号，应用程序可以处理该信号，也可以忽略（默认动作则是应用程序终止）。</li>
</ul>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">对管道的写规则的验证1：写端对读端存在的依赖性<br></p>
<pre class=displaycode style="FONT-FAMILY: Verdana">#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
main()
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pipe_fd[2];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char r_buf[4];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* w_buf;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int writenum;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int cmd;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(r_buf,0,sizeof(r_buf));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pipe(pipe_fd)&lt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pipe create error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pid=fork())==0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(pid&gt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);  //等待子进程完成关闭读端的操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[0]);//write
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buf="111";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((writenum=write(pipe_fd[1],w_buf,4))==-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("write to pipe error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("the bytes write to pipe is %d \n", writenum);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}
</pre>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><br><br><br><br>则输出结果为： Broken pipe,原因就是该管道以及它的所有fork()产物的读端都已经被关闭。如果在父进程中保留读端，即在写完pipe后，再关闭父进程的读端，也会正常写入pipe，读者可自己验证一下该结论。因此，在向管道写入数据时，至少应该存在某一个进程，其中管道读端没有被关闭，否则就会出现上述错误（管道断裂,进程收到了SIGPIPE信号，默认动作是进程终止）</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">对管道的写规则的验证2：linux不保证写管道的原子性验证<br><br><br></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">结论：</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">写入数目小于4096时写入是非原子的！<span class=Apple-converted-space>&nbsp;</span><br>如果把父进程中的两次写入字节数都改为5000，则很容易得出下面结论：<span class=Apple-converted-space>&nbsp;</span><br>写入管道的数据量大于4096字节时，缓冲区的空闲空间将被写入数据（补齐），直到写完所有数据为止，如果没有进程读数据，则一直阻塞。</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><a style="COLOR: rgb(102,102,102); BACKGROUND-COLOR: transparent; TEXT-DECORATION: none; background-origin: initial; background-clip: initial" name=N100A9><span class=smalltitle>1.4管道应用实例：</span></a></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">实例一：用于shell</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">管道可用于输入输出重定向，它将一个命令的输出直接定向到另一个命令的输入。比如，当在某个shell程序（Bourne shell或C shell等）键入who│wc -l后，相应shell程序将创建who以及wc两个进程和这两个进程间的管道。考虑下面的命令行：</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">$kill -l<span class=Apple-converted-space>&nbsp;</span><br>$kill -l | grep SIGRTMIN</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">实例二：用于具有亲缘关系的进程间通信</p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">下面例子给出了管道的具体应用，父进程通过管道发送一些命令给子进程，子进程解析命令，并根据命令作相应处理。<br><br></p>
<pre class=displaycode style="FONT-FAMILY: Verdana">#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
main()
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pipe_fd[2];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char r_buf[4];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* w_buf;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int writenum;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int cmd;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(r_buf,0,sizeof(r_buf));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pipe(pipe_fd)&lt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pipe create error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((pid=fork())==0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(pid&gt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);  //等待子进程完成关闭读端的操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[0]);//write
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buf="111";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((writenum=write(pipe_fd[1],w_buf,4))==-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("write to pipe error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("the bytes write to pipe is %d \n", writenum);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(pipe_fd[1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}
</pre>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><br>输出结果：<br>the bytes write to pipe 1000<br>the bytes write to pipe 1000&nbsp; //注意，此行输出说明了写入的非原子性<br>the bytes write to pipe 1000<br>the bytes write to pipe 1000<br>the bytes write to pipe 1000<br>the bytes write to pipe 120&nbsp; //注意，此行输出说明了写入的非原子性<br>the bytes write to pipe 0<br>the bytes write to pipe 0<br>......<br><br></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px"><a style="COLOR: rgb(102,102,102); BACKGROUND-COLOR: transparent; TEXT-DECORATION: none; background-origin: initial; background-clip: initial" name=N100D3><span class=smalltitle>1.5 管道的局限性</span></a></p>
<p style="FONT-SIZE: 13px; MARGIN: 10px 0px; LINE-HEIGHT: 19px">管道的主要局限性正体现在它的特点上：</p>
<ul>
    <li>只支持单向数据流；</li>
    <li>只能用于具有亲缘关系的进程之间；</li>
    <li>没有名字；</li>
    <li>管道的缓冲区是有限的（管道制存在于内存中，在管道创建时，为缓冲区分配一个页面大小）；</li>
    <li>管道所传送的是无格式字节流，这就要求管道的读出方和写入方必须事先约定好数据的格式，比如多少字节算作一个消息（或命令、或记录）等等</li>
</ul>
</span></span>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/135611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-12-06 21:23 <a href="http://www.cppblog.com/wangqiulin/archive/2010/12/06/135611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL robot手臂的实现</title><link>http://www.cppblog.com/wangqiulin/archive/2010/10/12/129646.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Tue, 12 Oct 2010 12:18:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/10/12/129646.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/129646.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/10/12/129646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/129646.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/129646.html</trackback:ping><description><![CDATA[<p>#include &lt;GL/glut.h&gt;<br>#include &lt;stdlib.h&gt;</p>
<p>static int shoulder = 0, elbow = 0,thumb=0,littlethumb=0;</p>
<p>void init(void) <br>{<br>&nbsp;&nbsp; glClearColor (0.0, 0.0, 0.0, 0.0);<br>&nbsp;&nbsp; glShadeModel (GL_FLAT);<br>}</p>
<p>void display(void)<br>{<br>&nbsp;&nbsp; glClear (GL_COLOR_BUFFER_BIT);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glTranslatef (-1.0, 0.0, 0.0);<br>&nbsp;&nbsp; glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);<br>&nbsp;&nbsp; glTranslatef (1.0, 0.0, 0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef (2.0, 0.4, 1.0);<br>&nbsp;&nbsp; glutWireCube (1.0);<br>&nbsp;&nbsp; glPopMatrix();</p>
<p>&nbsp;&nbsp; glTranslatef (1.0, 0.0, 0.0);<br>&nbsp;&nbsp; glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);<br>&nbsp;&nbsp; glTranslatef (1.0, 0.0, 0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef (2.0, 0.4, 1.0);<br>&nbsp;&nbsp; glutWireCube (1.0);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glTranslatef(0.0,0.2,0.5);<br>&nbsp;&nbsp; glTranslatef(1.0,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)thumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.6,0.1,0.2);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)littlethumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.2,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.4,0.1,0.1);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glPopMatrix();</p>
<p><br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glTranslatef(0.0,0.2,-0.5);<br>&nbsp;&nbsp; glTranslatef(1.0,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)thumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.6,0.1,0.2);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)littlethumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.2,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.4,0.1,0.1);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glPopMatrix();</p>
<p>&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glTranslatef(0.0,0.2, 0.2);<br>&nbsp;&nbsp; glTranslatef(1.0,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)thumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.6,0.1,0.2);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)littlethumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.2,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.4,0.1,0.1);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glPopMatrix();</p>
<p>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glTranslatef(0.0,0.2,-0.2);<br>&nbsp;&nbsp; glTranslatef(1.0,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)thumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.6,0.1,0.2);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)littlethumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.2,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.4,0.1,0.1);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glPopMatrix();</p>
<p><br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glTranslatef(0.0,-0.2,-0.2);<br>&nbsp;&nbsp; glTranslatef(1.0,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)thumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.6,0.1,0.2);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glTranslatef(0.3,0.0,0.0);<br>&nbsp;&nbsp; glRotatef((GLfloat)littlethumb,0.0,0.0,1.0);<br>&nbsp;&nbsp; glTranslatef(0.2,0.0,0.0);<br>&nbsp;&nbsp; glPushMatrix();<br>&nbsp;&nbsp; glScalef(0.4,0.1,0.1);<br>&nbsp;&nbsp; glutWireCube(1);<br>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glPopMatrix();</p>
<p>&#160;</p>
<p>&nbsp;&nbsp; glPopMatrix();<br>&nbsp;&nbsp; glutSwapBuffers();<br>}</p>
<p>void reshape (int w, int h)<br>{<br>&nbsp;&nbsp; glViewport (0, 0, (GLsizei) w, (GLsizei) h); <br>&nbsp;&nbsp; glMatrixMode (GL_PROJECTION);<br>&nbsp;&nbsp; glLoadIdentity ();<br>&nbsp;&nbsp; gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);<br>&nbsp;&nbsp; glMatrixMode(GL_MODELVIEW);<br>&nbsp;&nbsp; glLoadIdentity();<br>&nbsp;&nbsp; glTranslatef (0.0, 0.0, -5.0);<br>}</p>
<p>void keyboard (unsigned char key, int x, int y)<br>{<br>&nbsp;&nbsp; switch (key) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 's':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shoulder = (shoulder + 5) % 360;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'S':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shoulder = (shoulder - 5) % 360;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'e':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elbow = (elbow + 5) % 360;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'E':<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elbow = (elbow - 5) % 360;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp; case 'd':<br>&nbsp;&nbsp;&nbsp; thumb= (thumb+5)%360;<br>&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp; case'D':<br>&nbsp;&nbsp;&nbsp; thumb= (thumb-5)%360;<br>&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp; case'l':<br>&nbsp;&nbsp;&nbsp; littlethumb=(littlethumb-5)%360;<br>&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp; case'L':<br>&nbsp;&nbsp;&nbsp; littlethumb=(littlethumb+5)%360;<br>&nbsp;&nbsp;&nbsp; glutPostRedisplay();<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 27:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp; }<br>}</p>
<p>int main(int argc, char** argv)<br>{<br>&nbsp;&nbsp; glutInit(&amp;argc, argv);<br>&nbsp;&nbsp; glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);<br>&nbsp;&nbsp; glutInitWindowSize (800, 500); <br>&nbsp;&nbsp; glutInitWindowPosition (100, 100);<br>&nbsp;&nbsp; glutCreateWindow (argv[0]);<br>&nbsp;&nbsp; init ();<br>&nbsp;&nbsp; glutDisplayFunc(display); <br>&nbsp;&nbsp; glutReshapeFunc(reshape);<br>&nbsp;&nbsp; glutKeyboardFunc(keyboard);<br>&nbsp;&nbsp; glutMainLoop();<br>&nbsp;&nbsp; return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/129646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-10-12 20:18 <a href="http://www.cppblog.com/wangqiulin/archive/2010/10/12/129646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++写入文本文件 </title><link>http://www.cppblog.com/wangqiulin/archive/2010/10/07/128946.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Thu, 07 Oct 2010 11:10:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/10/07/128946.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/128946.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/10/07/128946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/128946.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/128946.html</trackback:ping><description><![CDATA[<div class=share-btn-img id=appShareShareIcon onclick="share.share('2701367','','2701367')"></div>
<div id=app-share-container>
<div id=appShareOpt></div>
<div id=app-share-content><font size=3>对于文件输入，C++使用类似于cout的东西。下面来复习一些有关将cout用于控制台输出的基本事实，为文件输入做准备：<br>&nbsp;&nbsp;&nbsp; ● 必须包含头文件iostream。<br>&nbsp;&nbsp;&nbsp; ● 头文件iostream定义了一个用处理输出的ostream类。<br>&nbsp;&nbsp;&nbsp; ● 头文件iostream声明了一个名为cout的ostream变量（对象）。<br>&nbsp;&nbsp;&nbsp; ● 必须指明名称空间std:例如，为引用元素cout和endl，必须使用编译指令using或前缀std::。<br>&nbsp;&nbsp;&nbsp; ● 可以结合使用cout和操作符&#8220;&gt;&gt;&#8221;来显示各种类型的数据。</font>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 文件输出与此极其相似：<br>&nbsp;&nbsp;&nbsp; ● 必须包含头文件fstream。<br>&nbsp;&nbsp;&nbsp; ● 需要声明一个或多个ofstream变量（对象），并以自己喜欢的方式对其进行命名，条件是遵守常用的命名规则。<br>&nbsp;&nbsp;&nbsp; ● 必须指明名称空间std:例如，为引用元素ofstream，必须使用编译指令using或前缀std::。<br>&nbsp;&nbsp;&nbsp; ● 需要将ofstream对象与文件关联起来。为此，方法之一是使用open()方法。<br>&nbsp;&nbsp;&nbsp; ● 使用完文件后，应使用close()方法将其关闭。<br>&nbsp;&nbsp;&nbsp; ● 可结合使用ofstream对象和操作符&gt;&gt;来输出各种类型的数据。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 注意，虽然头文件iostream提供了一个预先定义好的名为cout的ostream对象，但您必须声明自己的ofstream对象，为其命名，并将其同文件关联起来。下面演示了如何声明这种对象。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofstream outFile;&nbsp;&nbsp; //outFile an ofstream object<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofstream fount;&nbsp;&nbsp;&nbsp; //fout an ofstream object</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 下面演示了如何将这种对象与特定的文件关联起来：</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.open("fish.txt"); //outFile used to write to the fish.txt file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char filename[50];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; filename;&nbsp;&nbsp; //user specifies a name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fout.open(filename);&nbsp;&nbsp; //fout used to read specified file</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 注意，方法open()接受一个C-风格字符串作为参数，这可以是一个字面字符串，也可以是存储在数组中的字符串。<br>&nbsp;&nbsp;&nbsp; 下面演示了如何使用这种对象：</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double wt = 125.8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile &lt;&lt; wt;&nbsp;&nbsp;&nbsp; //write a number to fish.txt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char line[81] = "Objects are closer than they appear.";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fin &lt;&lt; line &lt;&lt; endl;&nbsp;&nbsp; //write a line of text</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 重要的是，声明一个ofstream对象并将其同文件关联起来后，便可以像使用cout那样使用它。所有可用于cout的操作和方法（如&lt;&lt;、enld和setf())都可用于ofstream对象（如前述范例中的outFile和fout)。</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 总之，使用文件输出的主要步骤如下：<br>&nbsp;&nbsp;&nbsp; 1. 包含头文件fstream。<br>&nbsp;&nbsp;&nbsp; 2. 创建一个ofstream对象。<br>&nbsp;&nbsp;&nbsp; 3. 将该ofstream对象同一个文件关联起来。<br>&nbsp;&nbsp;&nbsp; 4. 就像使用count那样使用该ofstream对象。<br>&nbsp;&nbsp;&nbsp; 程序清单6.15中的程序演示了这种方法。它要求用户输入信息，然后将信息显示到屏幕上，再将这些信息写入到文件中。读者可以使用文本编辑器来查看该输出文件的内容。</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 程序清单6.15 outfile.cpp<br>&nbsp;&nbsp;&nbsp; //outfile.cpp -- writing to a file<br>&nbsp;&nbsp;&nbsp; #include &lt;iostream&gt;<br>&nbsp;&nbsp;&nbsp; #include &lt;fstream&gt;</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; int main() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace std;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char automobile[50];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int year;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double a_price;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double d_price;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofstream outFile;&nbsp;&nbsp; //create object for output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.open("carinfo.txt"); //associate with a file</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Enter the make and model of automobile:";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin.getline(automobile, 50);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Enter the model year:";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; year;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Enter the original asking price:";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; a_price;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d_price = 0.913 * a_price;</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // display information on screen with count</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; fixed;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout.precision(2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout.setf(ios_base::showpoint);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Make and model:" &lt;&lt; automobile &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Year:" &lt;&lt; year &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Was asking $" &lt;&lt; a_price &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Now asking $" &lt;&lt; d_price &lt;&lt; endl;</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // now do exact same things using outFile instead of cout</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile &lt;&lt; fixed;//<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; 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"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: Arial, Simsun, serif">如果输出的数据是浮点数.则按定点表示法输出</span></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.precision(2);//<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; 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"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: Arial, Simsun, serif">按照指定的精度控制浮点数输出</span></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.setf(ios_base::showpoint);//<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; 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"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: Arial, Simsun, serif">为输出的数据强制加小数点以及小数点后</span></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile &lt;&lt; "Make and model:" &lt;&lt; automobile &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile &lt;&lt; "Year:" &lt;&lt; year &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile &lt;&lt; "Was asking $" &lt;&lt; a_price &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile &lt;&lt; "Now asking $" &lt;&lt; d_price &lt;&lt; endl;</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.close(); //done with file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 该程序的最后一部分与cout部分相同，只是将cout替换为outFile而已。下面是该程序的运行情况：<br>&nbsp;&nbsp;&nbsp; Enter the make and model of automobile: Flitz Pinata<br>&nbsp;&nbsp;&nbsp; Enter the model year: 2001<br>&nbsp;&nbsp;&nbsp; Enter the original asking price :28576<br>&nbsp;&nbsp;&nbsp; Make and model: Flitz Pinata<br>&nbsp;&nbsp;&nbsp; Year: 2001<br>&nbsp;&nbsp;&nbsp; Was asking $28576.00<br>&nbsp;&nbsp;&nbsp; Now asking $26089.89<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 屏幕输出的是使用cout的结果。如果您查看该程序的可执行文件所在的目录，将看到一个名为carinfo.txt的新文件，其中包含使用outFile生成的输出。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 程序说明<br>&nbsp;&nbsp;&nbsp; 在程序清单6.15的程序中，声明一个ofstream对象后，便可以使用方法open()来将该对象同一个特定的文件关联起来：</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofstream outFile;&nbsp;&nbsp; //create object for output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.open("carinfo.txt"); //associate with a file</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 程序使用完该文件后，应该将其关闭：</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.close();</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 注意，方法close()不需要使用文件名作为参数，这是因为outFile已经同特定的文件关联起来了。如果您忘记关闭文件，程序正常终止时将自动关闭它。<br>&nbsp;&nbsp;&nbsp; outFile可使用cout可使用的任何方法。它不但能够使用操作符&lt;&lt;，还可以使用各种格式化方法，如setf()和precision()。这些方法只影响调用它们的对象。例如，对于不同的对象，可以提供不同的值：</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout.precision(2); //use a precision of 2 for the display<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.porecision(4); //use a precision of 4 for file output</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 读者需要记住的重点是，创建好ofstream对象（如outFile）后，便可以像使用cout那样使用它。<br>&nbsp;&nbsp;&nbsp; 回到open()方法：</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outFile.open("carinfo.txt");</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 在这里，该程序运行之前，文件carinfo.txt并不存在。在这种情况下，方法open()将新建一个名为carinfo.txt的文件。如果在此运行该程序，文件carinfo.txt将存在，此时情况将如何呢？默认情况下，open()将首先截断该文件，即将其长度截短到零——丢其原有的内容，然后将新的输出加入到该文件中。第17章将介绍如何修改这种默认行为。</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 警告：打开已有的文件，以接受输出时，默认将它其长度截短为零，因此原来的内容将丢失。</font></p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体"><font size=3>&nbsp;&nbsp;&nbsp; 打开文件用于接受输入时可能失败。例如，指定的文件可能已存在，但禁止对其进行访问。因此细心的程序员将检查打开文件的操作是否成功，这将在下一个例子中介绍。</font></p>
</div>
</div>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/128946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-10-07 19:10 <a href="http://www.cppblog.com/wangqiulin/archive/2010/10/07/128946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>补码运算规则</title><link>http://www.cppblog.com/wangqiulin/archive/2010/10/03/128519.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Sun, 03 Oct 2010 13:41:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/10/03/128519.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/128519.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/10/03/128519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/128519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/128519.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; 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"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 25px; TEXT-ALIGN: left">
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">1运算规则</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[X＋Y]补= [X]补＋ [Y]补<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[X－Y]补= [X]补＋ [－Y]补<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">若已知[Y]补，求[－Y]补的方法是：将[Y]补的各位（包括符号位）逐位取反再在最低位加1即可。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">例如：[Y]补= 101101 [－Y]补= 010011&nbsp;</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">2、溢出判断，一般用双符号位进行判断：</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">符号位00 表示正数 11 表示负数<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">结果的符号位为01时，称为上溢；为10时，称为下溢<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">例题：设x=0.1101，y=－0.0111，符号位为双符号位<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">用补码求x+y，x－y&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[x]补+[y]补=00 1101+11 1001=00 0110&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[x－y]补=[x]补+[－y]补=00 1101+00 0111=01 0100<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">结果错误，正溢出</p>
</span></span>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/128519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-10-03 21:41 <a href="http://www.cppblog.com/wangqiulin/archive/2010/10/03/128519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[解决]vgn-tz33B按装系统后总是提示hal.dll文件丢失</title><link>http://www.cppblog.com/wangqiulin/archive/2010/09/28/127984.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Tue, 28 Sep 2010 10:28:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/09/28/127984.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/127984.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/09/28/127984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/127984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/127984.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td id=postmessage_27226 class=t_msgfont>[<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E8%A7%A3%E5%86%B3">解决</span>]vgn-tz33B按装<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>后总是提示hal.dll<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%96%87%E4%BB%B6">文件</span>丢失 hal.dll是在system32下的系统文件吧 其实这个文件并不一定是丢失了 有可能是boot.ini出错了 我转载一个朋友回答的答案 希望你能解决该问题 以下内容为转载： 提示hal.dll损坏或丢失,实际上该文件并不一定不存在,可以说，拷个文件回去system32里，根本是不可以解决的.出现这个错误的原因是boot.ini文件出错,导致引导不了机器从指定的路径启动,那样系统<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%90%9C%E7%B4%A2">搜索</span>其他的路径，而其他路径上是没有hal.dll文件的,就会提示这个错误.一般的解决办法是进入<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%95%85%E9%9A%9C">故障</span>恢复控制台,用fixboot命令,如果这样修复不了boot.ini,就用bootcfg/add来重建boot.ini。 这个是由于C盘根目录下的boot.ini文件非法，导致默认从C:＼<span class=t_tag onclick=tagshow(event) href="tag.php?name=Windows">Windows</span>启动，但是又由于你的<span class=t_tag onclick=tagshow(event) href="tag.php?name=Win">Win</span>dows XP没有安装在C盘，所以系统提示找不到HAL.DLL文件。启动因而失败。解决方法是重新编辑Boot.ini文件。 1)、使用Win9X启动盘启动，使用EDIT.EXE命令编辑这个文件。启动EDIT.EXE以后只要按照正确的格式输入Boot.ini文件的内容，保存为Boot.ini文件即可。 2)、使用COPY CON命令创建一个Boot.ini文件。在DOS下输入Copy Con C:＼boot.ini以后回车。然后按照Boot.ini文件的格式输入，每输入一行敲一次回车键，当全部内容输入完毕以后，按CTRL+Z，<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%B1%8F%E5%B9%95">屏幕</span>上会看到^Z的提示。这个时候再敲一次回车，系统会提示1 file(s) copied.这就表示创建成功了。 3)、使用故障恢复控制台里面的bootcfg命令。 4)、在别的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%94%B5%E8%84%91">电脑</span>上创建好以后，拷贝到受损电脑的C盘根目录上覆盖源文件即可。 还有个办法，你用个u盘从别个那里拷一个 hal.dll文件，然后插在你的电脑上，再用一张系统安装盘放进光驱。在第一选择里，选择修复，就可以进入doc里了。然后从a: b: 一直试下去，看到了u盘就要吧用 copy hal.dll c:\windows\system32\hal.dll 就可以了， 原理是在安装系统的时候，u盘也会被检测到，就可以用了。软盘也可以。但你应该不会有软驱</td>
        </tr>
    </tbody>
</table>
<p>就是按照这个步骤解决的：</p>
<div id=postmessage_2566 class=t_msgfont>解决"systemroot\\system32\\hal.dll文件非法或该文件已损坏，系统无法启动"<br>当电脑重新启动进入WinXP时，系统提示：&#8220;systemroot\\system32\\hal.dll文件非法或该文件已损坏，系统无法启动&#8221;。可以利用将故障恢复控制台来修复损坏的文件。 <br>插入xp安装盘重新启动电脑，选择故障恢复控制台。依提示进入Windows dos目录。 <br>在DOS提示符下输入：expand x:\\i386\\driver.cab /f:hal.dll c:\\windows\\system32\\(x:为光驱盘符.再次利用expand 首先将halaacpi.dll拷贝至c:\\windows\\system32\\，并改名为hal.dll后重新启动电脑,再拷halacpi.dll(因为hal.dll的源文件名是halacpi.dll).改名(ren)后重启，restart即可<br><br>提示hal.dll丢失也可能是 C： 盘的 boot.ini 文件的问题<br>boot.ini设置的启动分区不正确当然就找不到hal.dll<br><br>我记得我有一次装了双系统<br>重装windows时发现<br>不知道怎么在C盘前加了个分区<br>结果就提示hal.dll丢失,<br>原因是以前的C盘已经成了现在的D盘，<br>windows 当然找不到boot.ini，所以提示错误<br>将前面的分区删除就好了<br><br>总之,提示hal.dll丢失,hal.dll损坏不见得就是hal.dll的问题<br>很有可能是启动设置不正确</div>
<div class=t_msgfont>在删除c盘前面分区时候，用了dos下的fdisk。我的c盘前面的盘是一个non－dos盘，fdisk里面有直接删除这个东西的命令，用了直接删除之。然后系统一切正常。</div>
<script type=text/javascript src="http://partner.googleadservices.com/gampad/google_service.js">
</script><script type=text/javascript>
GS_googleAddAdSenseService("ca-pub-2104725613239060");
GS_googleEnableAllServices();
</script><script src="http://partner.googleadservices.com/gampad/google_ads.js"></script><script type=text/javascript>
GA_googleAddSlot("ca-pub-2104725613239060", "blogbus_user_detail");
GA_googleFetchAds();
</script><br><br><u><font color=#0066cc>maaijin<br></font></u>[圣人] <a title=向maaijin提问 href="http://iask.sina.com.cn/question/askme_new_2.php?asktouid=1419605737&amp;asktonick=maaijin" target=_blank><img alt=向maaijin提问 src="http://i1.sinaimg.cn/pfp/iask/images/zhishi/pictures_clf/ques.jpg" width=15 height=15></a> <script language=javascript>show_img("a34908334", '1419605737');</script>
<div class=usr_qus>
<div class=pb5>最近不知怎么把hal.dll给删了，导致一开机就显示boot.in非法启动，hal.dll丢失。 <br>经过一翻折腾，终于解决了问题。解决的方法如下： <br>首先必须知道自己的计算机名称，这可以从设备管理器里的计算机项中看出。根据不同的计 <br>算机名称对应需要扩展的hal.dll为： <br>acpi multiprocessor pc halmacpi.dl_ <br>acpi uniprocessor pc halaacpi.dl_ <br>advanced configuration and power interface(acpi)pc halacpi.dl_ <br>mps multiprocessor pc halmaps.dl_ <br>mps unitprocessor pc halapic.dl_ <br>standard pc hal.dl_ <br>compaq systempro multiprcessor or 100% compatible halsp.dl_ <br>但问题是如果hal.dll丢失那么连电脑也无法进去，怎么可以知道计算机的名称呢？我的方 <br>法比较极端：在f再安一个操作系统，这样也只能进去一次，但可以知道计算机的名称了。 <br>另外也可以用试的方式，将上述一一试过；当然，因为目前电脑第二、三种比较常见，可以 <br>先试这两个。我的电脑使第三种故以它为例。 <br>接下来放入启动盘，从光盘启动，进入故障修复平台。需要说明的是xp家庭版与专业版可以 <br>通用，其他版本是否可以没有试过，不推荐使用。 <br>之后的命令是： <br>del c:\windows\system32\hal.dll <br>expand x:\i386\halacpi.dl_ c:\windows\system32\ <br>其中x的意思，举例来说，如果你分了3个硬盘分区，那么它就代表f，而不论你的光驱盘 <br>符具体多少。 <br>ren c:\windows\system32\halacpi.dll hal.dll <br>copy c:\windows\hal.dll c:\windows\system32\hal.dll <br>del c:\windows\hal.dll <br>exit <br>这样就好了。关于为什么重新命名后hal.dll为什会在windows文件夹而非system32下目前 <br>还不清楚，因为这是我的电脑遇到的情况，如果不放心，可以用dir命令在ren后看看hal.dll <br>到底在哪儿；如果在system32下，就不用使用copy命令了。 <br><br>说明上面的是我复制过来的,我也是这样搞好了系统 <br><br><br>
<pre>分析：</pre>
<pre>这是因为系统和当前硬件不兼容引起的。</pre>
<pre>解决方法：</pre>
<pre>首先将BIOS刷新到f。11c版本，然后利用HP提供的xp sp3版本安装系统就OK了！</pre>
<pre>注意：</pre>
<pre>f.11c软件可以网上下载，还有驱动程序应在安装系统前下载好。<br></pre>
</div>
</div>
[<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E8%A7%A3%E5%86%B3">解决</span>]vgn-tz33B按装<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>后总是提示hal.dll<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%96%87%E4%BB%B6">文件</span>丢失 hal.dll是在system32下的系统文件吧 其实这个文件并不一定是丢失了 有可能是boot.ini出错了 我转载一个朋友回答的答案 希望你能解决该问题 以下内容为转载： 提示hal.dll损坏或丢失,实际上该文件并不一定不存在,可以说，拷个文件回去system32里，根本是不可以解决的.出现这个错误的原因是boot.ini文件出错,导致引导不了机器从指定的路径启动,那样系统<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%90%9C%E7%B4%A2">搜索</span>其他的路径，而其他路径上是没有hal.dll文件的,就会提示这个错误.一般的解决办法是进入<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%95%85%E9%9A%9C">故障</span>恢复控制台,用fixboot命令,如果这样修复不了boot.ini,就用bootcfg/add来重建boot.ini。 这个是由于C盘根目录下的boot.ini文件非法，导致默认从C:＼<span class=t_tag onclick=tagshow(event) href="tag.php?name=Windows">Windows</span>启动，但是又由于你的<span class=t_tag onclick=tagshow(event) href="tag.php?name=Win">Win</span>dows XP没有安装在C盘，所以系统提示找不到HAL.DLL文件。启动因而失败。解决方法是重新编辑Boot.ini文件。 1)、使用Win9X启动盘启动，使用EDIT.EXE命令编辑这个文件。启动EDIT.EXE以后只要按照正确的格式输入Boot.ini文件的内容，保存为Boot.ini文件即可。 2)、使用COPY CON命令创建一个Boot.ini文件。在DOS下输入Copy Con C:＼boot.ini以后回车。然后按照Boot.ini文件的格式输入，每输入一行敲一次回车键，当全部内容输入完毕以后，按CTRL+Z，<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E5%B1%8F%E5%B9%95">屏幕</span>上会看到^Z的提示。这个时候再敲一次回车，系统会提示1 file(s) copied.这就表示创建成功了。 3)、使用故障恢复控制台里面的bootcfg命令。 4)、在别的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%94%B5%E8%84%91">电脑</span>上创建好以后，拷贝到受损电脑的C盘根目录上覆盖源文件即可。 还有个办法，你用个u盘从别个那里拷一个 hal.dll文件，然后插在你的电脑上，再用一张系统安装盘放进光驱。在第一选择里，选择修复，就可以进入doc里了。然后从a: b: 一直试下去，看到了u盘就要吧用 copy hal.dll c:\windows\system32\hal.dll 就可以了， 原理是在安装系统的时候，u盘也会被检测到，就可以用了。软盘也可以。但你应该不会有软驱<br><br><br><br>
<div id=appShareShareIcon class=share-btn-img onclick="share.share('15392120','','15392120')"></div>
丢失缺少hal.dll文件
<div id=app-share-container>
<div id=appShareOpt></div>
<div id=app-share-content>
<p>windows root\system32\hal.dll"丢失缺少hal.dll文件</p>
<p><br>昨天遇见一个机器，开机后提示出现缺少hal.dll文件丢失的情况，以前的经验告诉我很可能是硬盘到寿了，有坏道了，但是问客户得知硬盘是新换的，以前的硬盘是有过坏道，但是新硬盘有坏道的几率不大，</p>
<p>于是装系统光盘启动但是在GHOST的时候便卡住，以为是光驱读盘不行，但是换了盘还是不行，于是进PE装了系统，但是启动后装机速度还是，本机配置还可以的，P42.8，865PE，512，64 gf440显卡,重启之后竟然没有进入桌面，郁闷，再重启，这回进入了，怪怪啊，但是搞了几下重启进桌面后又死机了，于是开机箱重新插拔硬盘数据线和电源口，这回机器流畅多了，但是老家伙只给我20元，哎，郁闷死啊，好歹也是硬件故障啊，真后悔没给她直接换件了，好人难做啊，什么世道啊</p>
<p>&#160;</p>
<p>小知识：hal.dll是Windows硬件提取层模块，该用于用于解决硬件的复杂性。<br>对应的 HAL 文件</p>
<p>ACPI Multiprocessor PC<br>halmacpi.dl_</p>
<p>ACPI Uniprocessor PC<br>halaacpi.dl_</p>
<p>Advanced Configuration and Power Interface (ACPI) PC<br>halacpi.dl_</p>
<p>MPS Multiprocessor PC<br>halmps.dl_</p>
<p>MPS Uniprocessor PC<br>halapic.dl_</p>
<p>Standard PC<br>hal.dl_</p>
<p>Compaq SystemPro Multiprocessor or 100% Compatible<br>halsp.dl_</p>
<p>属于： Microsoft Windows Operating System</p>
<p>解决方法：</p>
<p>提示hal.dll损坏或丢失,实际上该文件并不一定不存在,可以说，拷个文件回去system32里，根本是不可以解决的.出现这个错误的原因是boot.ini文件出错,导致引导不了机器从指定的路径启动,那样系统搜索其他的路径，而其他路径上是没有hal.dll文件的,就会提示这个错误.一般的解决办法是进入故障恢复控制台,用fixboot命令,如果这样修复不了boot.ini,就用bootcfg/add来重建boot.ini。</p>
<p>这个是由于C盘根目录下的boot.ini文件非法，导致默认从C:＼Windows启动，但是又由于你的Windows XP没有安装在C盘，所以系统提示找不到HAL.DLL文件。启动因而失败。解决方法是重新编辑Boot.ini文件。</p>
<p>1)、使用Win9X启动盘启动，使用EDIT.EXE命令编辑这个文件。启动EDIT.EXE以后只要按照正确的格式输入Boot.ini文件的内容，保存为Boot.ini文件即可。</p>
<p>2)、使用COPY CON命令创建一个Boot.ini文件。在DOS下输入Copy Con C:＼boot.ini以后回车。然后按照Boot.ini文件的格式输入，每输入一行敲一次回车键，当全部内容输入完毕以后，按CTRL+Z，屏幕上会看到^Z的提示。这个时候再敲一次回车，系统会提示1 file(s) copied.这就表示创建成功了。</p>
<p>3)、使用故障恢复控制台里面的bootcfg命令。</p>
<p>4)、在别的电脑上创建好以后，拷贝到受损电脑的C盘根目录上覆盖源文件即可。</p>
<p><br>还有个办法，你用个u盘从别个那里拷一个 hal.dll文件，然后插在你的电脑上，再用一张系统安装盘放进光驱。在第一选择里，选择修复，就可以进入doc里了。然后从a: b: 一直试下去，看到了u盘就要吧用 <br>copy hal.dll c:\windows\system32\hal.dll 就可以了， <br>原理是在安装系统的时候，u盘也会被检测到，就可以用了。</p>
<p><br>最近不知怎么把hal.dll给删了，导致一开机就显示boot.in非法启动，hal.dll丢失。经过一翻折腾，终于解决了问题。解决的方法如下：<br>首先必须知道自己的计算机名称，这可以从设备管理器里的计算机项中看出。根据不同的计算机名称对应需要扩展的hal.dll为：<br>acpi multiprocessor pc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; halmacpi.dl_<br>acpi uniprocessor pc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; halaacpi.dl_<br>advanced configuration and power interface(acpi)pc halacpi.dl_<br>mps multiprocessor pc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; halmaps.dl_<br>mps unitprocessor pc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; halapic.dl_<br>standard pc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hal.dl_<br>compaq systempro multiprcessor or 100% compatible halsp.dl_<br>但问题是如果hal.dll丢失那么连电脑也无法进去，怎么可以知道计算机的名称呢？我的方法比较极端：在f再安一个操作系统，这样也只能进去一次，但可以知道计算机的名称了。另外也可以用试的方式，将上述一一试过；当然，因为目前电脑第二、三种比较常见，可以先试这两个。我的电脑使第三种故以它为例。<br>接下来放入启动盘，从光盘启动，进入故障修复平台。需要说明的是xp家庭版与专业版可以通用，其他版本是否可以没有试过，不推荐使用。<br>之后的命令是：<br>del c:\windows\system32\hal.dll<br>expand x:\i386\halacpi.dl_ c:\windows\system32\<br>其中x的意思，举例来说，如果你分了3个硬盘分区，那么它就代表f，而不论你的光驱盘符具体多少。<br>ren c:\windows\system32\halacpi.dll hal.dll<br>copy c:\windows\hal.dll c:\windows\system32\hal.dll<br>del c:\windows\hal.dll<br>exit<br>这样就好了。关于为什么重新命名后hal.dll为什会在windows文件夹而非system32下目前还不清楚，因为这是我的电脑遇到的情况，如果不放心，可以用dir命令在ren后看看hal.dll到底在哪儿；如果在system32下，就不用使用copy命令了。</p>
<p>WinXP启动提示缺少Windows root/system32/hal.dll。不重装XP如何解决，</p>
<p>这个是由于C盘根目录下的boot.ini文件非法，导致默认从C:\\Windows启动，由于你的Windows XP没有安装在C盘，所以系统提示找不到HAL.DLL文件。启动因而失败。<br>解决方法是重新编辑Boot.ini文件。下面几种便于操作的：</p>
<p><br>1)、使用Win9X启动盘启动，使用EDIT.EXE命令编辑这个文件。启动EDIT.EXE以后只要按照正确的格式输入Boot.ini文件的内容，保存为Boot.ini文件即可。</p>
<p><br>2)、使用COPY CON命令创建一个Boot.ini文件。在DOS下输入Copy Con C:\\boot.ini以后回车。然后按照Boot.ini文件的格式输入，每输入一行敲一次回车键，当全部内容输入完毕以后，按CTRL+Z，屏幕上会看到^Z的提示。这个时候再敲一次回车，系统会提示1 file(s) copied.这就表示创建成功了。</p>
<p><br>3)、使用故障恢复控制台里面的bootcfg命令。</p>
<p><br>4)、在别的电脑上创建好以后，拷贝到受损电脑的C盘根目录上覆盖源文件即可。</p>
<p>就是在DOS下运行EDIT.EXE命令啊进DOS后输入EDIT.EXE后回车即可!<br>好把,换种方法,一个目的!在给你一个办法,你试一下!<br>hal.dll文件损坏或丢失,那么就意味着C盘下的BOOT.INI文件被损坏<br>重新写一个BOOT.INI文件,你想法进入DOS后复制到C盘跟目录下即可. 以下是BOOT.INI 文件的内容,你复制后保存为BOOT.INI文件.<br>[boot loader]<br>timeout=30<br>default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS<br>[operating systems]<br>multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect<br>用文本写入,保存为BOOT.INI 考入有启动功能的U盘!<br>用U盘进入DOS,用COPY X:\BOOT.INI C:\BOOT.INI即可</p>
</div>
</div>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/127984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-09-28 18:28 <a href="http://www.cppblog.com/wangqiulin/archive/2010/09/28/127984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近在学习计算机图形，就顺便收集了些相关资料，跟大家分享下！</title><link>http://www.cppblog.com/wangqiulin/archive/2010/09/27/127872.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Mon, 27 Sep 2010 06:52:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/09/27/127872.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/127872.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/09/27/127872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/127872.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/127872.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;                                    OpenGL入门学习                                                                                                                        ...&nbsp;&nbsp;<a href='http://www.cppblog.com/wangqiulin/archive/2010/09/27/127872.html'>阅读全文</a><img src ="http://www.cppblog.com/wangqiulin/aggbug/127872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-09-27 14:52 <a href="http://www.cppblog.com/wangqiulin/archive/2010/09/27/127872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用U盘装系统的三种方法</title><link>http://www.cppblog.com/wangqiulin/archive/2010/09/27/127869.html</link><dc:creator>王秋林</dc:creator><author>王秋林</author><pubDate>Mon, 27 Sep 2010 06:40:00 GMT</pubDate><guid>http://www.cppblog.com/wangqiulin/archive/2010/09/27/127869.html</guid><wfw:comment>http://www.cppblog.com/wangqiulin/comments/127869.html</wfw:comment><comments>http://www.cppblog.com/wangqiulin/archive/2010/09/27/127869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangqiulin/comments/commentRss/127869.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangqiulin/services/trackbacks/127869.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; 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"><span class=Apple-style-span style="FONT-SIZE: 12px; COLOR: rgb(50,62,50); FONT-FAMILY: Verdana, 宋体, sans-serif; TEXT-ALIGN: left">
<div class=articalTitle style="CLEAR: both; PADDING-BOTTOM: 10px; COLOR: red; LINE-HEIGHT: 20px">&nbsp;</div>
<div class=articalContent id=sina_keyword_ad_area2 style="CLEAR: both; OVERFLOW-Y: hidden; FONT-SIZE: 14px; OVERFLOW-X: hidden; PADDING-BOTTOM: 30px; WIDTH: 690px; WORD-BREAK: normal; LINE-HEIGHT: 21px; PADDING-TOP: 18px; FONT-FAMILY: simsun; WORD-WRAP: normal">
<p style="BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 5px; WORD-BREAK: normal; LINE-HEIGHT: 21px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none; BORDER-RIGHT-WIDTH: 0px; WORD-WRAP: normal">用U盘装系统的三种方法<br><br>我今天上午花了70多元买了一个4G的Kingston牌的U盘，学习制作U盘启动盘，用U盘装系统。我刚试验成了三种U盘装系统的方法，现在说出来让大家分享。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>（一）制作好U盘启动盘。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>1. 下载MaxDOS+WinPE，本论坛上有。解压后，点击[安装.bat]<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>2.在安装界面输入&#8220;Y&#8221;回车。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>3.安装程序将检测到你当前已连接好的U盘，并列表出来。如果没有检测到U盘，请你重插U盘，并按&#8220;Y&#8221;返回主菜单，重新开始安装。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>4.按任意键后，弹出格式化工具，-----------选中U盘---------------FAT32------------------ga开始格式化U盘。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>5.格式化完成后，点击&#8220;确定&#8221;，再点击下面的&#8220;关闭&#8221;，安装程序将进入下一步，写入引导记录，按任意键进入写入引导记录。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>6.按任意键后，（1）磁盘：选U盘。（2）选项：可以不作任何改变，也可以勾选四项：不保存原来MBR，不引导原来MBR，输出详细信息，启动时不搜索软盘。点[安装]开始写入引导。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>7.写入引导记录后，回车------------退出。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>8.按任意键，数据写入。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>9.数据写入界面，在&#8216;目标文件夹&#8217;处，点&#8216;浏览&#8217;，选择U盘，点击[安装]<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>10.安装完成后，按任意键退出<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>11.至此，双启动U盘启动盘就制作好了，重启电脑，在BIOS里设置HDD中的USB启动。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>12,把系统光盘镜像文件ISO和GHOST镜像文件复制到U盘里。<br>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>&nbsp;<wbr><span class=Apple-converted-space>&nbsp;</span>（二）用U盘安装系统的三种方法：<br>1 U盘启动，进PE，开始--------程序------------磁盘光盘工具----------Virtual Drive Manager (PE自带的虚拟光驱）--------装载---------浏览---------选中U盘上的光盘镜像文件ISO，------打开--------------确定。（此时，Virtual Drive Manager不要关闭）（这时，打开PE下的&#8220;我的电脑&#8221;，&#8220;有移动可存储设备&#8221;下，就有你刚才所选中镜像的CD了。）。再从开始菜单找到GHOST程序，就可安装系统了。<br>2. U盘启动后，进PE--------开始---------程序-------------克隆工具----------调出GHOST界面，选中U盘上的镜像文件GHO，就可以把系统装到C盘了。<br>3. 加载虚拟光驱，----------选中U盘里的ISO光盘镜像，----------打开虚拟光驱，-------------浏览光盘文件，--------------双击GHOST镜像安装器，----------确定----------重启计算机----------------开机后就自动进入GHOST界面进行安装系统。</p>
</div>
</span></span>
<img src ="http://www.cppblog.com/wangqiulin/aggbug/127869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangqiulin/" target="_blank">王秋林</a> 2010-09-27 14:40 <a href="http://www.cppblog.com/wangqiulin/archive/2010/09/27/127869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>