﻿<?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++博客-Welcome to ErranLi's Blog!</title><link>http://www.cppblog.com/erran/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 04:10:00 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 04:10:00 GMT</pubDate><ttl>60</ttl><item><title>面试题目</title><link>http://www.cppblog.com/erran/archive/2012/08/31/188892.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 31 Aug 2012 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/08/31/188892.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/188892.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/08/31/188892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/188892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/188892.html</trackback:ping><description><![CDATA[<p>
<span style="color: red">1、 </span>代码：</p>
<p>#include "stdio.h"<br />
<br />
int a=0;<br />
<br />
int b;<br />
<br />
static char c;<br />
<br />
int main(int argc,char *argv[])<br />
<br />
{<br />
<br />
char d=4;<br />
<br />
static short e;<br />
<br />
a++;<br />
<br />
b=100;<br />
<br />
c=(char)++a;<br />
<br />
e=(++d)++;<br />
<br />
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);<br />
<br />
return 0;<br />
<br />
}<br />
<br />
a) 写出程序输出<br />
<br />
b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。</p>
<p><br />
</p>
<p>答案：</p>
<p>int a=0; // data section<br />
int b;   // data section<br />
static char c; // BSS<br />
int main(int argc,char *argv[])<br />
{&nbsp;  &nbsp;</p>
<p>
char d=4;         // stack
<br />
static short e;   // BSS</p>
<p>｝</p>
<p>a=2,b=100,c=2,d=6,e=5</p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red">2、</span>中断是嵌入式系统中重要的组成部分，这导致了许多编译开发商提供一种扩展：让标准C支持中断，产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。<br />
<br />
&nbsp;__interrupt double compute_area(double radius)<br />
&nbsp;{<br />
&nbsp;double area = PI * radius *radius;<br />
&nbsp;printf("nArea = %f", area);<br />
&nbsp;return area;<br />
}</p>
<p><br />
</p>
<p>答案：</p>
<p>a)ISR不能返回一个值；<br />
b)ISR不能传递参数；<br />
c)浮点一般都是不可重入的；<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">在许多的处理器<font face="Arial">/</font><font face="宋体">编译器中，浮点一般都是不可重入的。有些处理器</font><font face="Arial">/</font><font face="宋体">编译器需要让额处的寄存器入栈，有些处理器</font><font face="Arial">/</font><font face="宋体">编译器就是不允许在</font><font face="Arial">ISR</font><font face="宋体">中做浮点运算。此外，</font><font face="Arial">ISR</font><font face="宋体">应该是短而有效率的，在</font><font face="Arial">ISR</font><font face="宋体">中做浮点运算是不明智的</font></span><br />
d)printf函数有重入和性能上的问题。</p>
<p><br />
</p>
<p><span style="color: red">3、</span>关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。</p>
<p><br />
</p>
<p>答案：</p>
<p>用volatile关键字定义变量，相当于告诉编译器，这个变量的值会随时发生变化，每次使用时都需要去内存里重新读取它的值，并不要随意针对它作优化。建议使用volatile变量的场所：<br />
(1) 并行设备的硬件寄存器
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体">（如：状态寄存器）</font></span>
<br />
(2) 一个中断服务子程序中会访问到的非自动变量（全局变量）
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="Arial">(Non-automatic&nbsp;variables)</font></span>
<br />
(3) 多线程应用中被几个任务共享的变量</p>
<p>
</p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">回答不出这个问题的人是不会被雇佣的。我认为这是区分<font face="Arial">C</font><font face="宋体">程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、</font><font face="Arial">RTOS</font><font face="宋体">等等打交道，所有这些都要求用到</font><font face="Arial">volatile</font><font face="宋体">变量。不懂得</font><font face="Arial">volatile</font><font face="宋体">的内容将会带来灾难。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">假设被面试者正确地回答了这是问题（嗯，怀疑是否会是这样），我将稍微深究一下，看一下这家伙是不是直正懂得<font face="Arial">volatile</font><font face="宋体">完全的重要性。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">1)<font face="宋体">一个参数既可以是</font><font face="Arial">const</font><font face="宋体">还可以是&nbsp;</font><font face="Arial">volatile</font><font face="宋体">吗？解释为什么。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">2);&nbsp;<font face="宋体">一个指针可以是</font><font face="Arial">volatile&nbsp;</font><font face="宋体">吗？解释为什么。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">3);&nbsp;<font face="宋体">下面的函数有什么错误：</font></span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;square(volatile&nbsp;int&nbsp;*ptr)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">{</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;*ptr&nbsp;*&nbsp;*ptr;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">}</span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">下面是答案：</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">1)<font face="宋体">是的。一个例子是只读的状态寄存器。它是</font><font face="Arial">volatile</font><font face="宋体">因为它可能被意想不到地改变。它是</font><font face="Arial">const</font><font face="宋体">因为程序不应该试图去修改它。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">2);&nbsp;<font face="宋体">是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个</font><font face="Arial">buffer</font><font face="宋体">的指针时。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">3)&nbsp;<font face="宋体">这段代码有点变态。这段代码的目的是用来返指针</font><font face="Arial">*ptr</font><font face="宋体">指向值的平方，但是，由于</font><font face="Arial">*ptr</font><font face="宋体">指向一个</font><font face="Arial">volatile</font><font face="宋体">型参数，编译器将产生类似下面的代码：</font></span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;square(volatile&nbsp;int&nbsp;*ptr)&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">{</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a,b;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;*ptr;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;*ptr;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a&nbsp;*&nbsp;b;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">}</span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">由于<font face="Arial">*ptr</font><font face="宋体">的值可能被意想不到地该变，因此</font><font face="Arial">a</font><font face="宋体">和</font><font face="Arial">b</font><font face="宋体">可能是不同的。结果，这段代码可能返不是你所期望的平方值！正确的代码如下：</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">long&nbsp;square(volatile&nbsp;int&nbsp;*ptr)&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">{</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;*ptr;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a&nbsp;*&nbsp;a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">}</span></p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red">4、</span>C语言中static关键字的具体作用有哪些</p>
<p><br />
</p>
<p>答案：</p>
<p>在函数体，一个被声明为静态的变量在这一函数被调用过程中维持其值不变。<br />
在模块内（但在函数体外），一个被声明为静态的变量可以被模块内所用函数访问，但不能被模块外其它函数访问。它是一个本地的全局变量。<br />
在模块内，一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是，这个函数被限制在声明它的模块的本地范围内使用。<br />
static全局变量与普通的全局变量有什么区别：static全局变量只初使化一次，防止在其他文件单元中被引用;<br />
static局部变量和普通局部变量有什么区别：static局部变量只被初始化一次，下一次依据上一次结果值；<br />
static函数与普通函数有什么区别：static函数在内存中只有一份，普通函数在每个被调用中维持一份拷贝</p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red">5、</span>下面三种变量声明有何区别?请给出具体含义<br />
<br />
int const *p;<br />
<br />
int* const p;<br />
<br />
int const* const p;</p>
<p><br />
</p>
<p><br />
</p>
<p>答案：</p>
<p>一个指向常整型数的指针<br />
一个指向整型数的常指针<br />
一个指向常整型数的常指针</p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red">6、</span>对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。</p>
<p><br />
</p>
<p>答案：</p>
<p>little endian        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; big endian&nbsp;<br />
高地址--〉 0x12      &nbsp; &nbsp; &nbsp;低地址--〉 0x12<br />
&nbsp;            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0x34                 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x34<br />
&nbsp;            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0x56                 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0x56<br />
低地址--〉 0x78      &nbsp; &nbsp; &nbsp;高地址--〉 0x78</p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red">7、</span>在ARM系统中，函数调用的时候，参数是通过哪种方式传递的?</p>
<p><br />
</p>
<p>答案：</p>
<p>参数&lt;=4时候，通过R0~R3传递，&gt;4的通过压栈方式传递</p>
<p><br />
</p>
<p><span style="color: red">8、</span>中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?</p>
<p><br />
</p>
<p>
答案：
</p>
<p>异常：在产生时必须考虑与处理器的时钟同步，实践上，异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时，或者在执行期间出现特殊情况(如缺页)，必须靠内核处理的时候，处理器就会产生一个异常。<br />
所谓中断应该是指外部硬件产生的一个电信号，从cpu的中断引脚进入，打断cpu当前的运行；<br />
所谓异常，是指软件运行中发生了一些必须作出处理的事件，cpu自动产生一个陷入来打断当前运行，转入异常处理流程。<br />
</p>
<p><br />
</p>
<p><span style="color: red">9、</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">用预处理指令<font face="Arial">#define&nbsp;</font><font face="宋体">声明一个常数，用以表明</font><font face="Arial">1</font><font face="宋体">年中有多少秒（忽略闰年问题）</font></span></p>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p>
答案：
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p>
</p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">#define&nbsp;SECONDS_PER_YEAR&nbsp;(60&nbsp;*&nbsp;60&nbsp;*&nbsp;24&nbsp;*&nbsp;365)UL</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">我在这想看到几件事情：</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">1)&nbsp;#define&nbsp;<font face="宋体">语法的基本知识（例如：不能以分号结束，括号的使用，等等）</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">2)<font face="宋体">懂得预处理器将为你计算常数表达式的值，因此，直接写出你是如何计算一年中有多少秒而不是计算出实际的值，是更清晰而没有代价的。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">3)&nbsp;<font face="宋体">意识到这个表达式将使一个</font><font face="Arial">16</font><font face="宋体">位机的整型数溢出</font><font face="Arial">-</font><font face="宋体">因此要用到长整型符号</font><font face="Arial">L,</font><font face="宋体">告诉编译器这个常数是的长整型数。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">4)&nbsp;<font face="宋体">如果你在你的表达式中用到</font><font face="Arial">UL</font><font face="宋体">（表示无符号长整型），那么你有了一个好的起点。记住，第一印象很重要。</font></span></p>
<p><br />
</p>
<p><span style="color: red">10、</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">用变量<font face="Arial">a</font><font face="宋体">给出下面的定义</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">a)&nbsp;<font face="宋体">一个整型数（</font><font face="Arial">An&nbsp;integer</font><font face="宋体">）&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">b)<font face="宋体">一个指向整型数的指针（&nbsp;</font><font face="Arial">A&nbsp;pointer&nbsp;to&nbsp;an&nbsp;integer</font><font face="宋体">）&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">c)<font face="宋体">一个指向指针的的指针，它指向的指针是指向一个整型数（&nbsp;</font><font face="Arial">A&nbsp;pointer&nbsp;to&nbsp;a&nbsp;pointer&nbsp;to&nbsp;an&nbsp;intege</font><font face="宋体">）</font><font face="Arial">r&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">d)<font face="宋体">一个有</font><font face="Arial">10</font><font face="宋体">个整型数的数组（&nbsp;</font><font face="Arial">An&nbsp;array&nbsp;of&nbsp;10&nbsp;integers</font><font face="宋体">）&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">e)&nbsp;<font face="宋体">一个有</font><font face="Arial">10</font><font face="宋体">个指针的数组，该指针是指向一个整型数的。（</font><font face="Arial">An&nbsp;array&nbsp;of&nbsp;10&nbsp;pointers&nbsp;to&nbsp;integers</font><font face="宋体">）&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">f)&nbsp;<font face="宋体">一个指向有</font><font face="Arial">10</font><font face="宋体">个整型数数组的指针(</font><font face="Arial">A pointer to an array of 10 integers)</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">g)&nbsp;<font face="宋体">一个指向函数的指针，该函数有一个整型参数并返回一个整型数</font><font face="Arial"> (pointer to a function that takes an integer as an argument and returns an integer</font><font face="宋体">）&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">h)&nbsp;<font face="宋体">一个有</font><font face="Arial">10</font><font face="宋体">个指针的数组，该指针指向一个函数，该函数有一个整型参数并返回一个整型数(</font><font face="Arial">An array of ten pointers to functions that take an integer argument and return an integer</font><font face="宋体">）</font></span></p>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体">答案：<br />
</font></span></p>
<p>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">a)&nbsp;int a;<font face="宋体">&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">b) int *a<font face="宋体">;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">c) int **a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">d) int a[10];</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="font-size: 10.5pt; font-family: &quot;Arial&quot;">e) int *a[10];</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="font-size: 10.5pt; font-family: &quot;Arial&quot;">f) int (*a)[10];</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="font-size: 10.5pt; font-family: &quot;Arial&quot;">g) int (*a)(int) ;<font face="宋体">&nbsp;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="font-size: 10.5pt; font-family: &quot;Arial&quot;">h) </span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int (*a[10])(int) ;<font face="宋体">&nbsp;</font></span>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p><br />
</p>
<p><span style="color: red">11、</span><span style="font-size: 10.5pt; font-family: &quot;Arial&quot;">下面的声明都是什么意思？</span></p>
<p>
</p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">const&nbsp;int&nbsp;a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;const&nbsp;a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">const&nbsp;int&nbsp;*a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;*&nbsp;const&nbsp;a;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;const&nbsp;*&nbsp;a&nbsp;const;</span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">答案：</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">前两个的作用是一样，<font face="Arial">a</font><font face="宋体">是一个常整型数。第三个意味着</font><font face="Arial">a</font><font face="宋体">是一个指向常整型数的指针（也就是，整型数是不可修改的，但指针可以）。第四个意思</font><font face="Arial">a</font><font face="宋体">是一个指向整型数的常指针（也就是说，指针指向的整型数是可以修改的，但指针是不可修改的）。最后一个意味着</font><font face="Arial">a</font><font face="宋体">是一个指向常整型数的常指针（也就是说，指针指向的整型数是不可修改的，同时指针也是不可修改的）。如果应试者能正确回答这些问题，那么他就给我留下了一个好印象。顺带提一句，也许你可能会问，即使不用关键字&nbsp;</font><font face="Arial">const</font><font face="宋体">，也还是能很容易写出功能正确的程序，那么我为什么还要如此看重关键字</font><font face="Arial">const</font><font face="宋体">呢？我也如下的几下理由：</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">1)&nbsp;<font face="宋体">关键字</font><font face="Arial">const</font><font face="宋体">的作用是为给读你代码的人传达非常有用的信息，实际上，声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾，你就会很快学会感谢这点多余的信息。（当然，懂得用</font><font face="Arial">const</font><font face="宋体">的程序员很少会留下的垃圾让别人来清理的。）</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">2)&nbsp;<font face="宋体">通过给优化器一些附加的信息，使用关键字</font><font face="Arial">const</font><font face="宋体">也许能产生更紧凑的代码。</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">3)&nbsp;<font face="宋体">合理地使用关键字</font><font face="Arial">const</font><font face="宋体">可以使编译器很自然地保护那些不希望被改变的参数，防止其被无意的代码修改。简而言之，这样可以减少</font><font face="Arial">bug</font><font face="宋体">的出现。</font></span></p>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<p><span style="font-size: 10.5pt; font-family: &quot;Arial&quot;; color: red">12、</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">下面的代码输出是什么，为什么？</span>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">void&nbsp;foo(void)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">{</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;a&nbsp;=&nbsp;6;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;b&nbsp;=&nbsp;-20;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">&nbsp;&nbsp;&nbsp;&nbsp;(a+b&nbsp;&gt;&nbsp;6)&nbsp;?&nbsp;puts("&gt;&nbsp;6")&nbsp;:&nbsp;puts("&lt;=&nbsp;6");</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">}</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">答案：<br />
</span></p>
<p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">这个问题测试你是否懂得<font face="Arial">C</font><font face="宋体">语言中的整数自动转换原则，我发现有些开发者懂得极少这些东西。不管如何，这无符号整型问题的答案是输出是&nbsp;</font><font face="Arial">"&gt;6"</font><font face="宋体">。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此</font><font face="Arial">-20</font><font face="宋体">变成了一个非常大的正整数，所以该表达式计算出的结果大于</font><font face="Arial">6</font><font face="宋体">。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<span style="font-size: 10.5pt; font-family: &quot;Arial&quot;; color: red">13、</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">Typedef <font face="宋体">在</font><font face="Arial">C</font><font face="宋体">语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如，思考一下下面的例子：</font></span>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">#define&nbsp;dPS&nbsp;struct&nbsp;s&nbsp;*</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">typedef&nbsp;struct&nbsp;s&nbsp;*&nbsp;tPS;</span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">以上两种情况的意图都是要定义<font face="Arial">dPS&nbsp;</font><font face="宋体">和&nbsp;</font><font face="Arial">tPS&nbsp;</font><font face="宋体">作为一个指向结构</font><font face="Arial">s</font><font face="宋体">指针。哪种方法更好呢？（如果有的话）为什么？</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">答案：</span></p>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">这是一个非常微妙的问题，任何人答对这个问题（正当的原因）是应当被恭喜的。答案是：<font face="Arial">typedef</font><font face="宋体">更好。思考下面的例子：</font></span></p>
<p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">dPS&nbsp;p1,p2;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">tPS&nbsp;p3,p4;</span></p>
<p class="p16" style="margin-bottom:0pt; margin-top:0pt; line-height:18.7500pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">第一个扩展为</span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">struct s * p1, p2;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">.</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">上面的代码定义<font face="Arial">p1</font><font face="宋体">为一个指向结构的指，</font><font face="Arial">p2</font><font face="宋体">为一个实际的结构，这也许不是你想要的。第二个例子正确地定义了</font><font face="Arial">p3&nbsp;</font><font face="宋体">和</font><font face="Arial">p4&nbsp;</font><font face="宋体">两个指针。晦涩的语法</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><span style="color: red">14、</span></font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">写出判断<font face="Arial">ABCD</font><font face="宋体">四个表达式的是否正确</font><font face="Arial">,&nbsp;</font><font face="宋体">若正确</font><font face="Arial">,&nbsp;</font><font face="宋体">写出经过表达式中&nbsp;</font><font face="Arial">a</font><font face="宋体">的值</font><font face="Arial">(3</font><font face="宋体">分</font><font face="Arial">)</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;a&nbsp;=&nbsp;4;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">(A)a&nbsp;+=&nbsp;(a++);&nbsp;(B)&nbsp;a&nbsp;+=&nbsp;(++a)&nbsp;;(C)&nbsp;(a++)&nbsp;+=&nbsp;a;(D)&nbsp;(++a)&nbsp;+=&nbsp;(a++);</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">a&nbsp;=&nbsp;?</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">答案：</span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="Arial">C </font><font face="宋体">错误，左侧不是一个有效变量，不能赋值，可改为</font><font face="Arial">(++a)&nbsp;+=&nbsp;a;</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">改后答案依次为<font face="Arial">9,10,10,11</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体">15、</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">某<font face="Arial">32</font><font face="宋体">位系统下</font><font face="Arial">,&nbsp;C++</font><font face="宋体">程序，请计算</font><font face="Arial">sizeof&nbsp;</font><font face="宋体">的值</font><font face="Arial">(5</font><font face="宋体">分</font><font face="Arial">).</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">char str[] = &#8220;www.ibegroup.com&#8221;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">char&nbsp;*p&nbsp;=&nbsp;str&nbsp;;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">int&nbsp;n&nbsp;=&nbsp;10;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">请计算</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">sizeof&nbsp;(str&nbsp;)&nbsp;=&nbsp;<font face="宋体">？（</font><font face="Arial">1</font><font face="宋体">）</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">sizeof&nbsp;(&nbsp;p&nbsp;)&nbsp;=&nbsp;<font face="宋体">？（</font><font face="Arial">2</font><font face="宋体">）</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">sizeof&nbsp;(&nbsp;n&nbsp;)&nbsp;=&nbsp;<font face="宋体">？（</font><font face="Arial">3</font><font face="宋体">）</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">void&nbsp;Foo&nbsp;(&nbsp;char&nbsp;str[100]){</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">请计算</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">sizeof(&nbsp;str&nbsp;)&nbsp;=&nbsp;<font face="宋体">？（</font><font face="Arial">4</font><font face="宋体">）</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">}</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">void&nbsp;*p&nbsp;=&nbsp;malloc(&nbsp;100&nbsp;);</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">请计算</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">sizeof&nbsp;(&nbsp;p&nbsp;)&nbsp;=&nbsp;<font face="宋体">？（</font><font face="Arial">5</font><font face="宋体">）</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">答案：</span>
</p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">（<font face="Arial">1</font><font face="宋体">）</font><font face="Arial">17&nbsp;</font><font face="宋体">（</font><font face="Arial">2</font><font face="宋体">）</font><font face="Arial">4&nbsp;</font><font face="宋体">（</font><font face="Arial">3</font><font face="宋体">）&nbsp;</font><font face="Arial">4&nbsp;</font><font face="宋体">（</font><font face="Arial">4</font><font face="宋体">）</font><font face="Arial">4&nbsp;</font><font face="宋体">（</font><font face="Arial">5</font><font face="宋体">）</font><font face="Arial">4</font></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<p class="p16" style="margin-bottom: 0pt; margin-top: 0pt; line-height: 18.75pt"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><font face="宋体"><br />
</font></span></p>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; ">
</span>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Arial'; "><br />
</span></p>
<img src ="http://www.cppblog.com/erran/aggbug/188892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-08-31 14:12 <a href="http://www.cppblog.com/erran/archive/2012/08/31/188892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uboot常用操作</title><link>http://www.cppblog.com/erran/archive/2012/08/30/188763.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 30 Aug 2012 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/08/30/188763.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/188763.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/08/30/188763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/188763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/188763.html</trackback:ping><description><![CDATA[<p><br />
</p>
<p>内存操作</p>
<p>
mw 0xc3000000 FF
</p>
<p>mw 0xc3000000 FF 1000</p>
<p>
md.b
0xe3000000
&nbsp;0x100000
</p>
<p>md.w
0xe3000000
&nbsp;0x100000&nbsp;</p>
<p><br />
</p>
<p>
</p>
<p>spi操作 （最小擦除单位为block）</p>
<p>sf read 0xe3000000 0 0x100000</p>
<p>md.b
0xe3000000
&nbsp;0x100000</p>
<p>sf read e30f0000 80000 100</p>
<p>md.w e30f0000 100</p>
<p>sf write e30E0000 0x80000 0x100000</p>
<p>sf erase 80000 10000</p>
<p><br />
</p>
<p>sd卡操作</p>
<p>run_command("mmc rescan 0", 0);<br />
run_command("mmcinfo", 0);<br />
run_command("fatls mmc 0", 0);</p>
<p>run_command("fatload mmc 0 0xc3000000 uboot-logo.bmp
", 0);
<br />
</p>
<p><br />
</p>
<p>&nbsp;把cf卡（fat格式）根目录中uboot-logo.bmp（大小142368 bytes）文件拷贝到spi的0x80000开始的地址上并且查看是否写正确：</p>
<p>u-boot&gt;
mmc rescan 0
</p>
<p>
u-boot&gt;
mmcinfo
</p>
<p>
u-boot&gt;
fatls mmc 0
</p>
<p>
u-boot&gt;
fatload mmc 0 0xc3000000 uboot-logo.bmp
</p>
<p>
u-boot&gt;
sf write
0xc3000000
0x80000 0x22c20</p>
<p>u-boot&gt;
sf read 0xc4000000
0x80000 0x22c20</p>
<p>
u-boot&gt;
md.b 0xc4000000
0x22c20</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<img src ="http://www.cppblog.com/erran/aggbug/188763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-08-30 15:34 <a href="http://www.cppblog.com/erran/archive/2012/08/30/188763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于灰度的一些知识</title><link>http://www.cppblog.com/erran/archive/2012/06/16/179026.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 16 Jun 2012 01:36:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/06/16/179026.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/179026.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/06/16/179026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/179026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/179026.html</trackback:ping><description><![CDATA[<div id="home">
<div id="main">
<div id="mainContent">
<div class="forFlow">
<div id="topics">
<div class="post">
<h1 class="postTitle"><a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/bnuvincent/archive/2009/07/22/1528751.html">关于灰度的一些知识（转）</a></h1>
<div class="postBody">
<div><span style="font-size: small;"><strong>http://www.cnblogs.com/bnuvincent/archive/2009/07/22/1528751.html<br />
</strong></span></div>
<div><span style="font-size: small;"><strong><br />
</strong></span></div>
<div id="cnblogs_post_body"><span style="font-size: small;"><strong>灰度</strong>使用黑色调表示物体。 每个灰度对象都具有从 0%（白色）到 100%（黑色）的亮度值。 使用黑白或灰度扫描仪生成的图像通常以灰度显示。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　使用灰度还可将彩色图稿转换为高质量黑白图稿。 在这种情况下，Adobe Illustrator 放弃原始图稿中的所有颜色信息；转换对象的灰色级别（阴影）表示原始对象的亮度。 <br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　将灰度对象转换为 RGB 时，每个对象的颜色值代表对象之前的灰度值。 也可以将灰度对象转换为 CMYK 对象。 <br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　自然界中的大部分物体平均灰度为18％。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　在物体的边缘呈现灰度的不连续性，图像分割就是基于这个原理。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　所谓灰度色，就是指纯白、纯黑以及两者中的一系列从黑到白的过渡色。我们平常说所的黑白照片、黑白电视，实际上都应该称为灰度照片、灰度电视才确切。灰度色中不包含任何色相，即不存在红色、黄色这样的颜色。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　灰度的通常表示方法是百分比，范围从0％到100％。Photoshop中只能输入整数，在Illustrator和GoLive允许输入小数百分比。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　注意这个百分比是以纯黑为基准的百分比。与RGB正好相反，百分比越高颜色越偏黑，百分比越低颜色越偏白。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　　灰度最高相当于最高的黑，就是纯黑。灰度最低相当于最低的黑，也就是&#8220;没有黑&#8221;，那就是纯白。<br />
</span>
<div class="spctrl"><span style="font-size: small;"> </span></div>
<span style="font-size: small;">　 　虽然灰度共有256级，但是由于Photoshop的灰度滑块只能输入整数百分比，因此实际上从灰度滑块中只能选择出101种(0%也算一种)灰度。大 家可以在灰度滑块中输入递增的数值然后切换到RGB滑块察看，可以看到：0%的灰度RGB数值是255,255,255；1%灰度的RGB数值是 253,253,253；2%灰度RGB值为250,250,250。也就是说，252,252,252这样的灰度是无法用Photoshop的灰度滑块 选中的。相比之下Illustrator的灰度允许输入两位小数，使得选色的精确性大大提高了 。<br />
</span>
<p><span style="font-size: small;"><strong>灰度图像</strong>gray level image</span></p>
<p> <span style="font-size: small;">在计算机领域中，<strong>灰度</strong>数 字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度，尽管理论上这个采样可以任何颜色的不同深浅，甚至可以是不同 亮度上的不同颜色。灰度图像与黑白图像不同，在计算机图像领域中黑白图像只有黑色与白色两种颜色；灰度图像在黑色与白色之间还有许多级的颜色深度。但是， 在数字图像领域之外，&#8220;黑白图像&#8221;也表示&#8220;灰度图像&#8221;，例如灰度的照片通常叫做&#8220;黑白照片&#8221;。在一些关于数字图像的文章中<strong>单色图像</strong>等同于灰度图像，在另外一些文章中又等同于黑白图像。</span></p>
<p><span style="font-size: small;">灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的。</span></p>
<p><span style="font-size: small;">用 于显示的灰度图像通常用每个采样像素 8 位的非线性尺度来保存，这样可以有 256 级灰度。这种精度刚刚能够避免可见的条带失真，并且非常易于编程。在医学图像与遥感图像这些技术应用中经常采用更多的级数以充分利用每个采样 10 或 12 位的传感器精度，并且避免计算时的近似误差。在这样的应用领域每个采样 16 位即 65536 级得到流行。</span></p>
<p><span style="font-size: small;"><strong>二值图像</strong></span></p>
<p><span style="font-size: small;">二 值图像是一种简单的图像格式，它只有两个灰度级，即"0"表示黑色的像素点，"255"表示白色的像素点。二值图像处理在图像处理领域占据很重要的位置， 在具体的图像处理应用系统中，往往需要对于获得的二值图像再进一步进行处理，以有利于后期的识别工作。二值图像处理运算是从数学形态学下的集合论方法发展 起来的,尽管它的基本运算很简单，但是却可以产生复杂的效果。常用的二值图像处理操作有许多方法，如腐蚀、膨胀、细化、开运算和闭运算等等。</span></p>
<p><br />
</p>
<p><br />
</p>
<p>ubject: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 10:54    Length: 1,718 byte(s)<br />
[Original] [Print] [Top]<br />
大家知道，16位的制式为r 5 g 6 b 5,最多能显示2的5次方（即32级灰度），现在16位，640*480的，framebuffer已经可以在我自己的TFT屏上正常运行，但是为了达到256级灰度必须改为24位的framebuffer，<br />
<br />
arm是s3c2440，TFT屏是LG.PHILIPS LCD ，为了运行24位的framebuffer,我做了如下修改<br />
1。我把16位驱动中的16位相关都改为24位的了，例如：<br />
if ( var-&gt;bits_per_pixel == 24 ) {//change add<br />
var-&gt;red.offset = 16; var-&gt;red.length = 8;<br />
var-&gt;green.offset = 8; var-&gt;green.length = 8;<br />
var-&gt;blue.offset = 0; var-&gt;blue.length = 8;<br />
var-&gt;transp.offset = var-&gt;transp.length = 0;<br />
}else if ( var-&gt;bits_per_pixel == 16 ) {<br />
var-&gt;red.offset = 11; var-&gt;red.length = 5;<br />
var-&gt;green.offset = 5; var-&gt;green.length = 6;<br />
var-&gt;blue.offset = 0; var-&gt;blue.length = 5;<br />
var-&gt;transp.offset = var-&gt;transp.length = 0;<br />
}<br />
2。因为16位的framebuffer可以运行，我没有修改5个控制寄存器，我修改了地址寄存器2，3，如下<br />
<br />
/* 16bpp 24bpp*/<br />
new_regs.lcdsaddr2 = LCDADDR_BASEL(<br />
((unsigned long)VideoPhysicalTemp + (var-&gt;xres * 3 * (var-&gt;yres/*-1*/)))<br />
&gt;&gt; 1);//change 2 to 3<br />
<br />
new_regs.lcdsaddr3 = LCDADDR_OFFSET(0) | (LCDADDR_PAGE(var-&gt;xres*3/2) /*&gt;&gt; 1*/);<br />
编译后运行，在屏幕上出现了（横4竖4）共16个小图象，都是24位的（用示波器检测过了），<br />
<br />
这是怎么回事呢？是寄存器没有设置正确，还是在修改驱动时出现了问题呢？<br />
本人新手，请大家指教，谢谢！！     <br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: gg940231    Posted: 2007-09-24 10:59    Length: 62 byte(s)<br />
[Original] [Print] [Top]<br />
好像只有 4级 ，16级灰度 吧，，，还没有听说过 256级灰度呢。。。<br />
----<br />
&lt;&lt; 发展才是硬道理 &gt;&gt; QQ:77291408 gg940231@163.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 11:05    Length: 192 byte(s)<br />
[Original] [Print] [Top]<br />
这里再做一些补充，和许多TFT屏一样我的TFT屏上只有18根数据线(R6 G6 B6)，framebuffer作成24位的（R8G8B8），TFT上显示6位的数据（R6G6B6）,这样就能显示64级灰度了，我的目标就是显示64级灰度。谢谢大家！<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 11:11    Length: 92 byte(s)<br />
[Original] [Print] [Top]<br />
24位的图象约有16M色的图象（即2的24次方），当RGB的值相等时显示为灰度，即2的8次方（256级灰度）<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: gg940231    Posted: 2007-09-24 11:22    Length: 89 byte(s)<br />
[Original] [Print] [Top]<br />
那你就直接用 16位TFT 的就可以了啊，在 gui 里去增加个函数， 转换 16位真彩色 到 你的 灰度。<br />
----<br />
&lt;&lt; 发展才是硬道理 &gt;&gt; QQ:77291408 gg940231@163.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 11:33    Length: 99 byte(s)<br />
[Original] [Print] [Top]<br />
这也行？怎么搞？<br />
还有那个写GUI的会砍死我的，他本来任务就重，我还想搞完驱动去帮他一把呢！！<br />
----<br />
qq:554726623<br />
email:freeubuntu@hotmail.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: gg940231    Posted: 2007-09-24 11:41    Length: 99 byte(s)<br />
[Original] [Print] [Top]<br />
不知道你用什么 GUI ，我的是 microwindows ，通常底层就是些，打点，划线的函数，看看吧，不复杂的。。。<br />
----<br />
&lt;&lt; 发展才是硬道理 &gt;&gt; QQ:77291408 gg940231@163.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: rocky1972    Posted: 2007-09-24 11:48    Length: 614 byte(s)<br />
[Original] [Print] [Top]<br />
**************************************************************************************<br />
2。因为16位的framebuffer可以运行，我没有修改5个控制寄存器，我修改了地址寄存器2，3，如下<br />
<br />
/* 16bpp 24bpp*/<br />
new_regs.lcdsaddr2 = LCDADDR_BASEL(<br />
((unsigned long)VideoPhysicalTemp + (var-&gt;xres * 3 * (var-&gt;yres/*-1*/)))<br />
&gt;&gt; 1);//change 2 to 3<br />
***************************************************************************************<br />
<br />
16bpp换成24bpp当然还要修改LCD CON1的BPPMODE＝TFT24BPP了，查看datasheet LCDCON1 寄存器一下。     <br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: rockos    Posted: 2007-09-24 12:47    Length: 210 byte(s)<br />
[Original] [Print] [Top]<br />
晕~~~<br />
<br />
2.6.20内核中包含的s3c24xx framebuffer驱动可以直接支持24位色, copy到你的版本就可以了.<br />
<br />
这个版本的fb把lcdcon的功能基本上都实现了, 1, 2, 4, 8, 12, 16, 24位色模式都支持了.     <br />
----<br />
不喜欢GPL, BSD的免费许可不错.<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 14:39    Length: 222 byte(s)<br />
[Original] [Print] [Top]<br />
对不起，这个我忘说了，控制寄存器1我改了的，如下：<br />
.reg = {<br />
/*111111000 这里把寄存器改为13*/<br />
.lcdcon1 = (1&lt;&lt;8)|(1&lt;&lt;7)|(3&lt;&lt;5)|(13&lt;&lt;1),     <br />
----<br />
qq:554726623<br />
email:freeubuntu@hotmail.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 15:11    Length: 118 byte(s)<br />
[Original] [Print] [Top]<br />
有这等好事！原来我用的是2.6.12的内核，我马上下一个2.6.20的内核看一下，<br />
<br />
要知后事如何，且听下回分解。<br />
----<br />
qq:554726623<br />
email:freeubuntu@hotmail.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 15:58    Length: 65 byte(s)<br />
[Original] [Print] [Top]<br />
2.6.20中的framebuffer我看了一下，不行啊，要改很多地方吧<br />
----<br />
qq:554726623<br />
email:freeubuntu@hotmail.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-24 18:42    Length: 1,647 byte(s)<br />
[Original] [Print] [Top]<br />
我已经仔细看过了2.6.20.6内核中的s3c2410fb.c，我发现这个也是16位的。如下：<br />
if (fbi-&gt;mach_info-&gt;type == S3C2410_LCDCON1_TFT)<br />
switch (var-&gt;bits_per_pixel) {<br />
case 1:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_TFT1BPP;<br />
break;<br />
case 2:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_TFT2BPP;<br />
break;<br />
case 4:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_TFT4BPP;<br />
break;<br />
case 8:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_TFT8BPP;<br />
break;<br />
case 16:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_TFT16BPP;<br />
break;<br />
<br />
default:<br />
/* invalid pixel depth */<br />
dev_err(fbi-&gt;dev, "invalid bpp %d ", var-&gt;bits_per_pixel);<br />
}<br />
else<br />
switch (var-&gt;bits_per_pixel) {<br />
case 1:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_STN1BPP;<br />
break;<br />
case 2:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_STN2GREY;<br />
break;<br />
case 4:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_STN4GREY;<br />
break;<br />
case 8:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_STN8BPP;<br />
break;<br />
case 12:<br />
fbi-&gt;regs.lcdcon1 |= S3C2410_LCDCON1_STN12BPP;<br />
break;<br />
<br />
default:<br />
/* invalid pixel depth */<br />
dev_err(fbi-&gt;dev, "invalid bpp %d ", var-&gt;bits_per_pixel);<br />
}     <br />
----<br />
qq:554726623<br />
email:freeubuntu@hotmail.com<br />
[Original] [Print] [Top]<br />
Subject: Re: 为显示256级灰度图，需把16bpp的framebuffer改为24位，请高手指点一二<br />
Author: freeubuntu    Posted: 2007-09-27 15:44    Length: 91 byte(s)<br />
[Original] [Print] [Top]<br />
现在已经确定是寄存器设置的问题了，在bootloader中对logo 进行同样的寄存器设置也出现了16幅图象</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.cppblog.com/erran/aggbug/179026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-06-16 09:36 <a href="http://www.cppblog.com/erran/archive/2012/06/16/179026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VirtualBox虚拟硬盘的增大</title><link>http://www.cppblog.com/erran/archive/2012/05/24/176043.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 24 May 2012 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/05/24/176043.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/176043.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/05/24/176043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/176043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/176043.html</trackback:ping><description><![CDATA[<p><br />
</p>
<p>VirtualBox虚拟硬盘的增大<br />
</p>
<p>原文：http://hi.baidu.com/jlgwxq/blog/item/35885b46ca1c2d8fb2b7dcea.html</p>
<p><br />
VirtualBox虚拟机功能确实比较强大，不过有个缺点就是它的虚拟硬盘大小的上限在新建的时候就确定下来了，不能再扩大或缩小。我就因此吃过亏，将虚拟硬盘大小设置成6G，结果不够用。怎么办？重新再分配一个新盘，然后重装一次系统？显然，这并不可取，因为需要耗费大量的时间。<br />
<br />
没办法网上找，果然找到了一个比较好的解决方案。基本步骤如下：<br />
<br />
1. 在VirtualBox的媒质管理器中新建一个硬盘，大小要足够大，我分配的是20G。<br />
<br />
2. 从网上下载GParted LiveCD（网址是：http://gparted.sourceforge.net/），我下载的是0.5.2.9，好象最新版的还存在一个严重的问题。<br />
<br />
3.将GParted LiveCD的ISO文件引入到VirtualBox中，并在虚拟机中加载，同时还将原虚拟硬盘和新虚拟硬盘同时加载。我是将原盘引入到SATA 0，新盘引入到SATA 1。必须要说明的是，光驱启动要设置成优先。<br />
<br />
4. 虚拟机从光盘启动了，一路碰到问题就直接按回车就进入了一个简陋的linux GUI环境中。<br />
<br />
5. 打开Terminal终端程序（点击屏幕上方的大图标），在命令行中输入： dd if=/dev/sda of=/dev/sdb 这就相当于是包括MBR的全盘拷贝，时间会比较长，需耐心等待。要特别注意的是/dev/sda对应的是原盘，/dev/sdb对应的是新盘，不要弄错了，否则鸡飞蛋打，哭都来不及。关于这两盘各对应的是什么，可以在GParted程序中看出来，一定要在命令执行前搞清楚，切记。<br />
<br />
6. 最好是重启一下虚拟机。<br />
<br />
7. 打开GParted程序，可以看到新盘中的分区大小和原盘一模一样，显然这是不对的，需要调整分区的大小。这个调整过程很简单，可以直观地进行GUI操作。我这里的情况是新盘有两个分区，一个主分区5G左右，一个交换分区500M左右。先将交换分区删掉，然后扩大主分区至几乎最大（留500M左右给交换分区），最后，重新分配交换分区。<br />
<br />
8. 最后，别忘了在GParted程序中，将新盘设置成可启动的。也就是"Manage Flags"中的一个"Boot"项要选上。<br />
<br />
执行完上述步骤之后，关虚拟机，然后重新配置虚拟机，将光盘和原硬盘都移除掉，只用新盘，再重新启动。结果，新盘上的系统确实可以正常工作，而且原盘上的内容都完整无缺地复制过来了。耗时近1小时，迁移成功！<br />
<br />
参考贴子： http://hi.baidu.com/jerry_916/blog/item/e0334553d6354e020cf3e38e.html</p>
<p>&#160;&#160;
</p>
<img src ="http://www.cppblog.com/erran/aggbug/176043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-05-24 17:24 <a href="http://www.cppblog.com/erran/archive/2012/05/24/176043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bash、dash（/bin/bash和/bin/sh） </title><link>http://www.cppblog.com/erran/archive/2012/05/24/176038.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 24 May 2012 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/05/24/176038.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/176038.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/05/24/176038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/176038.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/176038.html</trackback:ping><description><![CDATA[<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">bash<font face="宋体">、</font><font face="Times New Roman">dash</font><font face="宋体">（</font><font face="Times New Roman">/bin/bash</font><font face="宋体">和</font><font face="Times New Roman">/bin/sh</font><font face="宋体">）&nbsp;</font></span></p>
<p><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体">&nbsp;&nbsp;原文：http://www.cnblogs.com/dkblog/archive/2011/04/02/2003822.html<br />
</font></span></p>
<p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">Linux<font face="宋体">中的</font><font face="Times New Roman">shell</font><font face="宋体">有多种类型，其中最常用的几种是</font><font face="Times New Roman">Bourne&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">（</font><font face="Times New Roman">sh</font><font face="宋体">）、</font><font face="Times New Roman">C&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">（</font><font face="Times New Roman">csh</font><font face="宋体">）和</font><font face="Times New Roman">Korn&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">（</font><font face="Times New Roman">ksh</font><font face="宋体">）。三种</font><font face="Times New Roman">shell</font><font face="宋体">各有优缺点。</font></span></p>
<p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="Times New Roman">Bourne &nbsp; shell</font><font face="宋体">是</font><font face="Times New Roman">UNIX</font><font face="宋体">最初使用的</font><font face="Times New Roman">shell</font><font face="宋体">，并且在每种</font><font face="Times New Roman">UNIX</font><font face="宋体">上都可以使用。</font><font face="Times New Roman">Bourne&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">在</font><font face="Times New Roman">shell</font><font face="宋体">编程方面相当优秀，但在处理与用户的交互方面做得不如其他几种</font><font face="Times New Roman">shell</font><font face="宋体">。</font></span></p>
<p class="p0" style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="Times New Roman">Linux</font><font face="宋体">操作系统缺省的</font><font face="Times New Roman">shell</font><font face="宋体">是</font><font face="Times New Roman">Bourne&nbsp;&nbsp;&nbsp;Again&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">，它是</font><font face="Times New Roman">Bourne&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">的扩展，简称</font><font face="Times New Roman">Bash</font><font face="宋体">，与</font><font face="Times New Roman">Bourne&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">完全向后兼容，并且在</font><font face="Times New Roman">Bourne&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">的基础上增加、增强了很多特性。</font><font face="Times New Roman">Bash</font><font face="宋体">放在</font><font face="Times New Roman">/bin/bash</font><font face="宋体">中，它有许多特色，可以提供如命令补全、命令编辑和命令历史表等功能，它还包含了很多</font><font face="Times New Roman">C&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">和</font><font face="Times New Roman">Korn&nbsp;&nbsp;&nbsp;shell</font><font face="宋体">中的优点，有灵活和强大的编程接口，同时又有很友好的用户界面。</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">GNU/Linux&nbsp;<font face="宋体">操作系统中的&nbsp;</font><font face="Times New Roman">/bin/sh&nbsp;</font><font face="宋体">是&nbsp;</font><font face="Times New Roman">bash</font><font face="宋体">（</font><font face="Times New Roman">Bourne-Again&nbsp;Shell</font><font face="宋体">）的符号链接，</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体">&nbsp; &nbsp; 但鉴于 </font><font face="Times New Roman">bash&nbsp;</font><font face="宋体">过于复杂，有人把&nbsp;</font><font face="Times New Roman">ash&nbsp;</font><font face="宋体">从&nbsp;</font><font face="Times New Roman">NetBSD&nbsp;</font><font face="宋体">移植到&nbsp;</font><font face="Times New Roman">Linux&nbsp;</font><font face="宋体">并更名为&nbsp;</font><font face="Times New Roman">dash</font><font face="宋体">（</font><font face="Times New Roman">Debian&nbsp;Almquist&nbsp;Shell</font><font face="宋体">），并建议将&nbsp;</font><font face="Times New Roman">/bin/sh&nbsp;</font><font face="宋体">指向它，以获得更快的脚本执行速度。</font><font face="Times New Roman">Ubuntu&nbsp;</font><font face="宋体">号称自从他们在&nbsp;</font><font face="Times New Roman">6.10&nbsp;</font><font face="宋体">版里这样做了以后，系统启动速度有了明显的提升。</font><font face="Times New Roman">Debian&nbsp;</font><font face="宋体">计划在下一个发行版（代号&nbsp;</font><font face="Times New Roman">lenny</font><font face="宋体">）中也将&nbsp;</font><font face="Times New Roman">dash&nbsp;</font><font face="宋体">作为默认的&nbsp;</font><font face="Times New Roman">/bin/sh</font><font face="宋体">。</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体"><br />
</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10.5pt; font-family: &quot;宋体&quot;"><font face="宋体">/bin/sh与/bin/bash的细微区别<br />
</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体">原文：不详<br />
</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体">在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。<br />
目前研发送测的shell脚本中主要有以下两种方式：<br />
(1) #!/bin/sh<br />
(2) #!/bin/bash<br />
在这里求教同福客栈的各位大侠们一个问题：<br />
以上两种方式有什么区别？对于脚本的实际运行会产生什么不同的影响吗？<br />
<br />
脚本test.sh内容：<br />
#!/bin/sh<br />
source pcy.sh #pcy.sh并不存在<br />
echo hello<br />
执行./test.sh，屏幕输出为：<br />
./test.sh: line 2: pcy.sh: No such file or directory<br />
由此可见，在#!/bin/sh的情况下，source不成功，不会运行source后面的代码。<br />
修改test.sh脚本的第一行，变为#!/bin/bash，再次执行./test.sh，屏幕输出为：<br />
./test.sh: line 2: pcy.sh: No such file or directory<br />
hello<br />
由此可见，在#!/bin/bash的情况下，虽然source不成功，但是还是运行了source后面的echo语句。<br />
但是紧接着我又试着运行了一下sh ./test.sh，这次屏幕输出为：<br />
./test.sh: line 2: pcy.sh: No such file or directory<br />
表示虽然脚本中指定了#!/bin/bash，但是如果使用sh 方式运行，如果source不成功，也不会运行source后面的代码。<br />
<br />
为什么会有这样的区别呢？<br />
<br />
junru同学作了解释<br />
<br />
1. sh一般设成bash的软链<br />
[work@zjm-testing-app46 cy]$ ll /bin/sh<br />
lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -&gt; bash<br />
2. 在一般的linux系统当中（如redhat），使用sh调用执行脚本相当于打开了bash的POSIX标准模式<br />
3. 也就是说 /bin/sh 相当于 /bin/bash --posix<br />
<br />
所以，sh跟bash的区别，实际上就是bash有没有开启posix模式的区别<br />
<br />
so，可以预想的是，如果第一行写成 #!/bin/bash --posix，那么脚本执行效果跟#!/bin/sh是一样的（遵循posix的特定规范，有可能就包括这样的规范：&#8220;当某行代码出错时，不继续往下解释&#8221;）<br />
<br />
<br />
例如：<br />
[root@localhost yuhj]# head -n1 x.sh <br />
#!/bin/sh<br />
[root@localhost yuhj]# ./x.sh <br />
<br />
./x.sh: line 8: syntax error near unexpected token `&lt;'<br />
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done &lt; &lt;(route -n)'<br />
[root@localhost yuhj]# <br />
<br />
<br />
<br />
[root@localhost yuhj]# head -n1 x.sh <br />
#!/bin/bash<br />
[root@localhost yuhj]#./x.sh <br />
<br />
Kernel IP routing table<br />
Destination Gateway Genmask Flags Metric Ref Use Iface<br />
192.168.202.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0<br />
0.0.0.0 192.168.202.2 0.0.0.0 UG 0 0 0 eth0<br />
Number of lines read = 4<br />
[root@localhost yuhj]# <br />
<br />
<br />
[root@localhost yuhj]# head -n1 x.sh <br />
#!/bin/bash --posix<br />
[root@localhost yuhj]# <br />
[root@localhost yuhj]# ./x.sh <br />
<br />
./x.sh: line 8: syntax error near unexpected token `&lt;'<br />
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done &lt; &lt;(route -n)'<br />
<br />
<br />
<br />
[root@localhost yuhj]# whereis sh bash<br />
sh: /bin/sh /usr/share/man/man1/sh.1.gz /usr/share/man/man1p/sh.1p.gz<br />
bash: /bin/bash /usr/share/man/man1/bash.1.gz<br />
<br />
[root@localhost yuhj]# ll /bin/sh /bin/bash<br />
-rwxr-xr-x 1 root root 735004 May 25 2008 /bin/bash<br />
lrwxrwxrwx 1 root root 4 Jan 29 00:39 /bin/sh -&gt; bash<br />
[root@localhost yuhj]# <br />
</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体"><br />
</font></span></p>
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; "><font face="宋体"><br />
</font></span></p>
&#160;
<img src ="http://www.cppblog.com/erran/aggbug/176038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-05-24 16:45 <a href="http://www.cppblog.com/erran/archive/2012/05/24/176038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows nfs server 两种方式</title><link>http://www.cppblog.com/erran/archive/2012/05/24/175993.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 24 May 2012 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/05/24/175993.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/175993.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/05/24/175993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/175993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/175993.html</trackback:ping><description><![CDATA[<p>windows nfs&nbsp;server&nbsp;两种方式</p>
<p><br />
</p>
<p>以下两种方式均采用免费软件，很多nfs&nbsp;server软件都是收费。</p>
<p><br />
</p>
<p>方法一：</p>
<p>Cygwin环境下NFS服务器的安装&nbsp;</p>
<p>原文：http://blog.csdn.net/meidaoli168/article/details/4444151<br />
&nbsp;<br />
运行Cygwin后，拷贝要安装的NFS服务器安装包（在cygwin-install中）到cygwin/tmp目录下<br />
<br />
（1）解压安装包<br />
&nbsp; cd /      一定要回到根目录下解压安装NFS服务器<br />
tar xvjf nfs-server-2.3-5.tar.bz2 <br />
<br />
（2）配置NFS Server<br />
&nbsp; /usr/bin/nfs-server-config<br />
执行后会显示安装信息，点回车安装。注：若为XP系统时，需要创建用户名和密码，用户名和密码要与XP的管理员用户名和密码相同 <br />
<br />
（3）设置主机访问控制<br />
编辑文件/etc/hosts.allow</p>
<p><br />
设置任何用户都可以访问nfs服务时，在文件中增加行：<br />
nfsd： ALL</p>
<p><br />
也可以特别指定某个IP地址的用户访问nfs服务时，只需增加行如：<br />
nfsd： 192.192.192.100   注：只增加这行即可&nbsp;</p>
<p><br />
如果特别指定某个子网地址的用户访问nfs服务时，只需增加行如：<br />
nfsd： 192.192.0.0/255.255.0.0  注：只增加这行即可<br />
<br />
编辑文件/etc/hosts.deny<br />
如果Cygwin中没有其它网络服务，则注释本文件中的所有行。<br />
<br />
（4）设置主机共享目录<br />
编辑文件/etc/exports<br />
可分行输入需要共享的路径及目录，共享一个/home/Administrator/nfs_share目录增加类似一下的行：<br />
/home/Administrator/nfs_share 192.192.192.0/255.255.255.0(rw,no_root_squash)<br />
表示在192.192.192子网上共享/home/Administrator/nfs_share目录，该目录可读写（rw)。<br />
<br />
（5）启动NFS服务<br />
可以在Cygwin下执行以下命令启动服务:<br />
cygrunsrv -S portmap<br />
cygrunsrv -S nfsd<br />
cygrunsrv -S mountd<br />
<br />
也可以通过打开Windows控制面板--管理工具--服务，选择portmap、mountd和nfs服务并启动，这等效以上三条启动命令。<br />
启动之后可以使用以下命令检查服务是否成功运行：<br />
/usr/sbin/showmount<br />
如果输出报告时某服务启动失败，请直接回到根目录/重新安装NFS server软件包。</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p>&nbsp;方法二：&nbsp;</p>
<p>微软提供的NFS Server软件<br />
</p>
<p>&nbsp;原文：不详&nbsp;</p>
最近需要在Windows系统导出NFS，供一块开发板开发Linux应用程序。在cygwin中有nfs-server软件包（参考：Windows上的NFS Server 软件），但在我公司的电脑上，软件包安装的portmap服务无法启动，因而无法使用。因工作环境限制，必须找到windows版本的NFS Server软件，否则后续的工作就要停止。<br />
网上google了两天，发现微软提供的Services for UNIX（SFU）软件包里包含NFS Server，可以满足我的要求。目前SFU的版本是3.5，于2004年1月发布，可免费使用。SFU软件包还包含其他的UNIX功能组件、Unix shell环境和SDK，但版本太老，不推荐使用。<br />
<br />
1、安装<br />
SFU软件包的下载地址是: "http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=896c9688-601b-44f1-81a4-02878ff11778"<br />
下载的软件包程序是自解压程序，运行后解压到某个目录内，然后运行其中的setup.exe程序安装软件包。安装时选择custom模式，只选择安装NFS Server，和相应的认证模块（安装程序会提示安装此认证模块），其他步骤按缺省设置安装即可。安装完毕后需要重启机器。<br />
<br />
2、配置<br />
（1）准备UNIX的用户、组的描述文件passwd和group<br />
passwd:<br />
root:x:0:0:root:/root:/bin/sh<br />
<br />
group：<br />
root:x:0<br />
<br />
上面的是最简单的内容，可以根据实际情况添加其他用户、组。<br />
<br />
（2）将UNIX的用户映射到Windows用户<br />
在 &#8220;开始&#8221;菜单启动windows for UNIX--&gt;Services for Unix Administration，然后在程序界面上点击左面的User Name Mapping项，进行配置：在configuration标签下，选择Use password and Group files，填入上步骤准备的passwd和group文件的文件路径；在Maps标签下，将UNIX用户映射到合适的Windows用户。配置完成后，点程序界面右上角的Apply按钮，使配置生效。<br />
<br />
3、将Windows的目录按NFS导出<br />
在Windows系统中选择要导出的目录，点鼠标右键，在弹出菜单中选择&#8220;属性&#8221;菜单项。然后在属性配置对话框内，点NFS Sharing 标签，选它下面的share this folder。点&#8220;确定&#8221;按钮后，该目录就能按NFS导出了，目录的图标也有了变化。<br />
<br />
4、客户端安装NFS共享目录<br />
客户端用mount命令来安装NFS共享目录。我的客户端是一块Linux的开发板，安装时还需要在mount命令中添加 -o nolock 选项，否则无法正确安装NFS共享目录。<br />
<br />
5、对客户端的读写权限控制<br />
可以通过Client Groups对客户端的读写权限进行控制。在Services for Unix Administration程序中，点击左面的Server for NFS项，选择Client Groups标签，添加客户端组和所包含的客户端的IP地址。配置完成后，点程序界面右上角的Apply按钮，使配置生效。<br />
在要导出的NFS目录设置对话框中，点NFS Sharing 标签右下角的Permissions按钮，把刚才设置的客户端组Add进来，并设置合适的读写权限。
<img src ="http://www.cppblog.com/erran/aggbug/175993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-05-24 10:19 <a href="http://www.cppblog.com/erran/archive/2012/05/24/175993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间通讯：消息（.net app 与 mfc dll）</title><link>http://www.cppblog.com/erran/archive/2012/05/19/175360.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 19 May 2012 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/05/19/175360.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/175360.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/05/19/175360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/175360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/175360.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; http://www.cppblog.com/erran/archive/2012/05/19/175360.html&nbsp;C#消息处理函数引用&nbsp;&nbsp; /// &lt;summary&gt;&nbsp;/// &lt;para&gt;    版    权 : Copyright (c) 20010-2011 &lt;/para&...&nbsp;&nbsp;<a href='http://www.cppblog.com/erran/archive/2012/05/19/175360.html'>阅读全文</a><img src ="http://www.cppblog.com/erran/aggbug/175360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-05-19 09:27 <a href="http://www.cppblog.com/erran/archive/2012/05/19/175360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ln: 创建符号链接 “asm”: 不支持的操作</title><link>http://www.cppblog.com/erran/archive/2012/05/04/173637.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 04 May 2012 02:06:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2012/05/04/173637.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/173637.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2012/05/04/173637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/173637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/173637.html</trackback:ping><description><![CDATA[ln: 创建符号链接 &#8220;asm&#8221;: 不支持的操作<br />
&nbsp;<br />
显示ln: 创建符号链接 &#8220;asm&#8221;: 不支持的操作<br />
<br />
原因是：在Windows分区使用此命令，Windows分区不支持linux上的链接！
<img src ="http://www.cppblog.com/erran/aggbug/173637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2012-05-04 10:06 <a href="http://www.cppblog.com/erran/archive/2012/05/04/173637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Invalidate和UpdateWindow的区别</title><link>http://www.cppblog.com/erran/archive/2011/07/01/149901.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 01 Jul 2011 05:55:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2011/07/01/149901.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/149901.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2011/07/01/149901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/149901.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/149901.html</trackback:ping><description><![CDATA[<div>Invalidate和UpdateWindow的区别<br />Invalidate在消息队列中加入一条WM_PAINT消息，其无效区为整个客户区。<br />UpdateWindow直接发送一个WM_PAINT消息，其无效区范围就是消息队列中WM_PAINT消息（最多只有一条）的无效区。<br />效果很明显，当调用Invalidate之后，屏幕不一定马上更新，因为WM_PAINT消息不一定在队列头部，而调用UpdateWindow会使WM_PAINT消息马上执行的，绕过了消息队列。<br />如果调用Invalidate之后想马上更新屏幕，那就加上UpdateWindow()这条语句。 </div>
<div>MSDN的解释 <br />UpdateWindow <br />The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT </div>
<div>message to the window if the window's update region is not empty. The function sends a WM_PAINT</div>
<div>message directly to the window procedure of the specified window, bypassing the application queue. </div>
<div>If the update region is empty, no message is sent. </div>
<div>InvalidateRect <br />The system sends a WM_PAINT message to a window whenever its update region is not empty and</div>
<div>there are no other messages in the application queue for that window. </div>
<div>翻译成中文大概的解释如下： <br />UpdateWindow：如果有无效区，则马上sending a WM_PAINT message到窗口处理过程，不进消息队列进行排队等待，立即刷新窗口，否则，什么都不做。 <br />InvalidateRect：设置无效区，如果为NULL参数，则设置整个窗口为无效区。当应用程序的那个窗口的消息队列为空时，则sending a WM_PAINT message(即使更新区域为空).在sending a WM_PAINT message的所有InvalidateRect的更新区域会累加。 <br /></div>
<div>1:设置无效区 <br />InvalidateRect </div>
<div>2：立即刷新 <br />UpdateWindow(); </div>
<div>如果不调用 InvalidateRect就调用 UpdateWindow，那么UpdateWindow什么都不做。 ??????<br />如果调用 InvalidateRect 后不调用UpdateWindow，则系统会自动在窗口消息队列为空的时候，系统自动发送一WM_PAINT消息。 <br /></div>
<div>调用UpdateWindow()时将会发送一个WM_PAINT消息，而应用程序在接收到WM_PAINT消息后，将自动地调用Invalidate(),所以，在程序代码中，不一定要出现Invalidate()!</div>
<div>UpdateWindow()就是立即发送WM_PAINT消息,只对声明无效的区域起作用， <br />Invalidate()则是声明无效的方式之一。</div>
<div>Invalidate()表示客户区域无效，在下次WM_PAINT发生时重绘。而WM_PAINT是由系统进行维护的，每当CWnd的更新区域不为空，并且在应用程序的窗口消息队列中没有其它消息时，Windows就发送一条WM_PAINT消息。 <br />Invalidate里面有个bool型的参数，用来标识重绘的时候是否用背景色填充。是不是用SetBkcolor函数？下去继续研究。</div>
<div>updateWindow则是要求系统对区域进行立即重绘。</div>
<div>看到有人在网上提出问题，他在Invalidate后面又写了绘图的函数但是没有执行，因为invalidate执行过以后转到PAINT命令了。所以后面的都没有显示。</div>
<div>也终于想通我绘的图一直在闪啊闪，因为我在PAINT里面用到Invalidate()函数，所以他不停的自嵌套，倒是绘的图不停的闪。</div>
<div></div>
<div>Invalidate让客户区处于可以重画的状态，而UpdateWindow开始重画，但是它先判断客户区是否为空，不空UpdateWindow不执行，为空才执行重画。</div>
<div></div>
<div>Invalidat最后也是调用InvalidatRect,在windows API里只有InvalidatRect的</div><img src ="http://www.cppblog.com/erran/aggbug/149901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2011-07-01 13:55 <a href="http://www.cppblog.com/erran/archive/2011/07/01/149901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最小的Linux系统制作过程详解</title><link>http://www.cppblog.com/erran/archive/2011/07/01/149900.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 01 Jul 2011 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2011/07/01/149900.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/149900.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2011/07/01/149900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/149900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/149900.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最小的Linux系统制作过程详解 收藏 创建时间：2009年11月23日(星期一) 晚上11:41 | 分类：未分类 | 字数：26056 | 发送到我的Qzone | 				document.write('另存为...');			另存为... | 打印 最小的Linux系统制作过程详解 收藏 一,什么是BabyLinux 二,为什么要做这样一个linux 三,什么人适合读这...&nbsp;&nbsp;<a href='http://www.cppblog.com/erran/archive/2011/07/01/149900.html'>阅读全文</a><img src ="http://www.cppblog.com/erran/aggbug/149900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2011-07-01 13:52 <a href="http://www.cppblog.com/erran/archive/2011/07/01/149900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  C#中结构体与字节流互相转换 </title><link>http://www.cppblog.com/erran/archive/2011/06/29/149751.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Wed, 29 Jun 2011 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2011/06/29/149751.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/149751.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2011/06/29/149751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/149751.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/149751.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><br />一、c#结构体<br />&nbsp;<br />1、定义与C++对应的C#结构体</p>
<p>&nbsp;<br />在c#中的结构体不能定义指针，不能定义字符数组，只能在里面定义字符数组的引用。 <br />C++的消息结构体如下： <br />//消息格式 4+16+4+4= 28个字节 <br />struct cs_message<br />{ <br />&nbsp;&nbsp;&nbsp; u32_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd_type; <br />&nbsp;&nbsp;&nbsp; char username[16]; <br />&nbsp;&nbsp;&nbsp; u32_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstID; <br />&nbsp;&nbsp;&nbsp; u32_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcID; <br />};<br />&nbsp;<br />C#定义的结构体如下:<br />&nbsp;<br />[StructLayout(LayoutKind.Sequential, Pack = 1)]<br />public struct my_message <br />{ <br />&nbsp;&nbsp;&nbsp; public UInt32&nbsp; cmd_type;</p>
<p>&nbsp;&nbsp;&nbsp; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]<br />&nbsp;&nbsp;&nbsp; public string username;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; public UInt32&nbsp; dstID;</p>
<p>&nbsp;&nbsp;&nbsp; public UInt32&nbsp; srcID;</p>
<p>&nbsp;&nbsp;&nbsp; public my_message(string s)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd_type = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username = s;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstID = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcID = 0;<br />&nbsp;&nbsp;&nbsp; } <br />}<br />&nbsp;<br />在C++的头文件定义中，使用了 #pragma pack 1 字节按1对齐，所以C#的结构体也必须要加上对应的特<br />性，LayoutKind.Sequential属性让结构体在导出到非托管内存时按出现的顺序依次布局,而对于C++的<br />char数组类型，C#中可以直接使用string来对应，当然了，也要加上封送的特性和长度限制。 </p>
<p>2、结构体与byte[]的互相转换<br />&nbsp;<br />定义一个类，里面有2个方法去实现互转：<br />&nbsp;<br />public class Converter <br />{ <br />&nbsp;&nbsp;&nbsp; public Byte[] StructToBytes(Object structure) <br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int32 size = Marshal.SizeOf(structure); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(size); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntPtr buffer = Marshal.AllocHGlobal(size); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Marshal.StructureToPtr(structure, buffer, false); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Byte[] bytes = new Byte[size]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Marshal.Copy(buffer, bytes, 0, size); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bytes; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Marshal.FreeHGlobal(buffer); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public Object BytesToStruct(Byte[] bytes, Type strcutType) <br />&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int32 size = Marshal.SizeOf(strcutType); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntPtr buffer = Marshal.AllocHGlobal(size); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Marshal.Copy(bytes, 0, buffer, size); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Marshal.PtrToStructure(buffer, strcutType); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Marshal.FreeHGlobal(buffer); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; } <br />}<br />&nbsp;<br />3、测试结果：<br />&nbsp;<br />static void Main(string[] args) <br />{ <br />&nbsp;&nbsp;&nbsp; //定义转换类的一个对象并初始化 <br />&nbsp;&nbsp;&nbsp; Converter Convert = new Converter();</p>
<p>&nbsp;&nbsp;&nbsp; //定义消息结构体 <br />&nbsp;&nbsp;&nbsp; my_message m; </p>
<p>&nbsp;&nbsp;&nbsp; //初始化消息结构体 <br />&nbsp;&nbsp;&nbsp; m = new my_message("yanlina"); <br />&nbsp;&nbsp;&nbsp; m.cmd_type = 1633837924; <br />&nbsp;&nbsp;&nbsp; m.srcID = 1633837924; <br />&nbsp;&nbsp;&nbsp; m.dstID = 1633837924;</p>
<p>&nbsp;&nbsp;&nbsp; //使用转换类的对象的StructToBytes方法把m结构体转换成Byte <br />&nbsp;&nbsp;&nbsp; Byte[] message = Convert.StructToBytes(m); <br />&nbsp;&nbsp;&nbsp; //使用转换类的对象的BytesToStruct方法把Byte转换成m结构体 <br />&nbsp;&nbsp;&nbsp; my_message n = (my_message)Convert.BytesToStruct(message, m.GetType()); <br />&nbsp;&nbsp;&nbsp; //输出测试 <br />&nbsp;&nbsp;&nbsp; Console.WriteLine(Encoding.ASCII.GetString(message)); <br />&nbsp;&nbsp;&nbsp; Console.WriteLine(n.username); <br />}<br />&nbsp;<br />结构体的size是28个字节和c++的结构体一样，同时可以将结构体和字节数组互转，方便UDP的发送和接收。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<br /><a href="http://blog.csdn.net/huxiangyang4/archive/2010/08/31/5853247.aspx">http://blog.csdn.net/huxiangyang4/archive/2010/08/31/5853247.aspx</a></p><img src ="http://www.cppblog.com/erran/aggbug/149751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2011-06-29 16:50 <a href="http://www.cppblog.com/erran/archive/2011/06/29/149751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#值类型 引用类型</title><link>http://www.cppblog.com/erran/archive/2010/10/09/129220.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 09 Oct 2010 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/10/09/129220.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/129220.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/10/09/129220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/129220.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/129220.html</trackback:ping><description><![CDATA[<p>&nbsp;传值 值类型存放在栈中，直接访问。如果有：int a=0;int b=a;就产生了两个栈中对象。<br />引用类型需要在堆中显式分配，且不能直接访问，需要在栈中分配一个栈中对象(C++叫指针，C#叫引用)指向其堆中对象。<br />如果：<br />StringBuilder strb = new StringBuilder();<br />StringBuilder strb2 = strb;<br />则在堆中只有一个堆中对象，只是栈中有两个栈中对象指向堆中对象。<br />可以看出：每个变量都是一个栈中对象。不管是值类型还是引用类型，只是值类型的栈中对象就是其内容，而引用类型的栈中对象只是一个指向堆中对象的地址。 <br />参数传递分值传递和引用传递两种。<br />通常，在没有显式指出ref和out时都是值传递。</p>
<p>值传递：传的是对象的值拷贝。(即函数内参数对象是调用时传递的对象的栈中对象的拷贝。)<br />引用传递：传的是栈中对象的地址。(即函数内参数对象与调用时传递的对象完全是同一栈中对象。)<br />现在用例子来说明传值跟传地址的不同：</p>
<p><br />private void button2_Click(object sender, System.EventArgs e)<br />...{<br />&nbsp; StringBuilder strb1 = new StringBuilder();<br />&nbsp; StringBuilder strb2 = new StringBuilder();<br />&nbsp; Test1(strb1);<br />&nbsp; Test2(ref strb2);<br />&nbsp; string str1 = strb1.ToString(); //str1值:"A"<br />&nbsp; string str2 = strb2.ToString(); //str2值:"BC"<br />}</p>
<p>void Test1(StringBuilder strb)<br />...{<br />&nbsp; //strb和strb1是两个栈中对象，但指向相同的地址，这个操作是改变堆中对象<br />&nbsp; strb.Append("A");</p>
<p>&nbsp; //这里将strb指向一个新的堆中对象，所以后面的操作与strb1指向的栈中对象无关<br />&nbsp; strb = new StringBuilder("B");<br />&nbsp; strb.Append("C");<br />}</p>
<p>void Test2(ref StringBuilder strb)<br />...{<br />&nbsp; //这里的strb和strb2是同一个栈中对象，所以改变strb的值使其指向另一个对象也等于改变strb2<br />&nbsp; strb = new StringBuilder("B");<br />&nbsp; strb.Append("C");<br />} <br /></p><img src ="http://www.cppblog.com/erran/aggbug/129220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-10-09 17:10 <a href="http://www.cppblog.com/erran/archive/2010/10/09/129220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDI,CxImage,GDI+之比较</title><link>http://www.cppblog.com/erran/archive/2010/10/09/129219.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 09 Oct 2010 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/10/09/129219.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/129219.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/10/09/129219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/129219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/129219.html</trackback:ping><description><![CDATA[<p>&nbsp;<br />GDI:</p>
<p><br />常用的绘图方式，但是压缩算法太差，大图压缩失真严重，并且支持图片类型太少,支持bmp.<br />一些绘图方法参考另一文章:图片镂空算法集合</p>
<p><br />CxImage:</p>
<p>是一个开源库，功能强大，其官方主页<a href="http://www.xdp.it/cximage/">http://www.xdp.it/cximage/</a><br />常用的5种:bmp,gif,png,jpg,ico<br />其他类型:tif,tga,pcx,wbmp,wmf,jp2,jpc,pgx,pnm,ras,jbg,mng,ska,raw <br />CxImage压缩算法较好，绘图速度快,4400*3000左右像素图片，容量3M左右，压缩到50*50，在快速拉动图片，并移动时，一点也不卡。</p>
<p>&nbsp;VS7.1环境配置<br />&nbsp;lib路径:在工程配置-&amp;gt;连接器-&amp;gt;常规-&amp;gt;附加目录库<br />&nbsp;加载lib:在工程配置-&amp;gt;连接器-&amp;gt;输入-&amp;gt;附加依赖项 <br />&nbsp;cximage.lib<br />&nbsp;jasper.lib<br />&nbsp;jbig.lib<br />&nbsp;Jpeg.lib<br />&nbsp;png.lib<br />&nbsp;Tiff.lib<br />&nbsp;zlib.lib<br />&nbsp;mng.lib<br />&nbsp;libdcr.lib</p>
<p>&nbsp;头文件路径:在工程配置c/c++-&amp;gt;常规-&amp;gt;附加包含目录<br />&nbsp;使用：只需要包含"xImage.h"</p>
<p>&nbsp;CxImage image;<br />&nbsp;image.Load()，CreateFromHBITMAP()等函数导入图片<br />&nbsp;image.Stretch(HDC,x,y,width,height);</p>
<p>GDI+:</p>
<p><br />同样功能强大，支持：bmp,jpg,gif,tiff,png.图片转换之前的算法应该是最好的，用大图去压缩，图片效果明显要比前两者好。<br />但是画大图时，速度太慢.比如以上4400*3000的图片，压缩到50*50,画图时间竟然是0.15秒，如果放在快速更新，或者移动的处理时，明显会延迟.</p>
<p><br />&nbsp;使用前，需要在APP文件中初使化GDI+<br />&nbsp;DWORD m_gdiplusToken;<br />&nbsp;CGameApp::InitInstance()<br />&nbsp;{<br />&nbsp;&nbsp; Gdiplus::GdiplusStartupInput gdiplusStartupInput;<br />&nbsp; Gdiplus::GdiplusStartup(&amp;amp;m_gdiplusToken, &amp;amp;gdiplusStartupInput, NULL);<br />&nbsp;} <br />&nbsp;int&nbsp; CGameApp::ExistInstance()<br />&nbsp;{<br />&nbsp; Gdiplus::GdiplusShutdown(m_gdiplusToken);<br />&nbsp; return 0;<br />&nbsp;}</p>
<p>&nbsp;Bitmap * pBmp = Bitmap::FromHBITMAP() 或者 Bitmap::FromFile() 等函数导入图片<br />&nbsp;Graphics gr(HDC);<br />&nbsp;gr.DrawImage(pBmp,x,y,Width,Height);</p>
<p>总结：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、一般绘图用GDI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、需要不同类型的图片格式，并且要快速绘图的用CxImage<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、需要不同类型的图片格式，且要高质量图片效果的用GDI+</p>
<p>本文来自：<a href="http://blog.csdn.net/xuweiqun/archive/2009/07/20/4363627.aspx">http://blog.csdn.net/xuweiqun/archive/2009/07/20/4363627.aspx</a></p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/erran/aggbug/129219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-10-09 17:08 <a href="http://www.cppblog.com/erran/archive/2010/10/09/129219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】 c#值类型和引用类型的比较</title><link>http://www.cppblog.com/erran/archive/2010/10/09/129217.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 09 Oct 2010 09:07:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/10/09/129217.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/129217.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/10/09/129217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/129217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/129217.html</trackback:ping><description><![CDATA[<p>转载自 alva7864最终编辑 alva7864在C#中有两种类型的数据，一种是值类型数据，一种是引用类型数据。在编码的时候区分这两种类型数据，可以 避免一些细小的编码错误。 </p>
<p>首先说说什么类型是值类型，例如：int、float、bool之类的基础类型，以及用struct定义 的类型，如：DateTime。除此外，如 string，数组，以及用class定义的类型等都是引用类型。对于C#来说，很难罗列出所有类型进行一一分别，这需要自己在编码过程中进行分析总结。 <br />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了更好地说明两种类型之间的区别，借用如下的表格来说明:</p>
<p>&nbsp; 值类型 引用类型 <br />内存分配地点 分配在栈中 分配在堆中 <br />效率 效率高，不需要地址转换 效率低，需要进行地址转换 <br />内存回收 使用完后，立即回收 使用完后，不是立即回收，等待GC回收 <br />赋值操作 进行复制，创建一个同值新对象 只是对原有对象的引用 <br />函数参数与返回值 是对象的复制 是原有对象的引用，并不产生新的对象 <br />类型扩展 不易扩展 容易扩展，方便与类型扩展 </p>
<p><br />通过如上细致对比，大家对于值类型和引用类型有个清楚的概念。</p>
<p>不过，无论是对于值类型还是引用类型来说，对于其作为函数参数或者返回值的时候，都是容易犯错误的地方。</p>
<p>对于值类型来说，当其 作为函数参数的时候，希望在函数中被修改，那么直接如下操作是不能被修改的:</p>
<p>public void Increment( int i )&nbsp;&nbsp;&nbsp; <br />{&nbsp;&nbsp;&nbsp; <br />　 i++;&nbsp;&nbsp;&nbsp; <br />}&nbsp;&nbsp; </p>
<p>要想在函数中对传进去的参数做真正的修改，需要借助于ref这个关键字，那么正确的形式如下: </p>
<p>public void Increment( ref int i )&nbsp;&nbsp;&nbsp; <br />{&nbsp;&nbsp;&nbsp; <br />　i++;&nbsp;&nbsp;&nbsp; <br />}&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也就是说，如果需要在函数中对值类型参数进行修改，需要用ref或者out进行标识才能真正实现。</p>
<p>而对于引用 类型来说，当其作为函数参数的时候，它所遇到的情况恰恰与值类型相反，即不希望在函数中被修改，举例如下:</p>
<p>public void AddValue( MyType typValue )&nbsp;&nbsp;&nbsp; <br />{&nbsp;&nbsp;&nbsp; <br />　typValue.Count = typValue.Count + 15;&nbsp;&nbsp;&nbsp; <br />}&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于对于引用类型对象来说，其的赋值操作只是对原有对象的引用，因此在函数对其修改，实际上是直接修改了原有对象数据，这是很多 情况不希望发生的（这里例如对数组或者DataTable操作这类）。</p>
<p>为了防止这种事发生，需要给此类型提供clone函数。例如对 于如上的类型，可以入下实现 :</p>
<p>public class MyType:ICloneable&nbsp;&nbsp;&nbsp; <br />{&nbsp;&nbsp;&nbsp; <br />　private int nCount = 0;&nbsp;&nbsp;&nbsp; <br />　public int Count&nbsp;&nbsp;&nbsp; <br />　{&nbsp;&nbsp;&nbsp; <br />　　set{ nCount = value;}&nbsp;&nbsp;&nbsp; <br />　　get{ return nCount;}&nbsp;&nbsp;&nbsp; <br />　}&nbsp;&nbsp;&nbsp; <br />　public MyType()&nbsp;&nbsp;&nbsp; <br />　{}&nbsp;&nbsp;&nbsp; <br />　public MyType( int Value)&nbsp;&nbsp;&nbsp; <br />　{&nbsp;&nbsp;&nbsp; <br />　　nCount = Value;&nbsp;&nbsp;&nbsp; <br />　}&nbsp;&nbsp;&nbsp; <br />　#region ICloneable Members&nbsp;&nbsp;&nbsp; <br />　public object Clone()&nbsp;&nbsp;&nbsp; <br />　{&nbsp;&nbsp;&nbsp; <br />　　// TODO: Add MyType.Clone implementation&nbsp;&nbsp;&nbsp; <br />　　return new MyType( nCount );&nbsp;&nbsp;&nbsp; <br />　}&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />　#endregion&nbsp;&nbsp;&nbsp; <br />}&nbsp;&nbsp; </p>
<p>　&nbsp;&nbsp;&nbsp;&nbsp; 那么在调用的时候，用当前的对象的clone作为参数即可。</p>
<p>不过对于引用类型来说，提供一个clone函数不是一 件容易的事情，尤其出现引用类型嵌套的时候，所以说去实现一个完全clone功能是件很费事又不讨好的活，这也就是在论坛中常说的深copy和浅copy 的问题。话虽如此，如果对于前面所说的有个大概了解，相信实现也不是不可能。</p>
<p>在C#中，尤其自己定义类型的时候，常常由于是用 struct来定义还是用class来定义，即是定义一个值类型还是一个引用类型呢。在这本书上给了几个判定条件，如果如下几点都满足的话，建议用 struct来定义为值类型，否则用class定义为引用类型。</p>
<p>&nbsp;</p>
<p>&lt;!--[if !supportLists]--&gt;1． &lt;!--[endif]--&gt;这个类型是否主要为了数据存储；<br />&lt;!--[if !supportLists]--&gt;2． &lt;!--[endif]--&gt;是否只通过属性来访问对象的数据成员；<br />&lt;!--[if !supportLists]--&gt;3． &lt;!--[endif]--&gt;这个类型是否不会有子类型；<br />&lt;!--[if !supportLists]--&gt;4． &lt;!--[endif]--&gt;在程序处理的时候不会把这个类型对象通过多态来处理。 <br /></p><img src ="http://www.cppblog.com/erran/aggbug/129217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-10-09 17:07 <a href="http://www.cppblog.com/erran/archive/2010/10/09/129217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#画笔Pen自定义线的帽子</title><link>http://www.cppblog.com/erran/archive/2010/10/09/129215.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 09 Oct 2010 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/10/09/129215.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/129215.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/10/09/129215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/129215.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/129215.html</trackback:ping><description><![CDATA[<p>c#画笔Pen自定义线的帽子&nbsp; <br />&nbsp;<br />1.using System;<br />2.using System.Collections.Generic;<br />3.using System.ComponentModel;<br />4.using System.Data;<br />5.using System.Drawing;<br />6.using System.Text;<br />7.using System.Windows.Forms;<br />8.using System.Drawing.Drawing2D;<br />9.10.namespace WindowsApplication2<br />11.{<br />12.&nbsp;&nbsp;&nbsp; public partial class Form11 : Form<br />13.&nbsp;&nbsp;&nbsp; {<br />14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Form11()<br />15.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />16.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br />17.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />18.19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void button1_Click(object sender, EventArgs e)<br />20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pen pen1 = new Pen(Color.Blue, 12);<br />22.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pen1.EndCap = LineCap.Custom;<br />23.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pen1.CustomEndCap = new AdjustableArrowCap(5f, 5f, true);<br />24.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics g1 = this.CreateGraphics();<br />25.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g1.DrawLine(pen1, 10, 100, 100,100);<br />26.27.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />28.&nbsp;&nbsp;&nbsp; }<br />29.}</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/erran/aggbug/129215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-10-09 17:05 <a href="http://www.cppblog.com/erran/archive/2010/10/09/129215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> GDI+的核心：Graphics类</title><link>http://www.cppblog.com/erran/archive/2010/10/09/129213.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 09 Oct 2010 09:02:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/10/09/129213.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/129213.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/10/09/129213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/129213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/129213.html</trackback:ping><description><![CDATA[<p>&nbsp;GDI+的核心：Graphics类</p>
<p><br />（1）The Graphics class provides methods for drawing lines, curves, figures, images, and text. A Graphics object stores attributes of the display device and attributes of the items to be drawn.【msdn】</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics是一个device context和你的drawing conetent之间的一个中介。它存储了device context的相关属性，以及drawing content的属性。这样，它就能用自己的方法把drawing content&#8220;映射&#8221;到device content 之上。</p>
<p>（2）GDI+的核心是Graphics类，包含了显示、绘图等功能。它提供了四个构造函数：<br />&nbsp;&nbsp; Graphics::Graphics(Image*)<br />&nbsp;&nbsp; Graphics::Graphics(HDC)<br />&nbsp;&nbsp; Graphics::Graphics(HDC,HANDLE)<br />&nbsp;&nbsp; Graphics::Graphics(HWND,BOOL)</p>
<p>&nbsp;&nbsp; 构造函数1从image对象创建一个Graphics类。这种方式允许你在打开某张，或者生成某张位图之后，应用Grapgics的方法对改位图进行操作。</p>
<p>&nbsp;&nbsp; 构造函数2从一个传统的HDC获取一个Graphics对象，把传统的在HDC完成的操作接手过来。也就是当要画直线，曲线，图形等时，采用这种构造函数。</p>
<p>&nbsp;&nbsp; 后面两种构造函数这里不说了！</p>
<p>（3）如果读者有GDI编程经验的话，应该会联想起CDC::CreateCompatibleDC和CBitmap::<br />CreateCompatibleBitmap吧？再列举Graphics中有代表性的用于绘图的成员函数：<br />&nbsp;&nbsp; Graphics::DrawArc(Pen*,INT,INT,INT,INT,REAL,REAL)<br />&nbsp;&nbsp; Graphics::DrawBeziers(Pen*,Point*,INT)<br />&nbsp;&nbsp; Graphics::DrawClosedCurve(Pen*,Point*,INT)<br />&nbsp;&nbsp; Graphics::DrawCurve(Pen*,Point*,INT)<br />&nbsp;&nbsp; Graphics::DrawEllipse(Pen*,Rect&amp;amp;)<br />&nbsp;&nbsp; Graphics::DrawImage(Image*,RectF&amp;amp;)<br />&nbsp;&nbsp; Graphics::DrawLine(Pen*,Point&amp;amp;,Point&amp;amp;)<br />&nbsp;&nbsp; Graphics::DrawPie(Pen*,Rect&amp;amp;,REAL,REAL)<br />&nbsp;&nbsp; Graphics::DrawPolygon(Pen*,Point*,INT*)<br />&nbsp;&nbsp; Graphics::DrawRectangle(Pen*,Rect&amp;amp;)<br />&nbsp;&nbsp; 是不是非常象CDC？从这里大家也能猜出一点Graphics类和CDC类的异同吧！简单的说，Graphics的层次更高一些，封装的更好。</p>
<p><br />2&nbsp; GDI+的几个特点：</p>
<p>&nbsp;&nbsp; （1）传统的GDI编程最痛苦的是什么？是不停的CreateObject，SeleteObject，DeleteObject&#8212;&#8212;代码繁琐，一不小心还会内存泄露&#8230;&#8230;现在GDI+结束了这一切，就凭这一个理由，也足够我们转向GDI+了，呵呵。从上面的几个成员函数可以看出来，每个绘图动作都指定了画笔、刷子或者Image，完全抛弃了SelectObject的概念。</p>
<p>&nbsp;&nbsp; （2）GDI+里面的颜色更加丰富，全面支持32位色，从Color类的构造函数就可以看出来：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Color::Color(BYTE a, BYTE r, BYTE g, BYTE b);其中a就是透明度。</p>
<p>&nbsp;&nbsp; （3）GDI+里的所有函数都只接受Unicode字符串，编写代码的时候需要注意这一点。</p>
<p><br />本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/keyouan2008/archive/2010/08/13/5809519.aspx">http://blog.csdn.net/keyouan2008/archive/2010/08/13/5809519.aspx</a></p><img src ="http://www.cppblog.com/erran/aggbug/129213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-10-09 17:02 <a href="http://www.cppblog.com/erran/archive/2010/10/09/129213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML与数据库</title><link>http://www.cppblog.com/erran/archive/2010/07/20/120868.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 20 Jul 2010 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/20/120868.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/120868.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/20/120868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/120868.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/120868.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: XML与数据库																																																																																										copyright 1999-2005 by Ronald Bourret原作最后更新: 2005年9月原文: http://www.rpbourret.com/xml/XM...&nbsp;&nbsp;<a href='http://www.cppblog.com/erran/archive/2010/07/20/120868.html'>阅读全文</a><img src ="http://www.cppblog.com/erran/aggbug/120868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-20 13:17 <a href="http://www.cppblog.com/erran/archive/2010/07/20/120868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-7】Matlab与线性代数(三) </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119993.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:18:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119993.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119993.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119993.html</trackback:ping><description><![CDATA[
		<div class="postTitle">原文：<a href="http://www.cnblogs.com/JCSU/articles/1504787.html">http://www.cnblogs.com/JCSU/articles/1504787.html</a></div>
		<div class="postText">
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
						</strong> </p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">一、用向量空间解方程组</strong>
				</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">1、向量和向量空间</strong>
				</p>
				<p> </p>
				<p>(1) 二维空间R<sup>2</sup>中的向量用两个沿列向的元素表示。</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
						</strong>
						<img height="86" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_2vectors.GIF" width="375" border="0" /> </p>
				<p> </p>
				<p>向量u,v在二维空间的表示：</p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
								<img height="272" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_2vectors_map.GIF" width="278" border="0" />
						</strong>
				</p>
				<p> </p>
				<p>(2)  二维向量张成的空间</p>
				<p>平面上的任何一点[w1;w2]是不是一定能用u和v的线性组合来实现？即是不是一定能找到一组常数[c1,c2]，使得</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
								<img height="83" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_2vectorsExp1vector.GIF" width="266" border="0" />
						</strong>
				</p>
				<p> </p>
				<p>• c1,c2取所有可能的值，得到的w的集合就是u和v张成的子空间，在所给的u和v下，它是一个平面。<br />• 若u和v两个向量的各元素成简单的比例关系，合成的向量只能在一根直线上，不可能张成整个二维平面。这种情况下，称这两个向量u和v是线性相关的。 </p>
				<div v:shape="_x0000_s1026">
						<div> </div>
						<div>(3)  三维空间中的向量</div>
						<div> </div>
						<div>若v1,v2和v3都是三维空间的列向量。可以用空间坐标中的三个点，或从坐标原点引向这三点的箭头来表示。用矩阵代数表示如下：</div>
						<div> </div>
				</div>
				<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
						<p>
								<img alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_3vectors.GIF" border="0" />
						</p>
				</strong>
				<p> </p>
				<div class="O" style="mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1" v:shape="_x0000_s1026">如果三个基本向量之间线性无关，那么它们的线性组合可以覆盖（张成）整个三维空间。如果三个向量共面，即相关，就不能张成三维空间。判断三个向量的线性相关性，可用行列式。</div>
				<div class="O" style="mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1" v:shape="_x0000_s1026"> </div>
				<div class="O" style="mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1" v:shape="_x0000_s1026">(4) 三维空间向量的相关性</div>
				<div class="O" style="mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1" v:shape="_x0000_s1026"> </div>
				<div class="O" style="mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1" v:shape="_x0000_s1026">det(A)=0  相关<br />det(A)≠0  不相关<br />行列式的几何意义:在二维是两个向量组成的平行四边形面积，在三维是三个向量组成的平行六面体的体积。</div>
				<p> </p>
				<p>(5) n维<strong>向量的相关性</strong></p>
				<p>在进入三维以上的空间时，已经没有可与面积、体积直接相当的概念可用了，所以采用了<strong>秩</strong>的概念。如果A的行列式为零，也就是它的秩r小于n时，说明这n个向量是线性相关的。</p>
				<p>秩的概念也概括了面积存在（r=2）和体积存在（r=3）的意义，因此，它是更高度的抽象。</p>
				<p> </p>
				<p>(6) 向量空间和基向量</p>
				<div v:shape="_x0000_s1026">
						<div>• 若r个向量是线性无关的，则它们的线性组合的全体V就构成了r维空间Rr。如果它不是空集，则V称为向量空间。生成V的r个线性无关的向量v称为基向量或基（Basis）。 <br />• 当r=n时，给定的n个向量就是一组基。如果r&lt;n，那就要在n个向量中选出r个线性无关的向量。用秩的概念还无法判定哪些向量是线性无关的，这时又要藉助于把矩阵简化为阶梯形式的方法。</div>
				</div>
				<p> </p>
				<p>
						<strong>例1：</strong>求四个五维向量的子空间</p>
				<p>这四个向量组成的矩阵如下，对它进行行阶梯简化：</p>
				<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
						<p>
								<img height="157" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_4vectorsWith5dimensions.GIF" width="251" border="0" />
						</p>
				</strong>
				<p>程序为：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A=[4,-5,-4,-1;0,-3,0,1;-2,1,2,0;-5,4,5,3;-1,4,1,-1]<br />[U0,ip]=rref(A)<br /><br />A =<br /><br />     4    -5    -4    -1<br />     0    -3     0     1<br />    -2     1     2     0<br />    -5     4     5     3<br />    -1     4     1    -1<br /><br /><br />U0 =<br /><br />     1     0    -1     0<br />     0     1     0     0<br />     0     0     0     1<br />     0     0     0     0<br />     0     0     0     0<br /><br /><br />ip =<br /><br />     1     2     4<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>得到 ip=1,2,4，其三个枢轴列对应的就是三个线性无关的列向量。</p>
				<p>
						<strong>
						</strong> </p>
				<p>
						<strong>例2：</strong>w是否在v1,v2,v3的空间内</p>
				<p>设</p>
				<p>
						<strong>
								<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">
										<img height="138" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_3vectorsExp1vector.GIF" width="431" border="0" />
								</strong>
						</strong>
				</p>
				<p> </p>
				<p>w是否能由v1,v2,v3的线性组合构成的问题，取决于线性方程组 v.c=w 解的存在性。</p>
				<p>程序为：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">v1=[7;-4;-2;9]; <br />v2=[-4;5;-1;-7]; <br />v3=[9;4;4;-7]; <br />w=[-9;7;1;-4]; <br />v=[v1,v2,v3];<br />c=v\w     </span>
						<span style="COLOR: #008000">% 把基向量组成矩阵v求解</span>
				</div>
				<p> </p>
				<p>也可以按det(v)是否为零进行判别。</p>
				<p> </p>
				<p>(7) 向量的内积和正交性</p>
				<p>两个m维向量的内积可以写成：</p>
				<p>
						<strong>
								<img height="63" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_2vectorsInnerProduct.GIF" width="460" border="0" />
						</strong>
				</p>
				<p>这是一个标量。向量x与自己求内积</p>
				<p>
						<img height="77" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_vectorItselfInnerProduct.GIF" width="451" border="0" />
				</p>
				<p>得到的是其各分量的平方和，其平方根就等于向量的长度（或模、或范数norm）。</p>
				<p> </p>
				<p>(8) 内积的几何意义</p>
				<p>在平面情况，两向量的内积除以它们的长度是它们夹角的余弦：</p>
				<p>
						<strong>
								<img height="81" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_vectorInnerProduct_angle_cos.GIF" width="181" border="0" />
						</strong>
				</p>
				<p> </p>
				<p>
						<strong>例3：</strong>基向量长度规一化和夹角</p>
				<p>求以上例2中的单位基向量v01,v02,v03，并分别求它们之间的夹角。</p>
				<p> </p>
				<p>程序为：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">v10=v1/norm(v1)<br />v20=v2/norm(v2) <br />v30=v3/norm(v1)<br />theta12=acos((v1'*v2)/(norm(v1)*norm(v2)))<br />theta13=acos((v1'*v3)/(norm(v1)*norm(v3)))<br />theta23=acos((v3'*v2)/(norm(v3)*norm(v2)))</span>
				</div>
				<p> </p>
				<p>(9) 正交基向量的生成</p>
				<p>两向量x，y正交的条件是它们的内积为零。<br />给出向量求正交基常用施密特算法，ATLAST手册中给出了相应的程序gschmidt。调用时键入[Q,R]=gschmidt(v)，Q就是单位正交基向量e。<br />MATLAB中不用施密特算法，而用更好的算法编成了正交分解子程序qr.m，它将v分解为Q和R两个矩阵的乘积。调用方法为：[Q,R]=qr(v) ，Q就是m<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>m单位正交矩阵。</p>
				<p> </p>
				<p>基向量正交化的schmidt公式：</p>
				<p>
						<img height="282" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Matlab_3_schmidtFormula.GIF" width="543" border="0" />
				</p>
				<p>得到q<sub>i</sub>(i1,2,…,k)后，再把它们除以norm(q<sub>i</sub>)，就可归一化为单位向量e<sup>k</sup>。 </p>
				<p> </p>
				<p>基向量正交化的gschmidt子程序：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">function [Q,R]=gschmidt(V)<br />[m,n]=size(V); R=zeros(n);<br />R(1,1)=norm(V(:,1));<br />Q(:,1)=V(:,1)/R(1,1);<br />for k=2:n<br />    R(1:k-1,k)=Q(:,1:k-1)'*V(:,k);<br />    Q(:,k)=V(:,k)-Q(:,1:k-1)*R(1:k-1,k);<br />    R(k,k)=norm(Q(:,k));<br />    Q(:,k)=Q(:,k)/R(k,k);<br />end</span>
				</div>
				<p> </p>
				<p>
						<strong>例4：</strong>对于例2的数据，求其规范化正交基向量e1,e2,…,en。</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; V=[7,-4,9;-4,5,4;-2,-1,4;9,-7,-7]<br />[Q,R]=qr(V) % 或 [Q,R]=gschmidt(V) <br />e=Q(:,[1:3])<br /><br />V =<br /><br />     7    -4     9<br />    -4     5     4<br />    -2    -1     4<br />     9    -7    -7<br /><br /><br />Q =<br /><br />   -0.5715   -0.3164   -0.7473   -0.1217<br />    0.3266   -0.6096   -0.1080    0.7142<br />    0.1633    0.7144   -0.5022    0.4591<br />   -0.7348    0.1339    0.4216    0.5141<br /><br /><br />R =<br /><br />  -12.2474    8.8998    1.9596<br />         0   -3.4341   -3.3662<br />         0         0  -12.1173<br />         0         0         0<br /><br /><br />e =<br /><br />   -0.5715   -0.3164   -0.7473<br />    0.3266   -0.6096   -0.1080<br />    0.1633    0.7144   -0.5022<br />   -0.7348    0.1339    0.4216<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>得到e=[e1 e2 e3]</p>
				<p> </p>
				<p>
						<strong>
						</strong>
				</p>
				<p> </p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">二、线性变换及特征</strong>
				</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">1、平面上线性变换的几何意义</strong>
				</p>
				<p> </p>
				<p>
						<strong>例1</strong>  设x为二维平面上第一象限中的一个单位方块，其四个顶点的数据可写成：</p>
				<p> </p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">x =<br />     0     1     1     0<br />     0     0     1     1</span>
				</div>
				<p> </p>
				<p>把不同的A矩阵作用于此组数据，可以得到多种多样的结果y<sub>i</sub>=A<sub>i</sub>*x。</p>
				<p>
						<img height="398" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_linearTransfor_6diagrams.GIF" width="494" border="0" />
				</p>
				<p>可以看出，矩阵A1使原图对纵轴生成镜像，矩阵A2使原图在横轴方向膨胀，矩阵A3使原图在纵轴方向压缩，矩阵A4使原图向右方剪切变形，矩阵A5使原图沿反时针方向旋转tpi/6。分别计算出这五个矩阵的行列式和特征值：<img height="413" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_linearTransfor_6diagrams_detANDeigenvalue.GIF" width="692" border="0" /> </p>
				<p>对二维空间（平面），行列式的几何意义实际上是两个向量所构成的平行四边形的面积。一个变换所造成的图形的面积变化，取决于该变换的行列式。A1，A4和A5的行列式绝对值都是1，所以它们不会使变换后图形的面积发生改变。而A2和A3的行列式分别为1.5和0.2。</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">2、二维矩阵特征值的几何意义</strong>
				</p>
				<p>(1) 二维矩阵的特征值表示该变换在原图形的特征向量的方向上的放大量。例如矩阵A1在第一特征向量</p>
				<p>
						<img height="80" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_linearTransfor_6diagrams_eigenVector1.GIF" width="147" border="0" />
				</p>
				<p>的方向的特征值为<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">λ</span><sub>1</sub>(1) = -1，即横轴正方向的增益为-1，其结果是把原图中横轴正方向的部分变换到新图的负方向去了；A1在第二特征向量</p>
				<p>
						<img height="82" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_linearTransfor_6diagrams_eigenVector2.GIF" width="151" border="0" />
				</p>
				<p>的方向的特征值为λ<sub>1</sub>(2)=1，即纵轴正方向的增益为1，因而保持了新图和原图在纵轴方向尺度不变。</p>
				<p> </p>
				<p>
						<strong>例2：</strong>斜体字的生成 </p>
				<p>数据矩阵</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">x =<br /><br />         0    0.5000    0.5000    6.0000    6.0000    5.5000    5.5000         0<br />         0         0    6.4200         0    8.0000    8.0000    1.5800    8.0000</span>
				</div>
				<p> </p>
				<p>表示英文大写空心字母N的各个节点</p>
				<p>（1）用plot语句在子图1中画出其形状；</p>
				<p>（2）取</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">A =<br />    1    0.25<br />    0    1</span>
				</div>
				<p> </p>
				<p>作为变换矩阵对x进行变换，并在子图2中画出其图形；<br />画图的要点是要在给定的数据右方，补上第一点的坐标，使画出的图形封闭。</p>
				<p> </p>
				<p>程序为：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">x0 = [0,0.5,0.5,6,6,5.5,5.5,0;0,0,6.42,0,8,8,1.58,8]<br />x = [x0,x0(:,1)] % 把首顶点坐标补到末顶点后<br />A = [1,0.25;0,1]<br />y = A*x<br />subplot(1,2,1), plot(x(1,:),x(2,:))<br />subplot(1,2,2), plot(y(1,:),y(2,:))</span>
				</div>
				<p> </p>
				<p>画出的两个图形为：</p>
				<p>
						<img height="244" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_linearTransfor_font_italic.GIF" width="440" border="0" />
				</p>
				<p>(2) 平移运动不能用二维变换实现</p>
				<p>刚体在平面上的运动要用两个平移和一个转动来描述，转动可以从上面的线性变换A5得到，但平移y=x+c却不是一个线性变换。因为：<br />（1）设ya = xa+c；yb = xb+c；则它们的和为<br />  y = ya+yb = xa+xb+2c ≠ x+c，<br />可见，它对加法不封闭；<br />（2）设ya = xa+c；将它乘以常数k，<br />  y = kya = k(xa+c) = kxa+kc ≠ kxa+c = x+c，<br />可见，它对乘法也不封闭；就是说，这不符合线性变换的规则，x和y 不属于同一个向量空间，无法用矩阵乘法来实现平移变换y = x+c。 </p>
				<p> </p>
				<p>(3) 平面运动模型的齐次坐标系</p>
				<p>把平面问题映射到高维的空间来建立方程，有可能把x和y由扩展了的向量空间来覆盖。把原来通过原点的平面沿垂直方向提高一个单位，与原平面保持平行，于是原来的x就用三维向量来表示为：</p>
				<p>
						<img height="117" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_x1_x2_1_coordinate.GIF" width="90" border="0" />
				</p>
				<p>这样的坐标系称为齐次坐标系。</p>
				<p>此时可以把平移矩阵写成： </p>
				<p>
						<img height="98" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_plainMoveMatrix.GIF" width="239" border="0" />
				</p>
				<p>因而平移运动y就可用x经线性变换实现了。 </p>
				<p>
						<img height="124" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_plainMoveMatrix2.GIF" width="234" border="0" />
				</p>
				<p>这个方法在研究刚体平面运动时非常有用。</p>
				<p>对象若同时有旋转和平移，则可以分别列出旋转矩阵和平移矩阵。不过此时的旋转矩阵也要改为3×3维，这可以把上述A5中增加第三行和第三列，置A(3,3)=1，其余新增元素为零。 </p>
				<p>
						<img height="117" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_plainMoveANDRotateMatrix1.GIF" width="271" border="0" />
				</p>
				<p>这就是既包括平移，又包括转动的平面齐次坐标系内的变换矩阵。</p>
				<p> </p>
				<p>(4) 空间线性变换的几何意义</p>
				<p>三维空间线性变换最直接的几何意义和应用价值可以从飞行器的三维转动坐标中得到解释。飞行器在空中可以围绕三个轴旋转。假如它在向北飞行，机头正对北方，则它围绕铅垂轴的旋转角称为偏航角（Yaw），它描述了飞机左右的偏转，用u表示；围绕翼展轴的旋转角称为倾斜角（Pitch），它描述了飞机俯仰姿态，用v表示；围绕机身轴的旋转角称为滚动角（Roll），用w表示；u,v和w三个变量统称为欧拉角，它们完全地描述了飞机的姿态。 </p>
				<p> </p>
				<p>
						<strong>例3：</strong>程序的实现方法</p>
				<p>把飞行器的三维图像用N个顶点描述，写成一个3×N的数据矩阵G。用plot3命令时按顶点连线能绘制出飞行器的外观。例如以下程序即可画出一个最简单的飞行器立体图。</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">Gw=[-4,-3,0;4,-3,0;0,7,0;-4,-3,0]'; % 主翼的顶点坐标<br />Gt=[0,-3,0;0,-3,3;0,2,0;0,-3,0]'; % 尾翼的顶点坐标<br />G=[Gw,Gt] % 整个飞行器外形的数据集<br />plot3(Gw(1,:),Gw(2,:),Gw(3,:),'r'), hold on<br />plot3(Gt(1,:),Gt(2,:),Gt(3,:),'g'), axis equal</span>
				</div>
				<p> </p>
				<p>围绕各个轴的旋转变换矩阵：</p>
				<p>飞行器围绕各个轴的旋转的结果，表现为各个顶点坐标发生变化，也就是G的变化。只要把三种姿态的变换矩阵Y,P和R乘以图形数据矩阵G即可。其中</p>
				<p>
						<img height="254" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_3_RotateMove_scoky_YRPMatrices.GIF" width="566" border="0" />
				</p>
				<p> </p>
				<p>综合旋转的变换矩阵：</p>
				<p>单独变化某个姿态角所生成的图形由G1 = Y*G，G2 = P*G，G3 = R*G算出，如果同时变化三个姿态角，则最后的图像数据成为Gf = Y*P*R*G = Q*G。这里假定转动的次序为：先滚动R，再倾斜P，最后偏航Y，由于矩阵乘法不服从交换律，转动次序不同时结果也不同。</p>
				<p>用MATLAB实现的程序如下：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; syms u,w,v<br />Y=[cos(u),sin(u),0;-sin(u),cos(u),0;0,0,1]<br />R=[1,0,0;0,cos(w),-sin(w);0,sin(w),cos(w)]<br />P=[cos(v),0,-sin(v);0,1,0;sin(v),0,cos(v)]<br />Q=Y*P*R <br /> <br />w =<br />w<br /> <br /> <br />v =<br />v<br /> <br /> <br />Y =<br /> <br />[  cos(u),  sin(u),       0]<br />[ -sin(u),  cos(u),       0]<br />[       0,       0,       1]<br /><br /> <br />R =<br /> <br />[       1,       0,       0]<br />[       0,  cos(w), -sin(w)]<br />[       0,  sin(w),  cos(w)]<br /> <br /><br />P =<br /> <br />[  cos(v),       0, -sin(v)]<br />[       0,       1,       0]<br />[  sin(v),       0,  cos(v)]<br /><br /> <br />Q =<br /> <br />[  cos(u)*cos(v),  sin(u)*cos(w)-cos(u)*sin(v)*sin(w), -sin(u)*sin(w)-cos(u)*sin(v)*cos(w)]<br />[ -sin(u)*cos(v),  cos(u)*cos(w)+sin(u)*sin(v)*sin(w), -cos(u)*sin(w)+sin(u)*sin(v)*cos(w)]<br />[         sin(v),                       cos(v)*sin(w),                       cos(v)*cos(w)]<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
				<div id="digg_block">
						<div id="author_profile">
								<div class="author_profile_info">
										<div class="author_profile_info">
												<a href="http://home.cnblogs.com/JCSU/" target="_blank">
														<font color="#000080">jcsu</font>
												</a>
												<br />
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:18 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-7】Matlab与线性代数(二) </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119992.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:16:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119992.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119992.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119992.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>
		<div class="postText">
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">原文：<a href="http://www.cnblogs.com/JCSU/articles/1490363.html">http://www.cnblogs.com/JCSU/articles/1490363.html</a></strong>
				</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">一、用矩阵运算法解线性方程组</strong>
				</p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">1、矩阵运算规则及MATLAB实例</strong>
				</p>
				<p> </p>
				<p>(1)  矩阵加(减)法：即两矩阵对应元素相加减，要求两矩阵的阶数必须相同。</p>
				<p>      C = A + B</p>
				<p> </p>
				<p>(2)  矩阵乘法：m<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>p阶矩阵A与p<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>n阶矩阵B的乘积C是一个m<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>n阶的矩阵。元素C(i, j)的值为A矩阵的第i行和B矩阵的第j列对应元素乘积的和。</p>
				<p>      A*B = C</p>
				<p>      矩阵乘法一般不满足交换律，即：A*B <span style="FONT-FAMILY: 宋体">≠</span> B*A</p>
				<p>例：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A=[1 2 3]<br /><br />A =<br /><br />     1     2     3<br /><br />&gt;&gt; B=[4; 5; 6]<br /><br />B =<br /><br />     4<br />     5<br />     6<br /><br />&gt;&gt; A*B </span>
						<span style="COLOR: #008000">%结果是一个标量</span>
						<span style="COLOR: #800000">
								<br />
								<br />ans =<br /><br />    32<br /><br />&gt;&gt; B*A </span>
						<span style="COLOR: #008000">%结果是一个矩阵</span>
						<span style="COLOR: #800000">
								<br />
								<br />ans =<br /><br />     4     8    12<br />     5    10    15<br />     6    12    18<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p> </p>
				<p>(3)  矩阵求逆：矩阵的逆阵V定义为满足V*A = I (I为与A同阶的单位矩阵)。只有方阵才可以求逆，而且此方阵的行列式必须不为零，det(A) ≠ 0。如果det(A) = 0，求逆时就会出现无穷大，此时的矩阵称为奇异的。</p>
				<p>例：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A<br /><br />A =<br /><br />     4     8    12<br />     5    10    15<br />     6    12    18<br /><br />&gt;&gt; B<br /><br />B =<br /><br />     4     8    12<br />     6    10    15<br />     7    12     4<br /><br />&gt;&gt; det(A) </span>
						<span style="COLOR: #008000">%矩阵A的行列式为零</span>
						<span style="COLOR: #800000">
								<br />
								<br />ans =<br /><br />     0<br /><br />&gt;&gt; det(B) </span>
						<span style="COLOR: #008000">%矩阵B的行列式不为零</span>
						<span style="COLOR: #800000">
								<br />
								<br />ans =<br /><br />   112<br /><br />&gt;&gt; inv(A) </span>
						<span style="COLOR: #008000">%对矩阵A求逆时出现无穷大(Inf)</span>
						<span style="COLOR: #800000">
								<br />Warning: Matrix is singular to working precision.<br /><br />ans =<br /><br />   Inf   Inf   Inf<br />   Inf   Inf   Inf<br />   Inf   Inf   Inf<br /><br />&gt;&gt; inv(B) </span>
						<span style="COLOR: #008000">%对矩阵B求逆正常</span>
						<span style="COLOR: #800000">
								<br />
								<br />ans =<br /><br />   -1.2500    1.0000         0<br />    0.7232   -0.6071    0.1071<br />    0.0179    0.0714   -0.0714<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p> </p>
				<p>(4)  矩阵转置：矩阵的行列互换后构成转置矩阵。如果A是m<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>n阶的，则A<sup>T</sup>是n<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>m阶的。</p>
				<p>例：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A<br /><br />A =<br /><br />     4     8    12<br />     5    10    15<br /><br />&gt;&gt; B=A'<br /><br />B =<br /><br />     4     5<br />     8    10<br />    12    15</span>
				</div>
				<p> </p>
				<p> </p>
				<p>(5)  矩阵分块：矩阵A可以划分成许多小矩阵。</p>
				<p>
						<img height="171" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_matrix_blockSeperation.GIF" width="359" border="0" />
				</p>
				<p>例：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A<br /><br />A =<br /><br />     3    -4     3     2    -1<br />     0    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br /><br />&gt;&gt; A1=A(1:3, 1:3)<br /><br />A1 =<br /><br />     3    -4     3<br />     0    -6     0<br />     4    -3     4<br /><br />&gt;&gt; A2=A(1:3, 4:5)<br /><br />A2 =<br /><br />     2    -1<br />    -3    -3<br />     2    -2<br /><br />&gt;&gt; A3=A(4, 1:4)<br /><br />A3 =<br /><br />     1     1     1     0<br /><br />&gt;&gt; A4=A(4, 5)<br /><br />A4 =<br /><br />    -1<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p> </p>
				<p>(5)  矩阵分解为向量：把矩阵沿行向或列向分解为单列或单行向量，常见的是分解为列向量。</p>
				<p>
						<img height="121" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_MatrixDecomposation_ColVector1.GIF" width="369" border="0" />
				</p>
				<p>其中：</p>
				<p>
						<img height="123" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_MatrixDecomposation_ColVector2.GIF" width="421" border="0" />
				</p>
				<p> </p>
				<p> </p>
				<p>(6)  行向量左乘列向量：要求两向量的长度必须一致，结果为一个标量。得出的是向量各分量的平方和。如果这些分量是正交的，则得出的是向量的长度平方。它的平方根就是向量长度，也称为向量的范数或2范数。</p>
				<p>行向量左乘列向量得到的是<img height="72" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_RowVectorMulColVector.GIF" width="127" border="0" />，在工程中具有这样计算形式的问题很多，比如用它计算两个向量x和y之间的相关性。</p>
				<p> </p>
				<p>(7)  列向量左乘行向量：如果列向量的长度为n，行向量的长度为m，则相乘会得出一个n<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>m的矩阵，这种方法常常用来生成和计算一些复杂的大矩阵。</p>
				<p> </p>
				<p>(8)  矩阵乘法和幂次：A^2 = A*A,  A^n =  A*A*...*A。根据矩阵相乘内阶数必须相等，只有方阵才能乘方和幂次。</p>
				<p> </p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">2、初等变换乘子矩阵的生成及MATLAB实例</strong>
				</p>
				<p> </p>
				<p>本节通过将原矩阵左乘变换的单位矩阵实现矩阵的初等行变换： </p>
				<p>(1) 行交换：将矩阵A的第 i , j 两行互换位置。</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">
								<br />
						</span>
						<span style="COLOR: #008000">% 行交换：交换矩阵A的第1行和第3行</span>
						<span style="COLOR: #800000">
								<br />
								<br />
						</span>
						<span style="COLOR: #008000">% 步骤1：得到一个5阶单位阵：E=eye(5)</span>
						<span style="COLOR: #800000">
								<br />
						</span>
						<span style="COLOR: #008000">% 步骤2：交换E的第1行和第3行得到矩阵</span>
						<span style="COLOR: #008000">E1</span>
						<span style="COLOR: #800000">
								<br />
						</span>
						<span style="COLOR: #008000">% 步骤3：矩阵A左乘矩阵E1得到交换后</span>
						<span style="COLOR: #008000">的矩阵</span>
						<span style="COLOR: #800000">
								<br />
								<br />&gt;&gt; A<br /><br />A =<br /><br />     3    -4     3     2    -1<br />     0    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br />    -2     6    -2     1     3<br /><br />&gt;&gt; <br /><br />E1 =<br /><br />     0     0     1     0     0<br />     0     1     0     0     0<br />     1     0     0     0     0<br />     0     0     0     1     0<br />     0     0     0     0     1<br /><br />&gt;&gt; E1*A<br /><br />ans =<br /><br />     4    -3     4     2    -2<br />     0    -6     0    -3    -3<br />     3    -4     3     2    -1<br />     1     1     1     0    -1<br />    -2     6    -2     1     3<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>写成函数E1gen(A,i,j)：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">function E=E1gen(A,i,j)<br />n=size(A); </span>
						<span style="COLOR: #008000">%求矩阵A的行数和列数</span>
						<span style="COLOR: #800000">
								<br />m=min(n); </span>
						<span style="COLOR: #008000">%获取矩阵行数和列数中的最小值</span>
						<span style="COLOR: #800000">
								<br />E=eye(m); </span>
						<span style="COLOR: #008000">%产生单位对角阵</span>
						<span style="COLOR: #800000">
								<br />E(i,i)=0; E(j,j)=0; E(i,j)=1; E(j,i)=1;</span>
				</div>
				<p> </p>
				<p> </p>
				<p>(2) 行乘数：将矩阵A的第 i 行乘以 k 。</p>
				<p> </p>
				<div class="cnblogs_code">
						<p>
								<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
								<span style="COLOR: #800000">
								</span>
						</p>
						<p>
								<span style="COLOR: #800000">
								</span> </p>
						<p>
								<span style="COLOR: #008000">% 行乘数：将矩阵A的第4行乘以5</span>
								<span style="COLOR: #800000">
										<br />
										<br />
								</span>
								<span style="COLOR: #008000">% 步骤1：得到一个5阶单位阵：E=eye(5)</span>
								<span style="COLOR: #800000">
										<br />
								</span>
								<span style="COLOR: #008000">% 步骤2：将单位阵E中的元素E(4,4)乘以5得到矩阵E2</span>
								<span style="COLOR: #800000">
										<br />
								</span>
								<span style="COLOR: #008000">% 步骤3：矩阵A左乘矩阵E2得到变换后</span>
								<span style="COLOR: #008000">的矩阵</span>
								<span style="COLOR: #800000">
										<br />
										<br />&gt;&gt; A<br /><br />A =<br /><br />     3    -4     3     2    -1<br />     0    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br />    -2     6    -2     1     3<br /><br />&gt;&gt; E2<br /><br />E2 =<br /><br />     1     0     0     0     0<br />     0     1     0     0     0<br />     0     0     1     0     0<br />     0     0     0     5     0<br />     0     0     0     0     1<br /><br />&gt;&gt; E2*A<br /><br />ans =<br /><br />     3    -4     3     2    -1<br />     0    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     5     5     5     0    -5<br />    -2     6    -2     1     3<br /><br />&gt;&gt; </span>
						</p>
				</div>
				<p> </p>
				<p>写成函数E2gen(A,i,k)：</p>
				<p> </p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">function E=E2gen(A,i,k)<br />n=size(A);<br />m=min(n);%获取矩阵行数和列数中的最小值<br />E=eye(m);%产生单位对角阵<br />E(i,i)=k;</span>
				</div>
				<p> </p>
				<p> </p>
				<p>(3) 行相加：将矩阵的第 i 行乘以 k，加到第 j 行。</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">
								<br />
						</span>
						<span style="COLOR: #008000">% 行乘数加到另一行：将矩阵A的第4行乘以2加到第5行</span>
						<span style="COLOR: #800000">
								<br />
								<br />
						</span>
						<span style="COLOR: #008000">% 步骤1：得到一个5阶单位阵：E=eye(5)</span>
						<span style="COLOR: #800000">
								<br />
						</span>
						<span style="COLOR: #008000">% 步骤2：将单位阵E中的元素E(5,4)乘以2得到矩阵E3</span>
						<span style="COLOR: #800000">
								<br />
						</span>
						<span style="COLOR: #008000">% 步骤3：矩阵A左乘矩阵E3得到变换后的矩阵</span>
						<span style="COLOR: #800000">
								<br />
								<br />&gt;&gt; A<br /><br />A =<br /><br />     3    -4     3     2    -1<br />     0    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br />    -2     6    -2     1     3<br /><br />&gt;&gt; E3<br /><br />E3 =<br /><br />     1     0     0     0     0<br />     0     1     0     0     0<br />     0     0     1     0     0<br />     0     0     0     1     0<br />     0     0     0     2     1<br /><br />&gt;&gt; E3*A<br /><br />ans =<br /><br />     3    -4     3     2    -1<br />     0    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br />     0     8     0     1     1<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>写成函数E3gen(A,i,j,k)：</p>
				<p> </p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">function E=E3gen(A,i,j,k)<br />n=size(A);<br />m=min(n);%获取矩阵行数和列数中的最小值<br />E=eye(m);%产生单位对角阵<br />E(j,i)=k;</span>
				</div>
				<p> </p>
				<p>
						<strong>实例：</strong>
				</p>
				<p>要消去下列矩阵的A(2,1)，求乘子矩阵E3</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">A =<br /><br />     3    -4     3     2    -1<br />     6    -6     0    -3    -3<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br />    -2     6    -2     1     3</span>
				</div>
				<p> </p>
				<p>在第二行加以第一行乘 -A(2,1)/A(1,1) = -2，故令E3 = E3gen(A,1,2,-2)</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; E3=E3gen(A,1,2,-2)<br /><br />E3 =<br /><br />     1     0     0     0     0<br />    -2     1     0     0     0<br />     0     0     1     0     0<br />     0     0     0     1     0<br />     0     0     0     0     1<br /><br />&gt;&gt; E3*A<br /><br />ans =<br /><br />     3    -4     3     2    -1<br />     0     2    -6    -7    -1<br />     4    -3     4     2    -2<br />     1     1     1     0    -1<br />    -2     6    -2     1     3<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>
						<strong>综上可知：</strong>
				</p>
				<p>
						<span style="COLOR: #0000ff">1、</span>
						<span style="COLOR: #0000ff">行阶梯生成等价于矩阵左乘</span>
				</p>
				<p>因此，整个行阶梯形式U的生成过程，可以看作把原矩阵左乘以一系列的初等变换矩阵E1和E3。把这些初等矩阵的连乘积写成EX，则有: U=EX*A，设其逆为L:</p>
				<p>从而有 L*U=A </p>
				<p>就是说，A可以分解为一个准下三角矩阵L和一个上三角（即行阶梯）矩阵U的乘积。MATLAB提供了三角分解的函数lu，它的调用方法是：[L,U]=lu(A) </p>
				<p>
						<span style="COLOR: #0000ff">2、</span>
						<span style="COLOR: #0000ff">lu分解是求行阶梯的一个方法</span>
				</p>用lu函数求出的U实际上就是A的行阶梯形式（不是简化行阶梯形式）。所以，求简化行阶梯形式用rref函数，而求行阶梯形式可以用lu 函数。不过，它和我们用消元运算所得U的数据不一定相同，尽管得出的阶次和阶梯形状相同。但因为行阶梯形式可以有无数种，用不同步骤算出的结果也不同。只有变成简化行阶梯形式，才能进行比较，看它是不是惟一的。 
<p> </p><p> </p><p><strong style="FONT-SIZE: 12pt; COLOR: #0000ff">3、行列式</strong></p><p>(1) 行列式的几何意义：</p><p>行列式的几何意义是面积或体积，它的用途很单一，就是判断奇异性，连正负号都不必关心。</p><p>(2) 行列式的计算方法：</p><p>计算行列式的最好方法还是行阶梯法，可以利用lu分解<br />                [L,U] = lu(A)<br />把A分解为一个准下三角矩阵L和一个上三角矩阵U的乘积。因为det(L) = 1，所以U和A的行列式相等。  </p><p>               det(A) = det(U)<br />而三角矩阵U的det(U)很好求。只要把U的主对角线元素连乘就可得到它的行列式。</p><p> </p><p><strong>实例：</strong></p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #800000">&gt;&gt; A<br /><br />A =<br /><br />    10     8     6     4     1<br />     2     5     8     9     4<br />     6     0     9     9     8<br />     5     8     7     4     0<br />     9     4     2     9     1<br /><br />&gt;&gt; [L U]=lu(A)<br /><br />L =<br /><br />    1.0000            0           0           0            0<br />    0.2000   -0.7083    1.0000           0            0<br />    0.6000    1.0000            0           0            0<br />    0.5000   -0.8333    0.8000   -0.2953    1.0000<br />    0.9000    0.6667   -0.6588    1.0000            0<br /><br /><br />U =<br /><br />   10.0000    8.0000     6.0000     4.0000    1.0000<br />            0   -4.8000     5.4000     6.6000    7.4000<br />            0            0   10.6250    12.8750    9.0417<br />            0            0            0      9.4824    1.1235<br />            0            0            0             0   -1.2349<br /><br />&gt;&gt; du=diag(U)<br /><br />du =<br /><br />   10.0000<br />   -4.8000<br />   10.6250<br />    9.4824<br />   -1.2349<br /><br />&gt;&gt; result=prod(du)<br /><br />result =<br /><br />  5.9720e+003<br /><br />&gt;&gt; </span></div><p> </p><p>用det求A的行列式值得到相同的结果：</p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #800000">&gt;&gt; det(A)<br /><br />ans =<br /><br />        5972<br /><br />&gt;&gt; </span></div><p> </p><p> </p><p> </p><p><strong style="FONT-SIZE: 12pt; COLOR: #0000ff">4、矩阵的秩和矩阵求逆</strong></p><p> </p><p>矩阵的秩：</p><p>(1) 按定义，矩阵的<strong>秩</strong>是矩阵A中行列式不等于零的最高阶子式的阶次。是<strong>用以衡量</strong>联立方程中<strong>有效方程数目</strong>的指数。<br />(2) 按照定义来计算矩阵的秩，可能遇到的问题也是子矩阵的数量很大，每个矩阵的行列式计算又非常麻烦，其计算量也将是不可接受的天文数字。<br />(3) 计算矩阵的秩的最好方法是行阶梯法，行阶梯化简后非全为零的行数就是该矩阵的秩。用MATLAB函数r=rank(A)可以检验A的秩，rank函数对A是否是方阵没有要求，即可以有m≠n。</p><p> </p><p>矩阵求逆：</p><p>(1) 对于n<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>n方阵A，当r=n时，称A是满秩的，若r&lt;n，必有det(A) = 0，称A是欠秩的或奇异的。奇异矩阵不可以求逆。  <br />(2) 矩阵求逆的最简单方法也是行阶梯化简，其方法是设定一个由A和I组成的增广矩阵C = [A,I]，求C的简化行阶梯形式UC = rref([A,I])，得出UC = [I,V]。V就显示出这个逆矩阵的内容。 </p><p> </p><p><strong>求逆实例：</strong></p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #800000">&gt;&gt; A=[3 0 3 -6;5 -1 1 -5;-3 1 4 -9;1 -3 4 -4]<br /><br />A =<br /><br />     3     0     3    -6<br />     5    -1     1    -5<br />    -3     1     4    -9<br />     1    -3     4    -4<br /><br />&gt;&gt; C=[A,eye(4)]<br /><br />C =<br /><br />     3     0     3    -6     1     0     0     0<br />     5    -1     1    -5     0     1     0     0<br />    -3     1     4    -9     0     0     1     0<br />     1    -3     4    -4     0     0     0     1<br /><br />&gt;&gt; UC=rref(C) </span><span style="COLOR: #008000">%UC右边四列就是矩阵A的逆</span><span style="COLOR: #800000"><br /><br />UC =<br /><br />    1.0000         0         0         0    0.2323   -0.0101   -0.1313   -0.0404<br />         0    1.0000         0         0    0.5354   -0.3131   -0.0707   -0.2525<br />         0         0    1.0000         0    0.5859   -0.4747   -0.1717    0.1010<br />         0         0         0    1.0000    0.2424   -0.2424   -0.1515    0.0303<br /><br />&gt;&gt; V=UC(:,5:8)<br /><br />V =<br /><br />    0.2323   -0.0101   -0.1313   -0.0404<br />    0.5354   -0.3131   -0.0707   -0.2525<br />    0.5859   -0.4747   -0.1717    0.1010<br />    0.2424   -0.2424   -0.1515    0.0303<br /><br />&gt;&gt; </span></div><p> </p><p>矩阵求逆命令：V=inv(A)</p><p> </p><p> </p><p><strong><font color="#0000ff">5、条件数—衡量奇异程度的量</font></strong></p><p>(1) 在用数值方法计算矩阵的逆时，由于计算中的误差，人们不大可能得到理想的零合理想的全零行，所以矩阵是否奇异，并不是那么绝对的。<br />(2) 为了评价矩阵接近‘奇异’的程度，采用了‘条件数’（Condition Number）作为常用的衡量指标。它永远大于1。其数值愈接近于1，计算误差愈小。<br />(3) MATLAB中，条件数用cond(A)计算，它达到10的4次方以上时，求逆的误差就可能相当可观。像现在，条件数达到10的16次方（注：条件数是逆条件数RCOND的倒数），结果是根本不能用的。</p><p> </p><p><strong><font color="#0000ff">6、用矩阵‘除法’解线性方程</font></strong></p><p> </p><p>(1) 如果m = n，则线性代数方程Ax = b中的A是方阵，设det(A)≠0，则它的逆阵存在。将上式左右同乘以inv(A) ，由于inv(A)*A = I，得到</p><p>X = inv(A)*b （1）</p><p>MATLAB创立了矩阵除法的概念，因为 inv(A)相当于将A放到分母上去，所以可以把上式写成</p><p>X = A \ b      （2）</p><p>‘\’就称为左除，因为inv(A)是乘在b的左方。</p><p> </p><p>(2) 左除’\’解线性方程的扩展</p><p>左除‘\’的功能远远超过了矩阵求逆函数inv，inv(A)函数要求A必须是方阵，所以（1）式只能用来解‘适定’方程，而（2）式并不要求A为方阵，在A是m<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>n阶且m &lt; n（欠定）时，它只要求A与b的行数相等且A的秩为m。所以（2）式也可以用来解欠定方程，在下例中可以看出。此外，运算符‘\’还能用来解超定方程。</p><p> </p><p><strong>例：</strong>左除’\’解欠定方程</p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #800000">&gt;&gt; A=[3,4,3,2,1;0,6,0,3,3;4,3,4,2,2;1,1,1,0,1;2,6,2,1,3]<br /><br />A =<br /><br />     3     4     3     2     1<br />     0     6     0     3     3<br />     4     3     4     2     2<br />     1     1     1     0     1<br />     2     6     2     1     3<br /><br />&gt;&gt; b=[2;3;2;0;1]<br /><br />b =<br /><br />     2<br />     3<br />     2<br />     0<br />     1<br /><br />&gt;&gt;  x=A\b<br />Warning: Matrix is singular to working precision.<br /><br />x =<br /><br />       NaN<br />       NaN<br />       Inf<br />    1.0000<br />    0.0000<br /><br />&gt;&gt; </span></div><p> </p><p>得到x=inf，无解。改用行阶梯方法找有效行。左除要求的是系数矩阵的行数与秩相同</p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #800000">&gt;&gt; A<br /><br />A =<br /><br />     3     4     3     2     1<br />     0     6     0     3     3<br />     4     3     4     2     2<br />     1     1     1     0     1<br />     2     6     2     1     3<br /><br />&gt;&gt; b<br /><br />b =<br /><br />     2<br />     3<br />     2<br />     0<br />     1<br /><br />&gt;&gt; B=[A,b]<br /><br />B =<br /><br />     3     4     3     2     1     2<br />     0     6     0     3     3     3<br />     4     3     4     2     2     2<br />     1     1     1     0     1     0<br />     2     6     2     1     3     1<br /><br />&gt;&gt; r=rank(B)<br /><br />r =<br /><br />     4<br /><br />&gt;&gt; [UB,ip]=rref(B)<br /><br />UB =<br /><br />     1     0     1     0     0     0<br />     0     1     0     0     0     0<br />     0     0     0     1     0     1<br />     0     0     0     0     1     0<br />     0     0     0     0     0     0<br /><br /><br />ip =<br /><br />     1     2     4     5<br /><br />&gt;&gt; U0=UB(1:r,1:5)<br /><br />U0 =<br /><br />     1     0     1     0     0<br />     0     1     0     0     0<br />     0     0     0     1     0<br />     0     0     0     0     1<br /><br />&gt;&gt; d=UB(1:4,6)<br /><br />d =<br /><br />     0<br />     0<br />     1<br />     0<br /><br />&gt;&gt; x=U0\d<br /><br />x =<br /><br />     0<br />     0<br />     0<br />     1<br />     0<br /><br />&gt;&gt; </span></div><p> </p><p>其中，x是此欠定方程的一个特解。</p><p> </p><div id="EntryTag">Tag标签: <a href="http://www.cnblogs.com/JCSU/tag/%e7%9f%a9%e9%98%b5%e4%b9%98%e6%b3%95/"><font color="#000080">矩阵乘法</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e7%9f%a9%e9%98%b5%e8%bd%ac%e7%bd%ae/"><font color="#000080">矩阵转置</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e7%9f%a9%e9%98%b5%e6%b1%82%e9%80%86/"><font color="#000080">矩阵求逆</font></a></div><div id="c_jquery_test" style="DISPLAY: none"><font color="#000080"></font></div><script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script><div id="digg_block"><div id="author_profile"><div class="author_profile_info"><div class="author_profile_info"><a href="http://home.cnblogs.com/JCSU/" target="_blank"><font color="#000080">jcsu</font></a><br /></div></div></div></div></div>
<img src ="http://www.cppblog.com/erran/aggbug/119992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:16 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-7】Matlab与线性代数(一) </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119991.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119991.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119991.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119991.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119991.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>
		<div class="postText">
				<p>原文：<a href="http://www.cnblogs.com/JCSU/articles/1449986.html">http://www.cnblogs.com/JCSU/articles/1449986.html</a></p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">一、线性代数基本方程组</strong>
				</p>
				<p> </p>
				<p>基本方程组：</p>
				<p>
						<img style="WIDTH: 142px; HEIGHT: 51px" height="51" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Ax_b.GIF" width="142" border="0" />
				</p>
				<p> </p>
				<p>矩阵表示：</p>
				<p>
						<img height="140" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_equations_new.GIF" width="366" border="0" /> </p>
				<p>
						<strong>
						</strong> </p>
				<p>
						<strong>解决问题的视角：</strong>
				</p>
				<p>
						<strong>
						</strong> </p>
				<p>1、解联立方程的视角 (行阶梯变换 &amp;  矩阵运算)</p>
				<p>着重研究解x，即研究线性方程组的解法。中学里的解方程和MATLAB的矩阵除法就是这样。</p>
				<p>要点：矩阵的每一行代表一个方程，m行代表m个线性联立方程。 n列代表n个变量。如果m是独立方程数，根据m&lt;n、m=n、m&gt;n确定方程是 ‘欠定’、‘适定’ 还是 ‘超定’。对这三种情况都会求解了，研究就完成了。必须剔除非独立方程。行阶梯形式、行列式和秩的概念很大程度上为此目的而建立。</p>
				<p> </p>
				<p>2、向量空间中向量的合成的视角 (用向量空间解方程组)</p>
				<p>把A各列看成n个m维基本向量，线性方程组看成基向量的线性合成：</p>
				<p>
						<img height="150" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_columnVectorCompose_new.GIF" width="509" border="0" />
				</p>
				<p>要点：解x是这些基向量的系数。它可能是常数(适定方程)，也可能成为其中的一个子空间(欠定方程) 。要建立其几何概念，并会求解或解空间。</p>
				<p> </p>
				<p>3、线性变换或映射的视角 (线性变换及其特征)</p>
				<p>把b看成变量y，着重研究把Rn空间的x变换为Rm空间y 的效果，就是研究线性变换系数矩阵A的特征对变换的影响。</p>
				<p> </p>
				<p>
						<img height="144" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_EquationsTransformation_new.GIF" width="414" border="0" />
				</p>
				<p>要点：就是要找到适当的变换，使研究问题的物理意义最为明晰。特征值问题就是一例。</p>
				<p> </p>
				<p> </p>
				<div v:shape="_x0000_s1026"> </div>
				<div v:shape="_x0000_s1026"> </div>
				<div v:shape="_x0000_s1026">
						<span style="FONT-SIZE: 18pt; COLOR: #ff0000">
								<strong>二、线性代数建模与应用概述</strong>
						</span>
				</div>
				<div v:shape="_x0000_s1026"> </div>
				<div v:shape="_x0000_s1026"> </div>
				<div v:shape="_x0000_s1026">介绍一些大的系统工程中使用线性代数的情况，使读者知道为什么线性代数在近几十年来变得如此的重要。</div>
				<ul>
						<li>
								<div v:shape="_x0000_s1026">Leontief教授把美国的经济用500个变量的500个线性方程来描述，在1949年利用当时的计算机解出了42×42的简化模型，使他于1973年获得诺贝尔经济奖，从而大大推动了线性代数的发展。 </div>
						</li>
				</ul>
				<ul>
						<li>
								<div v:shape="_x0000_s1026">把飞行器的外形分成若干大的部件，每个部件沿着其表面又用三维的细网格划分出许多立方体，这些立方体包括了机身表面以及此表面内外的空气。对每个立方体列写出空气动力学方程，其中包括了与它相邻的立方体的共同边界变量，这些方程通常都已经简化为线性方程。对一个飞行器，小立方体的数目可以多达400,000个，而要解的联立方程可能多达2,000,000个。 </div>
						</li>
				</ul>
				<ul>
						<li>
								<div v:shape="_x0000_s1026">飞行器的运动要用三个转动和三个平移共六个变量来表示（像在第九章中介绍的那样）。除此以外，为了控制飞行器的三维转动，需要三个控制面，即方向舵（垂直尾翼）、升降舵（水平尾翼）和副翼，它们的偏转角又构成了三个变量。描述飞行器的运动就需要12个变量的组合。而且这已经不单是代数方程，而是微分方程了。 </div>
						</li>
				</ul>
				<ul>
						<li>
								<div v:shape="_x0000_s1026">卫星上用三种可见光和四种红外光进行摄像，对每一个区域，可以获得七张遥感图象。利用多通道的遥感图可以获取尽可能多的地面信息，因为各种地貌、作物和气象特征可能对不同波段的光敏感。而在实用上应该寻找每一个地方的主因素，成为一张实用的图象。每一个象素上有七个数据，形成一个多元的变量数组，在其中合成并求取主因素的问题，就与线性代数中要讨论的特征值问题有关。</div>
						</li>
				</ul>
				<ul>
						<li>
								<div v:shape="_x0000_s1026">在全国设立几十万个观察点，把每一点的经度、纬度和高度三个坐标建立起来。现在对于经度纬度的测量精度要求，已经提高到了若干厘米，对于高度的精度要求更高。在一些边远地区，对于一些特征点的测量，要耗费很大的人力物力。例如对珠穆朗玛峰顶高度的测量，要经过多种方法，取得多种数据，并且用最小二乘法进行误差的处理。</div>
						</li>
				</ul>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026">
						<strong style="FONT-SIZE: 18pt; COLOR: #ff0000">三、行阶梯法解线性方程</strong>
				</p>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026">
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">
						</strong> </p>
				<p v:shape="_x0000_s1026">
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">1、线性方程的Matlab表示方法</strong>
				</p>
				<p> </p>
				<p>(1) 由n个变量组成的m个联立线性代数方程组：</p>
				<p v:shape="_x0000_s1026">
						<img height="216" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_NbyM_linearEquations.GIF" width="443" border="0" />
				</p>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026">用MATLAB语言表示为：</p>
				<p v:shape="_x0000_s1026">
						<img height="51" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Ax_b.GIF" width="145" border="0" />
				</p>
				<p v:shape="_x0000_s1026">其中：</p>
				<p v:shape="_x0000_s1026">
						<img height="144" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_Ax_b_details.GIF" width="565" border="0" />
				</p>
				<p v:shape="_x0000_s1026">n是未知数个数，m是独立方程的个数。当m&lt;n时，方程组有无数多个解，称为欠定方程；当m&gt;n时，方程组无解，称为超定方程；当m=n时，方程组有唯一解，称为适定方程；所以不能简单地看形式上的m和n，还必须剔除其中非独立方程的虚假成分。将要讨论的行阶梯形式、行列式和“秩”等概念，很大程度上就是为了找到独立方程的数目。</p>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026">(2) 解线性方程组及在matlab中的显示</p>
				<p v:shape="_x0000_s1026">
						<img style="WIDTH: 495px; HEIGHT: 277px" height="279" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_4equations.GIF" width="497" border="0" />
				</p>
				<p v:shape="_x0000_s1026">作图的matlab代码：</p>
				<div>
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<div class="cnblogs_code">
								<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
								<span style="COLOR: #800000">subplot(2,2,1) <span style="COLOR: #339966">%作左上角图，画方程组(a)<br /></span><a>ezplot</a>('x1-2*x2+1') <span style="COLOR: #339966">%画(a)中的x1-2*x2+1=0<br /></span>hold on<br />ezplot('-x1+3*x2-3')<br />subplot(2,2,2) <span style="COLOR: #339966">%作右上角图，画方程组(b)</span><br />ezplot('x1-2*x2+1')<br />hold on<br />ezplot('-x1+2*x2-3')<br />subplot(2,2,3) <span style="COLOR: #339966">%作左下角图，画方程组(c)<br /></span>ezplot('x1-2*x2+1')<br />hold on<br />ezplot('-x1+2*x2-1')<br />subplot(2,2,4) <span style="COLOR: #339966">%作右下角图，画方程组(d)</span><br />ezplot('x1+x2-1')<br />hold on<br />ezplot('x1-x2-3')<br />hold on<br />ezplot('-x1+2*x2+3')</span>
						</div>
				</div>
				<div> </div>
				<p v:shape="_x0000_s1026">使用参考：<a href="http://www.cnblogs.com/JCSU/articles/1445400.html" target="_blank"><font color="#000080">ezplot</font></a></p>
				<p v:shape="_x0000_s1026">
						<font color="#000080">
						</font> </p>
				<p v:shape="_x0000_s1026">四个方程组在matlab中的作图：</p>
				<p v:shape="_x0000_s1026">
						<img height="420" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_4equations_solve.GIF" width="495" border="0" />
				</p>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026"> </p>
				<p v:shape="_x0000_s1026">
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">2、初等行变换</strong>
				</p>
				<p> </p>
				<p>将系数矩阵A和B组成增广矩阵：</p>
				<p>
						<img height="145" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_extended_Matrix.GIF" width="451" border="0" /> </p>
				<p>对增广矩阵的行作以下三种运算不会改变方程组的解，这三种运算组成了矩阵的初等行变换：</p>
				<p>(1) 行交换：将增广矩阵的第 i , j 两行互换位置。MATLAB语句：c([i,j],:) = c([j,i],:)</p>
				<p>(2) 行乘数：将增广矩阵的第 i 行乘以常数 k 。MATLAB语句：c(i,:) = k*c(i,:)</p>
				<p>(3) 行相加：将增广矩阵的第 i 行乘以常数 k，加到第 j 行。MATLAB语句：c(j,:) = c(j,:) + k*c(i,:)</p>
				<p> </p>
				<p> </p>
				<p>
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">3、行阶梯矩阵的生成(高斯消元过程)</strong>
				</p>
				<p> </p>
				<p>
						<strong>(1) 行阶梯矩阵、简化行阶梯矩阵</strong>
				</p>
				<p> </p>
				<p>如果线性方程组的左端系数具有以下三个特点：</p>
				<p>a) 所有非零行都处在全零行的上方；</p>
				<p>b) 各行的第一个非零元素的列号比其上方所有各行的第一非零元素的列号都要大；</p>
				<p>c) 所有的第一非零元素所在的列中，其下方的所有元素均为零；</p>
				<p>这样的矩阵称为<strong>行阶梯矩阵</strong>(或上三角矩阵)，如矩阵C1：</p>
				<p> </p>
				<p>
						<img height="257" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_extended_Matrix_primary_row_trans.GIF" width="443" border="0" /> </p>
				<p> </p>
				<p>如果行阶梯矩阵还满足以下两个额外特点，则称之为<strong>简化行阶梯矩阵</strong>，如下图的矩阵C2：</p>
				<p>1) 各行的第一个非零元素是所在列中唯一的非零元素</p>
				<p>2) 各行的第一个非零元素都等于1</p>
				<p>
						<img height="246" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_extended_Matrix_simplified_pad_matrix.GIF" width="684" border="0" />
				</p>
				<p> </p>
				<p>
						<strong>(2) 高斯消元过程、实例、matlab消元</strong>
				</p>
				<p>步骤1：把主对角线下方第一列元素全变为零。在矩阵的各行中，选择第1列元素的绝对值最大的行，通过行交换把它放到第1行（这样做主要是为了提高计算精度，如果不考虑精度，只要第1行第1列元素不为零，可以跳过这个环节）。以第1行为基准，依次把第2行至第n行的第1列的元素消为零。</p>
				<p>步骤2：在2~n行中，选择第2列元素的绝对值最大的行，通过行交换把它放到第2行。以第2行为基准行，依次把第3行至第n行的第2列的元素消为零。</p>
				<p>步骤3: 做法同前面的步骤</p>
				<p>...</p>
				<p>步骤n-1：做法同前面的步骤</p>
				<p> </p>
				<p>
						<strong>实例：</strong>用行阶梯及回代法求解以下方程组(方程组对应的增广矩阵已给出)：</p>
				<p>
						<strong>
								<span style="FONT-SIZE: 12pt">
										<img height="99" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_equations_and_extended_Matrix.GIF" width="479" border="0" />
								</span>
						</strong>
				</p>
				<p> </p>
				<p>
						<strong>matlab消元程序：</strong>
				</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">function [B]=gauss(A,i,j,q)<br />% ---------------------------------<br />% A为输入矩阵，B为变换后的输出矩阵<br />% i为基准行的行号<br />% j为待变换行的行号<br />% q为基准元的列号，即A(i,q)为基准元，A(j,q)为待消元<br />%<br />x = A(i,:); y=A(j,:);      % 取出A的第i,j两行命名为x,y，<br />z = y - y(q)/x(q)*x;    % 实现（6.2.5）式的运算<br />A(j,:)=z;       % 把结果赋值给A第j行，<br />B=A;         % 将A作为输出变元B</span>
				</div>
				<p> </p>
				<p> </p>
				<p>matlab中的消元过程如下：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; C<br /><br />C =<br /><br />     1     4     7     1<br />     8     5     2     3<br />     3     6    -2     5<br /><br />&gt;&gt; B=gauss(C,1,2,1) <span style="COLOR: #008000">%以第1行为基准行，使第2行的第1列元素变为0</span><br /><br />B =<br /><br />     1     4     7     1<br />     0   -27   -54    -5<br />     3     6    -2     5<br /><br />&gt;&gt; B=gauss(B,1,3,1) <span style="COLOR: #008000">%以第1行为基准行，使第3行的第1列元素变为0<br /></span><br />B =<br /><br />     1     4     7     1<br />     0   -27   -54    -5<br />     0    -6   -23     2<br /><br />&gt;&gt; B=gauss(B,2,3,2) <span style="COLOR: #008000">%以第2行为基准行，使第3行的第2列元素变为0，此时，生成了<strong>行阶梯矩阵</strong><br /></span><br />B =<br /><br />    1.0000    4.0000    7.0000    1.0000<br />         0  -27.0000  -54.0000   -5.0000<br />         0         0  -11.0000    3.1111<br /><br />&gt;&gt; B=gauss(B,3,2,3) <span style="COLOR: #008000">%以第3行为基准行，使第2行的第3列元素变为0</span><br /><br />B =<br /><br />    1.0000    4.0000    7.0000    1.0000<br />         0  -27.0000         0  -20.2727<br />         0         0  -11.0000    3.1111<br /><br />&gt;&gt; B=gauss(B,3,1,3) <span style="COLOR: #008000">%以第3行为基准行，使第1行的第3列元素变为0<br /></span><br />B =<br /><br />    1.0000    4.0000         0    2.9798<br />         0  -27.0000         0  -20.2727<br />         0         0  -11.0000    3.1111<br /><br />&gt;&gt; B=gauss(B,2,1,2) <span style="COLOR: #008000">%以第2行为基准行，使第1行的第2列元素变为0，此时，A阵变成了<strong>对角矩阵</strong></span><br /><br />B =<br /><br />    1.0000         0         0   -0.0236<br />         0  -27.0000         0  -20.2727<br />         0         0  -11.0000    3.1111<br /><br />&gt;&gt; B(2,:)=-1/27*B(2,:) <span style="COLOR: #008000">%第2行除以对角项</span><br /><br />B =<br /><br />    1.0000         0         0   -0.0236<br />         0    1.0000         0    0.7508<br />         0         0  -11.0000    3.1111<br /><br />&gt;&gt; B(3,:)=-1/11*B(3,:) <span style="COLOR: #008000">%第3行除以对角项，此时，生成了<strong>简化行阶梯矩阵</strong></span><br /><br />B =<br /><br />    1.0000         0         0   -0.0236<br />         0    1.0000         0    0.7508<br />         0         0    1.0000   -0.2828<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>
						<span style="FONT-SIZE: 12pt">
								<strong>
								</strong>
						</span> </p>
				<p> </p>
				<p>
						<span style="FONT-SIZE: 12pt; COLOR: #0000ff">
								<strong>4、MATLAB中的行阶梯生成函数</strong>
						</span>
				</p>
				<p>MATLAB已经把“简化行阶梯形式(reduced row echelon form)”的计算过程集成为一个子程序rref。它的输入变元可以是线性方程组的系数矩阵，也可以是其增广矩阵，输入U=rref([A,b])，输出结果就是简化行阶梯矩阵。</p>
				<p>
						<strong>
						</strong> </p>
				<p>
						<strong>例：</strong>用MATLAB中的rref求解3(2)中的方程组：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A=[1,4,7; 8,5,2; 3,6,-2];  b=[1; 3; 5];  C=[A, b];  U=rref(C)<br /><br /><br />U =<br /><br />    1.0000         0         0   -0.0236<br />         0    1.0000         0    0.7508<br />         0         0    1.0000   -0.2828<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>解得：x1=-0.0236,   x2=0.7508,   x3=-0.2828</p>
				<p> </p>
				<p> </p>
				<p>
						<span style="FONT-SIZE: 12pt; COLOR: #0000ff">
								<strong>5、行阶梯法解欠定方程组</strong>
						</span>
				</p>
				<p>上面讨论的是方程数m与变量数n相等的情况。普遍情况下，m&lt;n，属于欠定方程，方程将有无数解，我们必须找出其解的一般形式。即使m=n，也有可能是<strong>假象</strong>，因为有的方程是相依的，<strong>有效方程数</strong>也许小于m。要看清它究竟是什么类型，应该看<strong>行阶梯形式</strong>的结果，即有效行的数目，有效行的个数也叫<strong style="COLOR: red">矩阵的“秩”</strong>。对于一个矩阵，尽管因变换的次序不同，但“秩”是唯一的。</p>
				<p>对增广矩阵C=[A, b]进行行阶梯变换，得到的行阶梯矩阵U的下方可能有全零出现。行阶梯形式为：</p>
				<p>
						<img height="160" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_echelon_rowNumLessThanM.GIF" width="345" border="0" />
				</p>
				<p>其中，<strong>U</strong>为方程中左端的<strong>系数矩阵</strong>，<strong>d</strong>为方程右端的<strong>常数项</strong>。当U中某行各变量系数全为零时，d中的对应行也必须为零，否则就构成了等式左右不相等的矛盾方程。因此，<strong>矩阵A和增广矩阵[A,b]的行阶梯形式U(或简化行阶梯矩阵)应当有同样的全零行</strong>，也就是<strong style="COLOR: red">两者有同样的秩</strong>，这是方程组有解的必要条件。</p>
				<p>原来的m行中只剩下<strong>r个非全零行</strong>，意味着m个<strong>方程中只有r个有效</strong>，也就是它的<strong>秩为r</strong>，m-r个全零行反映了原方程组中有<strong>m-r个是相依方程</strong>，最后U中有效的部分是r<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">×</span>n矩阵，就是r个方程和n个未知数。因为r&lt;n，这是一个欠定方程组，n个未知数(变量)中有n-r个可以任意设定，我们称这些未知数为<strong style="COLOR: red">自由变量</strong>，也可把它们称为任意常数。</p>
				<p> </p>
				<p>
						<strong>例：</strong>解下列方程组</p>
				<p>
						<img height="160" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_5equations_mLessThann_example.GIF" width="271" border="0" />
				</p>
				<p>输入系数矩阵A和常数矩阵b，求增广矩阵的简化行阶梯形式，MATLAB代码如下：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">A=[3,-4,3,2,-1;0,-6,0,-3,-3;4,-3,4,2,-2;1,1,1,0,-1;-2,6,-2,1,3];<br />b=[2;-3;2;0;1];<br />B=[A,b] </span>
						<span style="COLOR: #008000">%增广矩阵</span>
						<span style="COLOR: #800000">
								<br />[U0,V0I]=rref(B) </span>
						<span style="COLOR: #008000">%U0存放增广矩阵的简化行阶梯形式，V0I存放各行中第一个非零元素的列号</span>
						<span style="COLOR: #800000">
								<br />U=U0(1:5,1:5),d=U0(:,6) </span>
						<span style="COLOR: #008000">%从U0中取出系数矩阵的简化行阶梯形式放入U中，常数部分放到d中</span>
				</div>
				<p> </p>
				<p>运行过程如下：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">B =<br /><br />     3    -4     3     2    -1     2<br />     0    -6     0    -3    -3    -3<br />     4    -3     4     2    -2     2<br />     1     1     1     0    -1     0<br />    -2     6    -2     1     3     1<br /><br /><br />U0 =<br /><br />     1     0     1     0    -1     0<br />     0     1     0     0     0     0<br />     0     0     0     1     1     1<br />     0     0     0     0     0     0<br />     0     0     0     0     0     0<br /><br /><br />V0I =<br /><br />     1     2     4<br /><br /><br />U =<br /><br />     1     0     1     0    -1<br />     0     1     0     0     0<br />     0     0     0     1     1<br />     0     0     0     0     0<br />     0     0     0     0     0<br /><br /><br />d =<br /><br />     0<br />     0<br />     1<br />     0<br />     0<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>从U0可知，下方有<strong>两个全零行</strong>，说明原方程中有两个方程是相依的，只有<strong>三个独立方程</strong>，此时各行首非零元素不在对主角线上，列号分别为1，2，4。我们<strong>应当把x1, x2, x4看作待求的变量</strong>，而把其余的两个变量<strong>x3和x5看作自由变量</strong>。</p>
				<p>把U恢复成方程形式并移项，使左端只包含待求变量，把x3和x5移到等式右边：</p>
				<p>
						<img height="156" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_5equations_mLessThann_example_solve.GIF" width="445" border="0" />
				</p>
				<p>如果要给出一个具体解，通常取自由变量x3和x5为零，这样得出的解是x1=x2=x3=x5=0, x4=-1。但这样来表示方程的解容易造成误会，以为方程组只有一个解。所以<strong>比较严格的表示方法是取自由变量x3和x5为c1和c2</strong>:</p>
				<p>x3=c1,  x5=c2,  x1=-c1+c2,  x2=0,  x4=-c2+1</p>
				<p>这样，<strong>选择不同的c1和c2，就可以得出不同的解，所以其解有无数组</strong>。由于它包含两个自由变量，因此在两个自由度上都可以在（-<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN; mso-hansi-font-family: Arial">∞,+<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN; mso-hansi-font-family: Arial">∞）</span></span>范围内变化，从几何上说，它的<strong>解占据了一个两维空间</strong>(平面)。</p>
				<p>
						<strong>解的最后形式：</strong>
				</p>
				<p>
						<img height="201" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_5equations_mLessThann_example_solve_finalForm.GIF" width="328" border="0" />
				</p>
				<p> </p>
				<p> </p>
				<p v:shape="_x0000_s1026">
						<strong style="FONT-SIZE: 12pt; COLOR: #0000ff">5、应用实例</strong>
				</p>
				<p> </p>
				<p>(1) 平板稳态温度的计算</p>
				<p> </p>
				<p>研究一个平板的热传导问题，设该平板的周边温度已经知道（见下图），现在要确定板中间4个点a,b,c,d处的温度。假定其热传导过程已经达到稳态，因此在均匀的网格点上，各点的温度是其上下左右4个点的温度的平均值。</p>
				<p>
						<img height="175" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_11.GIF" width="229" border="0" />
				</p>
				<p>根据题意列出方程为：</p>
				<p>
						<img height="151" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_12.GIF" width="271" border="0" />
				</p>
				<p>移项整理为标准的矩阵形式为：</p>
				<p>
						<img alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_13.GIF" border="0" />
				</p>
				<p>输入MATLAB程度计算为：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A=[1,-0.25,-0.25,0;-0.25,1,0,-0.25;-0.25,0,1,-0.25;0,-0.25,-0.25,1]<br /><br />A =<br /><br />    1.0000   -0.2500   -0.2500         0<br />   -0.2500    1.0000         0   -0.2500<br />   -0.2500         0    1.0000   -0.2500<br />         0   -0.2500   -0.2500    1.0000<br /><br />&gt;&gt; b=[7.5;15;10;17.5]<br /><br />b =<br /><br />    7.5000<br />   15.0000<br />   10.0000<br />   17.5000<br /><br />&gt;&gt; U=rref([A,b])<br /><br />U =<br /><br />    1.0000         0         0         0   20.0000<br />         0    1.0000         0         0   27.5000<br />         0         0    1.0000         0   22.5000<br />         0         0         0    1.0000   30.0000<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>把它“翻译”为方程，即有：xa=20<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">℃</span><font size="2">，</font>xb=27.5<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">℃</span><font size="2">，</font>xc=22.5<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">℃</span><font size="2">，</font>xd=30<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">℃</span></p>
				<p>
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
						</span> </p>
				<p>
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
						</span> </p>
				<p>(2) 化学方程式配平</p>
				<p> </p>
				<p>
						<img height="36" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_21.GIF" width="443" border="0" />
				</p>
				<p>建立一个向量方程组，每个方程分别描述一种原子在反应前后的数目。在上面的方程中，有碳、氢、氧三种元素需要配平，构成了三个方程。而有四种物质，其数量用四个变量x1,x2,x3,x4来表示。将每种物质中的元素原子数按碳、氢、氧顺序排列，可以写出：</p>
				<p>
						<img height="99" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_22.GIF" width="356" border="0" />
				</p>
				<p>要使方程配平，x1,x2,x3,x4必须满足：</p>
				<p>
						<img height="99" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_23.GIF" width="331" border="0" />
				</p>
				<p>写成矩阵方程：</p>
				<p>
						<img height="141" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_24.GIF" width="418" border="0" />
				</p>
				<p>对A进行行阶梯变换：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; A=[3,0,-1,0;8,0,0,-2;0,2,-2,-1]<br /><br />A =<br /><br />     3     0    -1     0<br />     8     0     0    -2<br />     0     2    -2    -1<br /><br />&gt;&gt; U=rref(A)<br /><br />U =<br /><br />    1.0000         0         0   -0.2500<br />         0    1.0000         0   -1.2500<br />         0         0    1.0000   -0.7500<br /><br />&gt;&gt; </span>
				</div>
				<p> </p>
				<p>要注意这四个列对应于四个变量的系数，所以这三行系数对应的方程是：</p>
				<p>x<sub>1</sub>          -0.2500x<sub>4</sub> = 0<br />    x<sub>2</sub>      -1.2500x<sub>4</sub> = 0<br />        x<sub>3</sub>  -0.7500x<sub>4</sub> = 0</p>
				<p>即x4是自由变量。因为化学家们喜欢把方程的系数取为最小整数，此处可取x4=4，则x1,x2,x3均有整数解，x1=1, x2=5, x3=3。 </p>
				<p>对于比较复杂的反应过程，为了便于得到最小整数解，在解化学配平的线性方程组时，应该在MATLAB中先规定取有理分式格式，即先输入format rat，这样就很容易看出应令x4=4。结果为：</p>
				<div class="cnblogs_code">
						<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
						<span style="COLOR: #800000">&gt;&gt; format rat<br />&gt;&gt; U=rref(A)<br /><br />U =<br /><br />       1             0             0            -1/4     <br />       0             1             0            -5/4     <br />       0             0             1            -3/4     <br /><br />&gt;&gt;</span>
				</div>
				<p> </p>
				<p> </p>
				<p>(3) 交通流量分析</p>
				<p>某城市有两组单行道，构成了一个包含四个节点A,B,C,D的十字路口，如下图所示。在交通繁忙时段的汽车从外部进出此十字路口的流量（每小时的车流数）标于图上。现要求计算每两个节点之间路段上的交通流量x1, x2, x3, x4。</p>
				<p>
						<img height="253" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_41.GIF" width="331" border="0" />
				</p>
				<p>解：</p>
				<p>在每个节点上，进入和离开的车数应该相等，这就决定了四个节点的流通方程：</p>
				<div v:shape="_x0000_s1026">
						<div>节点A: x1+450＝x2+610 </div>
						<div>节点B: x2+520＝x3+480 </div>
						<div>节点C: x3+390＝x4+600 </div>
						<div>节点D: x4+640＝x2+310</div>
						<div> </div>
						<div>将这组方程进行整理，写成矩阵形式：</div>
						<div>
								<img height="154" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/LA_eg_42.GIF" width="276" border="0" />
						</div>
						<div> </div>
						<div>用消元法或直接调用U=rref([A,b])，得出精简行阶梯形式为：</div>
						<div>
								<div class="cnblogs_code">
										<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
										<span style="COLOR: #800000">&gt;&gt; A=[1,-1,0,0;0,1,-1,0;0,0,1,-1;-1,0,0,1]<br /><br />A =<br /><br />       1            -1             0             0      <br />       0             1            -1             0      <br />       0             0             1            -1      <br />      -1             0             0             1      <br /><br />&gt;&gt; b=[160;-40;210;-330]<br /><br />b =<br /><br />     160      <br />     -40      <br />     210      <br />    -330      <br /><br />&gt;&gt; U=rref([A,b])<br /><br />U =<br /><br />       1             0             0            -1           330      <br />       0             1             0            -1           170      <br />       0             0             1            -1           210      <br />       0             0             0             0             0      <br /><br />&gt;&gt; </span>
								</div>
						</div>
						<div> </div>
						<div>矩阵U中第1至4列代表变量x1,x2,x3和x4的系数，第5列则是等式右边的常数项。把第4列移到等式右边，可以恢复为方程，其结果为：</div>
						<div>x1 = x4 +330</div>
						<div>x2 = x4 +170</div>
						<div>x3 = x4 + 210</div>
						<div>0   = 0</div>
						<div> </div>
						<div>由于最后一行为全零，说明四个方程中实际上只有<strong>三个有效方程</strong>。方程数比未知数的数目少，即没有给出足够的信息来唯一地确定x1, x2, x3和x4，其原因也不难从物理上理解。题目给出的只是进入和离开这个十字路口的流量，如果有些车沿着这四方的单行道绕圈，并不会影响总的输入输出流量，但可以全面增加四条路上的流量。所以x4被称为自由变量。实际上它的取值也不是完全自由的，因为规定了这些路段都是单行道，x1,x2,x3和x4都不能取负值。所以要准确了解这里的交通流量情况，还应该在x1,x2,x3和x4中，再检测一个变量。</div>
				</div>
				<div id="EntryTag">Tag标签: <a href="http://www.cnblogs.com/JCSU/tag/%e8%a1%8c%e9%98%b6%e6%a2%af%e7%9f%a9%e9%98%b5/"><font color="#000080">行阶梯矩阵</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e7%ae%80%e5%8c%96%e8%a1%8c%e9%98%b6%e6%a2%af%e7%9f%a9%e9%98%b5/"><font color="#000080">简化行阶梯矩阵</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e5%af%b9%e8%a7%92%e7%9f%a9%e9%98%b5/"><font color="#000080">对角矩阵</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e9%ab%98%e6%96%af%e6%b6%88%e5%85%83%e6%b3%95/"><font color="#000080">高斯消元法</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e6%9c%89%e6%95%88%e6%96%b9%e7%a8%8b/"><font color="#000080">有效方程</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e6%ac%a0%e5%ae%9a%e6%96%b9%e7%a8%8b/"><font color="#000080">欠定方程</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e8%87%aa%e7%94%b1%e5%8f%98%e9%87%8f/"><font color="#000080">自由变量</font></a></div>
				<div id="c_jquery_test" style="DISPLAY: none">
						<font color="#000080">
						</font>
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
				<div id="digg_block">
						<div id="author_profile">
								<div class="author_profile_info">
										<div class="author_profile_info">
												<a href="http://home.cnblogs.com/JCSU/" target="_blank">
														<font color="#000080">jcsu</font>
												</a>
												<br />
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:15 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-6】直线和平面的快速绘制 </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119990.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:13:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119990.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119990.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119990.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119990.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="ctl03_TitleUrl" href="http://www.cnblogs.com/JCSU/articles/1445400.html">
						<font color="#000080">【matlab-6】直线和平面的快速绘制</font>
				</a>
		</div>
		<div class="postText">
				<p>
						<strong>原文：<a href="http://www.cnblogs.com/JCSU/articles/1445400.html">http://www.cnblogs.com/JCSU/articles/1445400.html</a></strong>
				</p>
				<p>
						<strong>一、直线的快速绘制</strong>
				</p>
				<p>对于显函数 f = f(x)<br />ezplot(f) 在默认的 -2*pi &lt; x &lt; 2*pi 范围内画出 f = f(x)<br />ezplot(f, [a,b]) 在 a &lt; x &lt; b 范围内画出 f = f(x)</p>
				<p> </p>
				<p>对于隐函数 f = f(x,y)<br />ezplot(f) 在默认的 -2*pi &lt; x &lt; 2*pi 和 -2*pi &lt; y &lt; 2*pi 范围内画出 f = f(x,y)<br />ezplot(f, [xmin,xmax,ymin,ymax]) 在 xmin &lt; x &lt; xmax 和 ymin &lt; y &lt; ymax 范围内画出 f(x,y) = 0<br />ezplot(f, [a,b]) 在 a &lt; x &lt; b and a &lt; y &lt; b 范围内画出 f(x,y) = 0</p>
				<p> </p>
				<p>如果 f 函数的变量是 u 和 v，而不是 x 和 y, 那么图的绘制端点 a, b, c 和 d 按字母顺序排列。因此<br />ezplot('u^2 - v^2 - 1',[-3,2,-2,3]) 在 -3 &lt; u &lt; 2, -2 &lt; v &lt; 3 范围内绘制 u^2 - v^2 - 1 = 0</p>
				<p> </p>
				<p>ezplot(x,y) 在默认的 0 &lt; t &lt; 2*pi 范围内绘制带参数的平面曲线 x = x(t) 和 y = y(t) <br />ezplot(x,y, [tmin,tmax]) 在默认的 tmin &lt; t &lt; tmax 范围内绘制带参数的平面曲线 x = x(t) 和 y = y(t)<br /> <br />&gt;&gt; help ezplot %具体使用方法请参考Matlab中的帮助</p>
				<p> </p>
				<p>例子：</p>
				<p>
						<img height="312" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_cos.GIF" width="450" border="0" />
				</p>
				<p>ezplot('cos(x)')</p>
				<p>
						<br />
						<img height="314" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_log.GIF" width="458" border="0" />
				</p>
				<p>ezplot('1/y-log(y)+log(-1+y)+x - 1')</p>
				<p> </p>
				<p>
						<br />
						<img height="314" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_x2y21.GIF" width="458" border="0" />
				</p>
				<p>subplot(2,1,1);<br />ezplot('x^2 + y^2 - 1',[-1.25,1.25]);<br />subplot(2,1,2);<br />ezplot('x^2 + y^2 - 1',[-1.25,1.25]); axis equal</p>
				<p> </p>
				<p> </p>
				<p>
						<img height="268" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_x32x23x5y2.GIF" width="464" border="0" />
				</p>
				<p>ezplot('x^3 + 2*x^2 - 3*x + 5 - y^2')</p>
				<p> </p>
				<p>
						<br />
						<img height="268" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_sintcost.GIF" width="464" border="0" />
				</p>
				<p>ezplot('sin(t)','cos(t)')</p>
				<p> </p>
				<p> </p>
				<p>
						<img height="268" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_x3y35xy.GIF" width="464" border="0" />
				</p>
				<p>ezplot('x^3 + y^3 - 5*x*y + 1/5',[-3,3])</p>
				<p> </p>
				<p>
						<br />
						<br />
						<img height="268" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_sin3tcostsin3tsint.GIF" width="464" border="0" />
				</p>
				<p>ezplot('sin(3*t)*cos(t)','sin(3*t)*sin(t)',[0,pi])</p>
				<p> </p>
				<p>
						<br />
						<img height="268" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_tcosttsint.GIF" width="464" border="0" />
				</p>
				<p>ezplot('t*cos(t)','t*sin(t)',[0,4*pi])</p>
				<p> </p>
				<p>
						<strong>二、平面的快速绘制</strong> </p>
				<p>ezmesh(f) 在默认的 -2*pi &lt; x &lt; 2*pi 和 -2*pi &lt; y &lt; 2*pi 范围内绘制 f(x,y)   <br />ezmesh(f,DOMAIN) 在指定范围内绘制 f(x,y)，指定范围可以是向量 [xmin,xmax,ymin,ymax] 或 [a,b] (范围为a &lt; x &lt; b, a &lt; y &lt; b)</p>
				<p>如果 f 函数的变量是 u 和 v，而不是 x 和 y, 那么图的绘制端点 umin, umax, vmin, and vmax 按字母顺序排列。因此<br />ezmesh('u^2 - v^3',[0,1,3,6]) 在 0 &lt; u &lt; 1, 3 &lt; v &lt; 6 范围内绘制u^2 - v^3</p>
				<p>ezmesh(x,y,z) 在区域 -2*pi &lt; s &lt; 2*pi and -2*pi &lt; t &lt; 2*pi 内绘制参数表面 x = x(s,t), y = y(s,t), 和 z = z(s,t)</p>
				<p>ezmesh(x,y,z,[smin,smax,tmin,tmax]) 或 ezmesh(x,y,z,[a,b]) 在指定范围绘制图形</p>
				<p>&gt;&gt; help ezmesh %具体使用方法请参考Matlab中的帮助<br /> <br />例子:</p>
				<p> </p>
				<p>
						<img height="319" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezmesh_xplusy.GIF" width="458" border="0" />
				</p>
				<p>ezmesh('x+y')</p>
				<p> </p>
				<p>
						<br />
						<img height="337" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezmesh_expscostexpssintt.GIF" width="498" border="0" />    </p>
				<p>ezmesh('exp(-s)*cos(t)','exp(-s)*sin(t)','t',[0,8,0,4*pi])</p>
				<p> </p>
				<p> f = ['3*(1-x)^2*exp(-(x^2) - (y+1)^2)' ... <br />        '- 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2)' ... <br />        '- 1/3*exp(-(x+1)^2 - y^2)'];<br />     ezmesh(f,[-pi,pi])<br />     ezmesh('x*exp(-x^2 - y^2)')<br />     ezmesh('x*y','circ')<br />     ezmesh('real(atan(x + i*y))')<br />     ezmesh('exp(-x)*cos(t)',[-4*pi,4*pi,-2,2])<br />     ezmesh('s*cos(t)','s*sin(t)','t')<br />     ezmesh('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi])<br />     h = inline('x*y - x');<br />     ezmesh(h)<br />     ezmesh(@peaks)</p>
				<p> </p>
				<p>
						<img height="317" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezplot_x1x2.GIF" width="458" border="0" /> </p>
				<p>ezplot('3*x1+2*x2+3') <br />hold on<br />ezplot('x1-2*x2+1')</p>
				<p> </p>
				<p>
						<img height="337" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/ezmesh_ezplot_x1x2.GIF" width="468" border="0" />
				</p>
				<p>ezmesh('3*x1+2*x2+3') <br />hold on<br />ezmesh('x1-2*x2+1') <br />ezplot('3*x1+2*x2+3') <br />hold on<br />ezplot('x1-2*x2+1')</p>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
				<div id="digg_block">
						<div id="author_profile">
								<div class="author_profile_info">
										<div class="author_profile_info">
												<a href="http://home.cnblogs.com/JCSU/" target="_blank">
														<font color="#000080">jcsu</font>
												</a>
												<br />
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:13 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-5】二维绘图--图形与图轴控制 </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119989.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:12:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119989.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119989.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119989.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119989.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="ctl03_TitleUrl" href="http://www.cnblogs.com/JCSU/articles/1443033.html">
						<font color="#000080">【matlab-5】二维绘图--图形与图轴控制</font>
				</a>
		</div>
		<div class="postText">
				<p>
						<strong>原文：<a href="http://www.cnblogs.com/JCSU/articles/1443033.html">http://www.cnblogs.com/JCSU/articles/1443033.html</a></strong>
				</p>
				<p>
						<strong>一、图形控制</strong>
				</p>
				<p>plot(x, y, 'CLM')</p>
				<p>
						<br />C：曲线的颜色(Colors)<br />L：曲线的格式(Line Styles)<br />M：曲线的线标(Markers)</p>
				<p> </p>
				<p>
						<img height="346" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_CLMcontrol.GIF" width="441" border="0" />
				</p>
				<p>x = 0:0.5:4*pi;  % x 向量的起始与结束元素为 0 及 4*pi, 0.5为各元素相差值<br />y = sin(x); <br />plot(x,y,'k:diamond') % 其中k代表黑色，：代表点线，而diamond则指定菱形为曲线的线标</p>
				<p> </p>
				<p>plot 指令的曲线颜色</p>
				<p>Plot指令的曲线颜色字串      曲线颜色<br />b                                  蓝色(Blue)<br />c                                  青蓝色(Cyan)<br />g                                  绿色(Green)<br />k                                  黑色(Black)<br />m                                 紫黑色(Magenta)<br />r                                   红色(Red)<br />w                                  白色<br />y                                  黃色(Yellow)</p>
				<p> </p>
				<p>plot 指令的曲线样式</p>
				<p>Plot指令的曲线样式字串     曲线样式<br />-                                  实线(默认值) <br />--                                虚线 <br />：                                点线 <br />-.                                点虚线</p>
				<p> </p>
				<p>plot 指令的曲线线标</p>
				<p>Plot指令的曲线线标字串     曲线线标<br />O                                 圆形<br />+                                 加号<br />X                                 叉号<br />*                                 星号<br />.                                 点号<br />^                                朝上三角形<br />V                                朝下三角形<br />&gt;                                朝右三角形<br />&lt;                                朝左三角形<br />square                         方形<br />diamond                      菱形<br />pentagram                   五角星形<br />hexagram                    六角星形<br />None                          无符号(默认值)</p>
				<p> </p>
				<p>
						<strong>二、图轴控制</strong>
				</p>
				<p>plot 指令会根据坐标点自动决定坐标轴范围，也可以使用axis指令指定坐标轴范围<br />使用语法：<br />axis([xmin, xmax, ymin, ymax])<br />xmin, xmax：指定 x 轴的最小和最大值<br />ymin, ymax：指定 y 轴的最小和最大值</p>
				<p> </p>
				<p>
						<img height="335" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_AxisControl_1.GIF" width="435" border="0" />
				</p>
				<p>x = 0:0.1:4*pi;<br />y = sin(x);<br />plot(x, y);<br />axis([-inf, inf, 0, 1]);  % 画出正弦波 y 轴介于 0 和 1 的部份</p>
				<p> </p>
				<p>
						<img height="291" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_AxisControl_2_ytick.GIF" width="411" border="0" />
				</p>
				<p>指定坐标轴上的网格点(Ticks)<br />x = 0:0.1:4*pi;<br />plot(x, sin(x)+sin(3*x))<br />set(gca, 'ytick', [-1 -0.3 0.1 1]); % 在 y 轴加上网格点<br />grid on % 加上网格</p>
				<p>gca：get current axis的简称，传回目前使用中的坐标轴</p>
				<p> </p>
				<p>
						<img height="296" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_AxisControl_2_ytick_yticklabel.GIF" width="435" border="0" />
				</p>
				<p>将网格点的数字改为文字<br />x = 0:0.1:4*pi;<br />plot(x, sin(x)+sin(3*x))<br />set(gca, 'ytick', [-1 -0.3 0.1 1]);  % 改变网格点<br />set(gca, 'yticklabel', {'极小', '临界值', '崩溃值', '极大'});  % 改变网格点的文字<br />grid on</p>
				<p> </p>
				<p>
						<img height="336" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/subplot.GIF" width="430" border="0" />
				</p>
				<p>在一个视窗中同时画出四个图<br />x = 0:0.1:4*pi;  <br />subplot(2, 2, 1); plot(x, sin(x));  % 左上角图形<br />subplot(2, 2, 2); plot(x, cos(x));  % 右上角图形<br />subplot(2, 2, 3); plot(x, sin(x).*exp(-x/5)); % 左下角图形<br />subplot(2, 2, 4); plot(x, x.^2);  % 右下角图形</p>
				<p> </p>
				<p>
						<img height="329" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/subplot_aspectRatio.GIF" width="461" border="0" />
				</p>
				<p>长宽比(Aspect Ratio)<br />一般图轴长宽比是视窗的长宽比, 可在axis指令后加不同的字串来修改<br />t = 0:0.1:2*pi;<br />x = 3*cos(t);<br />y = sin(t);<br />subplot(2, 2, 1); plot(x, y); axis normal %使用默认长宽比(等于图形长宽比)<br />subplot(2, 2, 2); plot(x, y); axis square %长宽比例为 1<br />subplot(2, 2, 3); plot(x, y); axis equal %长宽比例不变，但两轴刻度一致<br />subplot(2, 2, 4); plot(x, y); axis equal tight %两轴刻度比例一致，且图轴贴紧图形</p>
				<p> </p>
				<p>
						<strong>三、grid 和 box 指令</strong>
						<br />grid on  画出网格<br />grid off  取消网格<br />box on   画出图轴的外围长方形<br />box off  取消图轴的外围长方形</p>
				<p> </p>
				<p>给图形和图轴加说明文字</p>
				<p>指令         说明<br />title         图形的标题 <br />xlabel x    轴的说明 <br />ylabel y    轴的说明 <br />zlabel z    轴的说明<br />legend     多条曲线的说明 <br />text         在图形中加入文字 <br />gtext       使用滑鼠决定文字的位置</p>
				<p> </p>
				<p>
						<img height="363" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/title_legend_xylabel_1.GIF" width="526" border="0" />
				</p>
				<p>subplot(1,1,1);  <br />x = 0:0.1:2*pi;  <br />y1 = sin(x);  <br />y2 = exp(-x);  <br />plot(x, y1, '--*', x, y2, ':o');  <br />xlabel('t = 0 to 2\pi');  <br />ylabel('values of sin(t) and e^{-x}')  <br />title('Function Plots of sin(t) and e^{-x}');  <br />legend('sin(t)','e^{-x}');</p>
				<p>「\」为特殊符号，产生上标、下标、希腊字母、数学符号等</p>
				<p> </p>
				<p>
						<img height="363" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/title_legend_xylabel_2_text.GIF" width="521" border="0" />
				</p>
				<p>text指令<br />text(x, y, string) <br />x、y ：文字的起始座标位置<br />string ：代表此文字<br />x = 0:0.1:2*pi;<br />plot(x, sin(x), x, cos(x));<br />text(pi/4, sin(pi/4),'\leftarrow sin(\pi/4) = 0.707');<br />text(5*pi/4, cos(5*pi/4),'cos(5\pi/4) = -0.707\rightarrow', 'HorizontalAlignment', 'right');</p>
				<p>「HorizontalAlignment」及「right」将文字向右水平靠齐</p>
				<p> </p>
				<p> </p>
				<p>
						<strong>四、各种二维绘图指令</strong>
						<br />
				</p>
				<p>指令                说明<br />errorbar           在曲线加上误差范围<br />fplot、ezplot     较精确的函数图形<br />polar、ezpolar   极座标图形<br />hist              直角座标直方图(累计图)<br />rose             极座标直方图(累计图)<br />compass       罗盘图<br />feather         羽毛图 <br />area             面积图<br />stairs           阶梯图</p>
				<p>
						<br />
						<img height="303" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/2d_errorbar.GIF" width="450" border="0" />
				</p>
				<p>已知资料的误差范围，用 errorbar 表示。以 y 坐标高度 20% 作为资料的误差范围<br />x = linspace(0,2*pi,30); % 在 0 到 2 之间，等分取 30 个点<br />y = sin(x);<br />e = y*0.2;<br />errorbar(x,y,e)  % 图形上加上误差范围 e</p>
				<p> </p>
				<p>
						<img height="337" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/2d_fplot.GIF" width="473" border="0" />
				</p>
				<p>fplot 指令：对剧烈变化处进行较密集的取样<br />fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是绘图范围</p>
				<p> </p>
				<p>
						<img height="261" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/2d_polar.GIF" width="278" border="0" />
				</p>
				<p>theta = linspace(0, 2*pi);    <br />r = cos(4*theta);   <br />polar(theta, r);  % 进行极坐标绘图</p>
				<p> </p>
				<p>
						<img height="288" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/2d_hist.GIF" width="440" border="0" />
				</p>
				<p>将 10000 个由 randn 产生的正规分布之随机数分成 25 堆<br />x = randn(10000, 1);  % 产生 10000 个正规分布随机数<br />hist(x, 25);  % 绘出直方图，显示 x 资料的分布情况和统计特性，数字 25 代表资料依大小分堆的堆数，即是指方图内长条的个数<br />set(findobj(gca, 'type', 'patch'), 'edgecolor', 'w');% 将长条图的边缘设定成白色</p>
				<p> </p>
				<p>
						<img height="335" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/2d_regPoly.GIF" width="351" border="0" />
				</p>
				<p>试写一函数 regpoly(n)，其功能是画出一个圆心在 (0, 0)、半径为 1 的圆，并在圆内画出一个内接正 n 边形，其中一顶点位于 (0, 1)。</p>
				<p>regpoly.m文件：</p>
				<p>function regpoly(n)<br />vertices=[1];<br />for i=1:n<br /> step=2*pi/n;<br /> vertices=[vertices, exp(i*step*sqrt(-1))];<br />end<br />plot(vertices, '-o');<br />axis image<br />% 画外接圆<br />hold on<br />theta=linspace(0, 2*pi);<br />plot(cos(theta), sin(theta), '-r');<br />hold off<br />axis image</p>
				<p> </p>
				<p>
						<img height="303" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/2d_plotParam.GIF" width="483" border="0" />
				</p>
				<p>一条参数式的曲线可由下列方程式表示： <br />x = sin(t), y = 1 - cos(t) + t/10 <br />当 t 由 0 变化到 4*pi 时，请写一个 MATLAB 的脚本 plotParam.m，画出此曲线在 XY 平面的轨迹。 <br />t = linspace(0, 4*pi);<br />x = sin(t);<br />y = 1-cos(t)+t/10;<br />plot(x, y, '-o');</p>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
				<div id="digg_block">
						<div id="author_profile">
								<div class="author_profile_info">
										<div class="author_profile_info">
												<a href="http://home.cnblogs.com/JCSU/" target="_blank">
														<font color="#000080">jcsu</font>
												</a>
												<br />关注 - 1<br />粉丝 - 2<br /></div>
								</div>
								<div class="clear">
								</div>
								<div id="author_profile_follow">
										<a onclick="login();return false;" href="javascript:void(0);">
												<font color="#000080" size="2">关注博主</font>
										</a>
								</div>
						</div>
						<div id="div_digg">
								<div class="diggit" onclick="DiggIt(1443033,29519,1)">
										<span class="diggnum" id="digg_count_1443033">
												<font color="#075db3">0</font>
										</span>
								</div>
								<div class="buryit" onclick="DiggIt(1443033,29519,2)">
										<span class="burynum" id="bury_count_1443033">
												<font color="#075db3">0</font>
										</span>
								</div>
								<div class="clear">
								</div>
								<span id="span_isdigged_1443033" style="DISPLAY: none">
										<font size="2">0</font>
								</span>
								<div class="diggword" id="digg_word_1443033">(请您对文章做出评价)</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:12 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-4】函数、二维平面绘图 </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119988.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:11:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119988.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119988.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119988.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119988.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="ctl03_TitleUrl" href="http://www.cnblogs.com/JCSU/articles/1442960.html">
						<font color="#000080">【matlab-4】函数、二维平面绘图</font>
				</a>
				<br />
		</div>
		<div class="postText">
				<div v:shape="_x0000_s1026">
						<div>
								<br />原文：<a href="http://www.cnblogs.com/JCSU/articles/1442960.html">http://www.cnblogs.com/JCSU/articles/1442960.html</a><br /><br />常用数学函数：</div>
						<div>&gt;&gt; y = abs(x) % 取 x 的绝对值 </div>
						<div>&gt;&gt; y = sin(x)   % 取 x 的正弦值 </div>
						<div>&gt;&gt; y = exp(x) % 自然指数 exp(x) </div>
						<div>&gt;&gt; y = log(x) % 自然对数 ln(x) </div>
						<div>
						</div>
				</div>
				<div v:shape="_x0000_s1026">
						<div> </div>
						<div>向量矩阵的运算：</div>
						<div>&gt;&gt; y = min(x)   % 向量 x 的极小值 </div>
						<div>&gt;&gt; y = max(x)  % 向量 x 的极大值 </div>
						<div>&gt;&gt; y = mean(x)    % 向量 x 的平均值 </div>
						<div>&gt;&gt; y = sum(x)  % 向量 x 的总和 </div>
						<div>&gt;&gt; y = sort(x)  % 向量 x 的排序</div>
						<div> </div>
						<div>
								<div v:shape="_x0000_s1026">
										<div>二维平面绘图：</div>
										<div>
												<img height="328" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot1.GIF" width="437" border="0" />
										</div>
										<div>x = linspace(0, 2*pi); % 在 0 到 2π 间，等分取 100 个点  </div>
										<div>y = sin(x); %计算 x 的正弦函数值  </div>
										<div>plot(x, y); % 进行二维平面描点作图</div>
										<div> </div>
										<div v:shape="_x0000_s1026">
												<div> </div>
												<div>
														<img height="247" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot3.GIF" width="356" border="0" />
												</div>
												<div>x = linspace(0, 2*pi);  % 在 0 到 2 间，等分取 100 个点 </div>
												<div>plot(x, sin(x), x, cos(x), x, sin(x)+cos(x));  % 进行多条曲线描点作图</div>
										</div>
										<div> </div>
										<div> </div>
										<div>
												<img height="248" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_MultiLine_marker.GIF" width="350" border="0" />
										</div>
										<div>
												<div v:shape="_x0000_s1026">
														<div>x = linspace(0, 2*pi); % 在 0 到 2 间，等分取 100 个点 </div>
														<div>plot(x, sin(x), 'o', x, cos(x), 'x', x, sin(x)+cos(x), '*');</div>
														<div> </div>
														<div> </div>
														<div>
																<img height="248" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_oneVector_49x49.GIF" width="345" border="0" />
														</div>只给定一个矩阵 y 
<div>y = peaks;  % 产生一个 49×49 的矩阵  
<div v:shape="_x0000_s1026"><div>plot(y);  % 对矩阵 y 的每一个行向量作图</div><div> </div><div> </div><div><img height="249" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_twoVector_49x49.GIF" width="349" border="0" /></div><div>x 和 y 都是矩阵</div><div><div v:shape="_x0000_s1026"><div>x = peaks;  </div><div>y = x';  % 求矩阵 x 的转置矩阵 x' </div><div>plot(x, y);  % 取用矩阵 y 的每一行向量，与对应矩阵 x 的每一个行向量作图</div><div> </div><div><div v:shape="_x0000_s1026"><div>提示：</div><div>一般情况下，MATLAB 将矩阵视为行向量的集合 </div><div>对只能处理向量的函数(Ex : max、min、 mean) 给定一个矩阵，函数会对矩阵的行向量一一进行处理或运算 </div><div> </div><div> </div><div><img height="331" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_RealImageMatrix.GIF" width="387" border="0" /></div><div>Z是一个复数向量或矩阵。  
<div v:shape="_x0000_s1026"><div>plot(z) 将 z 的实部(即 real(z))和虚部(即 imag(z))当成 x 座标和 y 座标來作图，其效果等于 plot(real(z), imag(z))</div></div></div><div><div v:shape="_x0000_s1026"><div>x = randn(30);  % 产生 30×30 的随机数(正規分布)矩阵 </div><div>z = eig(x);  % 计算 x 的特征值 </div><div>plot(z, 'o') </div><div>grid on  % 画出网格</div></div></div><div> </div><div> </div><div><div v:shape="_x0000_s1026">基本二维绘图指令</div></div><div>  
<table dir="ltr" height="165" cellspacing="0" cellpadding="0" width="549"><tbody><tr><td width="101" height="30"><div>指令</div></td><td height="30"><div>说明</div></td></tr><tr><td width="101"><div>Plot</div></td><td><div>x 轴和 y 轴均为线性刻度(Linear Scale) </div></td></tr><tr><td width="101"><div>loglog</div></td><td><div>x 轴和 y 轴均为对数刻度(Logarithmic Scale)</div></td></tr><tr><td width="101" height="30"><div>semilogx</div></td><td height="30"><div>x 轴为对数刻度，y 轴为线性刻度 </div></td></tr><tr><td width="101" height="30"><div>semilogy</div></td><td height="30"><div>x 轴为线性刻度，y 轴为对数刻度 </div></td></tr><tr><td width="101" height="30"><div>plotyy</div></td><td height="30"><div>画出两个刻度不同的 y 轴 </div></td></tr></tbody></table></div><div> </div><div><div v:shape="_x0000_s1026"><div> </div><div><img height="331" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_semilogx.GIF" width="402" border="0" /></div><div>x = linspace(0, 8*pi); </div><div>semilogx(x, sin(x));    % 使 x 轴为对数刻度，并对其正弦函数作图</div><div> </div><div><div v:shape="_x0000_s1026"><div> </div><div><img height="243" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/plot_plotyy.GIF" width="353" border="0" /></div><div>x = linspace(0, 2*pi); </div><div>y1 = sin(x); </div><div>y2 = exp(-x); </div><div>plotyy(x, y1, x, y2);   % 画出两个刻度不同的 y 轴，分別是 y1, y2</div></div></div><div> </div></div></div></div></div></div></div></div></div></div>
										</div>
								</div>
						</div>
				</div>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
				<div id="digg_block">
						<div id="author_profile">
								<div class="author_profile_info">
										<div class="author_profile_info">
												<a href="http://home.cnblogs.com/JCSU/" target="_blank">
														<font color="#000080">jcsu</font>
												</a>
												<br />关注 - 1<br />粉丝 - 2<br /></div>
								</div>
								<div class="clear">
								</div>
								<div id="author_profile_follow">
										<a onclick="login();return false;" href="javascript:void(0);">
												<font color="#000080" size="2">关注博主</font>
										</a>
								</div>
						</div>
						<div id="div_digg">
								<div class="diggit" onclick="DiggIt(1442960,29519,1)">
										<span class="diggnum" id="digg_count_1442960">
												<font color="#075db3">0</font>
										</span>
								</div>
								<div class="buryit" onclick="DiggIt(1442960,29519,2)">
										<span class="burynum" id="bury_count_1442960">
												<font color="#075db3">0</font>
										</span>
								</div>
								<div class="clear">
								</div>
								<span id="span_isdigged_1442960" style="DISPLAY: none">
										<font size="2">0</font>
								</span>
								<div class="diggword" id="digg_word_1442960">(请您对文章做出评价)</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:11 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-3】向量与矩阵 </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119987.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:05:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119987.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119987.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119987.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119987.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="ctl03_TitleUrl" href="http://www.cnblogs.com/JCSU/articles/1442934.html">
						<font color="#000080">【matlab-3】向量与矩阵</font>
				</a>
		</div>
		<div class="postText">
				<div class="O" style="FONT-SIZE: 14pt" v:shape="_x0000_s1026">
						<div>
								<div v:shape="_x0000_s1026">
										<p>
												<span style="FONT-SIZE: 10pt">原文：<a href="http://www.cnblogs.com/JCSU/articles/1442934.html">http://www.cnblogs.com/JCSU/articles/1442934.html</a></span>
										</p>
										<p>
												<span style="FONT-SIZE: 10pt">Matlab中的变量可用来储存向量(Vectors)及矩阵(Matrix)以进行各种运算, 例如：</span>
										</p>
										<p>
												<img height="113" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/vector_1.GIF" width="382" border="0" />
										</p>
										<p>
												<span style="FONT-SIZE: 10pt">
												</span> </p>
										<p>
												<span style="FONT-SIZE: 10pt">Matlab亦可取出向量中的一个元素或一部份来做运算, 例如：</span>
										</p>
										<p>
												<img height="322" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/vector_2.GIF" width="382" border="0" /> </p>
										<p> </p>
										<p>
												<span style="FONT-SIZE: 10pt">在每一橫列结尾加上分号(:), 例如：</span>
										</p>
										<p>
												<img height="154" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/vector_3.GIF" width="415" border="0" />
										</p>
										<p> </p>
										<p>
												<span style="FONT-SIZE: 10pt">MxN矩阵的各种处理, 例如：</span>
										</p>
										<p>
												<img height="399" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/vector_4.GIF" width="489" border="0" />
										</p>
										<p>
												<img height="438" alt="" src="http://images.cnblogs.com/cnblogs_com/jcsu/matlab/vector_5.GIF" width="447" border="0" />
										</p>
								</div>
						</div>
				</div>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
				<div id="digg_block">
						<div id="author_profile">
								<div class="author_profile_info">
										<div class="author_profile_info">
												<a href="http://home.cnblogs.com/JCSU/" target="_blank">
														<font color="#000080">jcsu</font>
												</a>
												<br />关注 - 1<br />粉丝 - 2<br /></div>
								</div>
								<div class="clear">
								</div>
								<div id="author_profile_follow">
										<a onclick="login();return false;" href="javascript:void(0);">
												<font color="#000080" size="2">关注博主</font>
										</a>
								</div>
						</div>
						<div id="div_digg">
								<div class="diggit" onclick="DiggIt(1442934,29519,1)">
										<span class="diggnum" id="digg_count_1442934">
												<font color="#075db3">0</font>
										</span>
								</div>
								<div class="buryit" onclick="DiggIt(1442934,29519,2)">
										<span class="burynum" id="bury_count_1442934">
												<font color="#075db3">0</font>
										</span>
								</div>
								<div class="clear">
								</div>
								<span id="span_isdigged_1442934" style="DISPLAY: none">
										<font size="2">0</font>
								</span>
								<div class="diggword" id="digg_word_1442934">(请您对文章做出评价)</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:05 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-2】Matlab语法 </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119985.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:03:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119985.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119985.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119985.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119985.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="ctl03_TitleUrl" href="http://www.cnblogs.com/JCSU/articles/1121474.html">【matlab-2】Matlab语法</a>
		</div>
		<div class="postText">
				<p>原文：<a href="http://www.cnblogs.com/JCSU/articles/1121474.html">http://www.cnblogs.com/JCSU/articles/1121474.html</a><br /><br /><strong style="COLOR: #000080">第一节 基本<font face="Verdana">数值计算</font><br /></strong><br />1. 变量：分为数值变量和字符变量<br /><br />2. 常量：计算机中不变的量。如i、j、pi、NaN(不确定)、Inf(无穷大)<br /><br />3. 字符变量：将字符串作为变量。有三种方法表示：<br />    (1) 用单引号' '<br />    (2) 用函数sym(' ')<br />    (3) 用命令symbs<br /><br />4. 举例 <br />    x=2                    % 将2赋给变量x<br />    y=3<span style="COLOR: red">;</span>                   % 有;表示在命令窗口不显示y的值<br />    z=x^2 -y            % 数值计算。输出结果为1<br /><br />    f='sin(x)'             % 用单引号定义一个字符变量<br />    g=sym('cos(y)')    % 用函数sym(' ')定义一个字符变量<br />    syms a b              % 用命令syms定义字符变量。一般用于多符号变量的定义<br />    u=2*a                 % 字符计算。输出结果为2*a<br />    w=b^2-1             % 字符计算。输出结果为b^2-1<br />    <span style="BACKGROUND-COLOR: yellow">fg=f+g                % 字符计算。输出结果为sin(x)+cos(y)<br /></span>    uw=u*w              % 字符计算。输出结果为2*a*(b^2-1)<br />    u/w                     % 字符计算。输出结果为2*a/(b^2-1)<br /><br /><br /><span style="COLOR: #000080"><strong>第二节 矩阵构造及运算</strong></span><br /><br />     Matlab中数据的结构形式就是一个矩阵。如x=2是一个1×1的矩阵<br /><br />    <strong>1. 矩阵的建立<br /></strong><br />        (1) 直接输入法。<br />        (2) 冒号法(1×N)。<br />        (3) 函数法(特殊矩阵)。<br />        (4) 矩阵的编辑(Array Editor)。<br /><br />    <strong>2. 向量<br /><br /></strong>        <span style="BACKGROUND-COLOR: yellow">向量是1×N的特殊矩阵</span>，即只有一行或者一列，称为N维向量。<br /><br />    <strong>3. 向量的点积与叉积<br /><br /></strong>        点积：dot(A,B)<br />        叉积：cross(A,B)<br /><br />    <strong>4. 举例：</strong><br /><br />        x=[1 2 3; 4 5 6; 7 8 9]     % [...]，元素之间用空格，行之间用分号。<br />        y=0<strong>:</strong> 0.1 <strong>:</strong>1                     % 不用[...]，初值、步长、终值间用冒号。<br />        w=eye(3)                        % 3阶<span style="BACKGROUND-COLOR: yellow">单位矩阵</span>。<br />        u=rand(3)                       % 3阶随机矩阵。元素在0-1之间。<br />        u1=rand(2, 3)                 % 2*3阶随机矩阵。元素在0-1之间。<br />        q=randn(3)                     % 3阶<span style="BACKGROUND-COLOR: yellow">随机矩阵</span>。元素在0-1之间。<span style="BACKGROUND-COLOR: yellow">元素符合正态分布</span>。<br />        q1=randn(2, 3)                % 2*3阶随机矩阵。元素在0-1之间。元素符合正态分布。<br />        s=magic(3)                      % <span style="BACKGROUND-COLOR: yellow">魔方阵</span>。各行各列以及对角元素的和相等。<br />        ss=zeros(3)                    % 3阶<span style="BACKGROUND-COLOR: yellow">全零阵</span>。<br />        uu=ones(3)                     % 3阶<span style="BACKGROUND-COLOR: yellow">全1阵</span>。</p>
				<p>    <strong>5. 矩阵的加、减、乘、除</strong><br /><br />        (1) 参与加、减运算的矩阵必须同维<br />        (2) <span style="BACKGROUND-COLOR: yellow">A/B时，A、B列数必须相同。A\B时，A、B行数必须相同。</span><br />        (3) 矩阵左乘与右乘不同，左除与右除不同。(<span style="BACKGROUND-COLOR: yellow">A*B不等于B*A</span>，A\B不等于A/B)。<br />        (4) 标量或函数与矩阵的运算等于该标量或函数与矩阵的每一个元素的运算。<br /><br />    <strong>6. 对矩阵的操作<br /></strong><br />        6.1 对矩阵的元素操作：<br /><br />        (1) 提取矩阵A的第n行第m列的元素，表示为A(n, m)<br />        (2) 提取矩阵A的第n行的所有元素，表示为A(n, :)<br />        (3) 提取矩阵A的第m列的所有元素，表示为A(:, m)<br />        (4) 将矩阵A的第n行第m列的元素重新赋值b，表示为A(n, m)=b<br />        (5) 将矩阵A的第n行的所有元素重新赋值b，表示为A(n, :)=b<br />        (6) 将矩阵A的第m列的所有元素重新赋值b，表示为A(:, m)=b<br />        (7) 将矩阵A的第n行第m列的元素删除，表示为A(n, m)=[ ]<br />        (8) 将矩阵A的第n行的所有元素删除，表示为A(n, :)=[ ]<br />        (9) 将矩阵A的第m列的所有元素删除，表示为A(:, m)=[ ]<br /><br />        6.2 矩阵的部分操作：<br /><br />        Fliplr(A)             % 矩阵左右翻转<br />        Flipud(A)           % 矩阵上下翻转<br />        Flipdim(A, m)     % 矩阵沿特定维(m)翻转<br />        Rot90(A, k)       % 矩阵逆时针旋转k*90度<br />        Tiag(A, k)          % 取矩阵对角线元素<br />        Tril(A, k)            % 取矩阵的下三角部分<br />        Triu(A, k)           % 取矩阵的上三角部分<br />        注：k可以是正、负整数，但绝对值一般不大于矩阵的维数。<br /><br />        6.3 矩阵分析操作：<br /><br />        (1) 方阵A的行列式值，可表达为 det(A)<br />        (2) 矩阵A的秩，可表达为 rank(A)<br />        (3) 行列式值不为堆的方阵A，求逆矩阵可表达为 inv(A)<br />        (4) 矩阵A的转置阵，可表达为 A'<br />        (5) 矩阵A的特征向量与特征值：[V, D]=eig(A)。其中V和D分别为A的特征向量和特征值<br /><br />        6.4 矩阵的数组运算：<br /><br />        矩阵乘：A*B。A的列数与B的行数要相等。<br />        矩阵的数组乘：A.*B。表示为A、B矩阵的对应元素一一相乘，即Aij * Bij。A与B的维度要相同。<br />        矩阵的数组除：A./B或者A.\B<br />        举例：x=-10 : 2 :10<br />                y=sin(x)          % correct<br />                y=sin(x^2)      % incorrect - Matrix x must be square<br />                y=sin(x.^2)     % correct<br /><br />        6.5 矩阵元素的关系运算与逻辑运算(与、或、非)<br />        &lt;        小于<br />        &gt;        大于<br />        &lt;=      小于或等于<br />        &gt;=      大于或等于<br />        ==      等于<br />        ~=      不等于<br /><br />        6.6 矩阵的多维数组形式<br /><br />        (1) 函数cat的使用<br />        (2) B=cat(dim, a1, a2,...)<br />        (3) 意义：将多个同维数组a1, a2,...构成一个高维数组B。dim是高维数组B的维数。<br />                      它必须等于或大于a1, a2,...的阶次<br />        举例：a=[1 2 3 ; 2 3 4 ; 3 5 6]<br />                b=a+10                            % 新构成一个矩阵<br />                a(:, :, 2)=b                        % 将新矩阵赋给a的第二层<br />                a(:, :, 1)                            % 显示a的第一层<br />                c=cat(3, a, b)                     % 用函数来构成高维数组<br /><br />        6.7 多项式及其运算式<br /><br />        多项式的创建：<br />        (1) 由1×N的N维向量<br />             P=[a<sub>0  </sub>a<sub>1  </sub>a<sub>2 … </sub>a<sub>n</sub>] 表示 P<sub>n</sub>=a<sub>0</sub>x<sup>n</sup> + a<sub>1</sub>x<sup>n-1 </sup>+ a<sub>2</sub>x<sup>n-2</sup>+ .. +a<sub>n多项式。<br />          <br />          </sub>(2) 由函数poly(A)定义<br />             如果A为二维或以上的矩阵，poly(A)表示由A的特征根确定的多项式。如果A为一维矩阵<br />             poly(A)表示由A的元素为多项式的根确定的多项式。<br />        举例：<br />        %方法一<br />        p=[1 -2 3]    %直接给出多项式p<br />        poly2sym(p)  %给出p多项式的表达式<br />        %方法二<br />        a=[1 2; -2 4]        <br />        ps=poly(a)            % 计算a的特征根确定的多项式<br />        poly2sym(ps)        % 给出ps多项式的表达式<br />        %方法三<br />        x=[-1 2]<br />        px=poly(x)        % 以x的元素为多项式的根确定的多项式<br />        poly2sym(px)     % 给出ps多项式的表达式</p>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:03 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【matlab-1】工具箱、窗口、变量的存储与加载、帮助 </title><link>http://www.cppblog.com/erran/archive/2010/07/10/119984.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:01:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119984.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119984.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119984.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="ctl03_TitleUrl" href="http://www.cnblogs.com/JCSU/articles/1121189.html">
						<font color="#000080">【matlab-1】工具箱、窗口、变量的存储与加载、帮助</font>
				</a>
				<br />
		</div>
		<div class="postText">
				<p>
						<strong>
								<span style="COLOR: #000080">
										<strong>原文：<a href="http://www.cnblogs.com/JCSU/articles/1121189.html">http://www.cnblogs.com/JCSU/articles/1121189.html</a><br /><br /><br />1. MatLab的工具箱子(Toolboxes)</strong>
								</span>
								<br />
						</strong>
						<br />    (1) 应用数学类<br />    (2) 电子技术类<br />    (3) 图形图象技术<br />    (4) 通讯<br />    (5) 财经与金融<br />    (6) 类神经网络<br />    (7) 自动控制类<br />    (8) 信号分析<br /><br /><br /><strong style="COLOR: #000080">2. MatLab中常见的用户界面窗口<br /></strong><br />    (1) 命令窗口(Command Window)<br />    (2) 历史命令窗口(History Command Window)<br />    (3) 当前目录窗口(Current Directory)<br />    (4) 起始面板窗口(Lauch Pad)<br />    (5) 工作空间窗口(Workspace)<br />    (6) M文件编辑窗(M-File)<br />    (7) 图形文件编辑窗(Figure)<br />    (8) 用户图形界面设计窗(GUI)<br />    (9) 仿真模型编辑窗(Model)<br /><br /><br /><strong><span style="COLOR: #000080"><strong>3. 工作空间变量的存储与加载</strong><br /></span></strong><br />    Clc                         清除一页命令窗口<br />    Clf                          清除图形窗口内容<br />    Clear                       清除工作空间的所有变量<br />    Clear a b                 清除工作空间的a、b变量<br />    Save                       存工作空间的所有变量到默认二进制文件matlab.mat中<br />    Save data                存工作空间的所有变量到名为data.mat的二进制文件中<br />    Save data x y z        存工作空间名为x、y、z变量到名为data.mat的二进制文件中<br />    Load data                将数据文件data中的变量加载到工作空间<br /><br />    注：以上工作空间的数据文件操作都在当前目录Matlab\work中进行。 <br /><br /><br /><strong style="COLOR: #000080">4. 使用Matlab的帮助<br /></strong><br />    helpwin /helpdesk /doc /help     列出帮助文档<br />    menu -&gt; help -&gt; demos    演示帮助              <br />    help + 函数名(类名)            列出指定函数或类的帮助信息<br />    lookfor + 字符串                查找具有指定字符串的函数或类的信息<br />    exist                     变量检查<br />    what                    目录中文件列表<br />    who                      内存变量列表<br />    whos                    内存变量详细信息<br />    which                   确定文件位置。如：which a.mat(.mat指数据文件) which a(a默认为m文件) <br /></p>
				<div id="EntryTag">Tag标签: <a href="http://www.cnblogs.com/JCSU/tag/matlab/"><font color="#000080">matlab</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e7%aa%97%e5%8f%a3/"><font color="#000080">窗口</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e7%95%8c%e9%9d%a2/"><font color="#000080">界面</font></a>,<a href="http://www.cnblogs.com/JCSU/tag/%e5%b8%ae%e5%8a%a9/"><font color="#000080">帮助</font></a></div>
				<div id="c_jquery_test" style="DISPLAY: none">
				</div>
				<script type="text/javascript"><![CDATA[
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
]]&gt;</script>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:01 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>matlab混合编程向导(vc,vb,.net...)</title><link>http://www.cppblog.com/erran/archive/2010/07/10/119983.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 10 Jul 2010 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/10/119983.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119983.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/10/119983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119983.html</trackback:ping><description><![CDATA[
		<h1 class="contents_header">matlab混合编程向导(vc,vb,.net...)</h1>
		<!-- 作者信息等 -->
		<div class="contents_info">作者：<a href="http://www.cnblogs.com/dayouluo/" target="_blank">dayouluo(.Net学生)</a>  来源：<a href="http://www.cnblogs.com/" target="_blank">博客园</a>  发布时间：2005-01-19 14:25  阅读：7318 次  <a href="http://www.cnblogs.com/dayouluo/archive/2005/01/19/94183.html" target="_blank">原文链接</a>   <a class="graylink" href="javascript:add_to_wz()">[收藏]</a>   </div>
		<!-- 页码和简介 -->
		<div class="contents_main">
				<div class="content_words" id="ArticleCnt" style="FONT-SIZE: 14px">
						<p>发信人: xxhn (小湖南), 信区: MathTools       <br />标  题: matlab混合编程向导(vc,vb,.net...) <br />发信站: BBS 水木清华站 (Fri May 23 09:32:12 2003), 转信 </p>
						<p>一.matlab与vc混编 <br />1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用： <br />   这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2) <br />   vc的设置请参看精华区x-6-1-4-3-5，通过这种设置可以调用c math library和c++ <br />   math library,C++ mathlib的pdf在精华区x-6-1-10里 <br />2.通过matlab的combuilder将m文件做成com组件，供vc调用 <br />   参看精华区x-6-1-5 <br />3.通过matcom: <br />   这个mathworks公司已经不在出新版本了，而且他的功能可能用第1和第2种方法代替 <br />   推荐使用前两种方式,matcom的使用精华区有一部分，从x-6-1-4下找 </p>
						<p>二.matlab与vb混编 <br />1.mathworks公司专为vb开发了一个com组件:matrixvb，里面有大量的数学函数. <br />   这个组件需要另装，请在安装盘上或网上下载，注册码参看精华区x-6-1-3-8 <br />   装好这个组件后，他自带了两个pdf文件，用法及其能用的函数全在上面，推荐阅读 <br />   这两个pdf文件,精华区的位置是x-6-1-4-6 <br />2.通过matlab的combuilder将m文件做成com组件，供vb调用 <br />   参看精华区x-6-1-5 </p>
						<p>三.matlab与.net混编 <br />   在6.1版本以前一直没有这方面的讨论，用mcc编成dll或cpp,c文件应该可以，由于 <br />   .net调用com组件很方便，推荐使用通过matlab的combuilder将m文件做成com组件，供 <br />   .net调用，参看精华区x-6-1-5 </p>
						<p>四.试试通过matlab的combuilder做成com组件的方式实现混编，这也是mathworks公司 <br />推荐的方法,他不受语言和编译器的局限，相信高版本的matlab将在这方面有更大的改进 <br />这方面的介绍参看精华区x-6-1-5 </p>
						<p>五.其他的语言或编译器与matlab混编 <br />    精华区x-6-1-4里有一些相关的介绍，不全，还请用过的大侠总结这方面的内容。 <br />如果此编译器能调用com组件，那么也能通过matlab的combuilder将m文件做成com组件， <br />供他们调用的方法 </p>
						<p>六.matlab调用外部dll(动态链接库等) <br />参看精华区x-6-1-4-9 </p>
						<p>七.混编的一些常见问题FAQ <br />1.mcc编译m文件出现这样的错误提示（例）: <br />Error: File "psf3" is a script M-file and cannot be compiled with the <br />current Compiler. <br />matlab complier不能编译script M-file，请将script M-file转成function m-file <br />最简单的一个转法是:如果你的m文件叫a.m,在开头加上一句: function a <br />推荐精华区x-6-1-4-12文章 <br />2.mxArray,mwArray转double或其他的类型 <br />参看精华区x-6-1-4-3-7和8 <br />3.在vc下调用toolbox中的有些函数会出现问题 <br />参看精华区x-6-1-4-3-9，这种问题还没有很好的解决方法 <br />4.lib /def:libmmfile.def /out:libmmfile.lib /machine:ix86是什么意思？ <br />这是调用VC的编译器lib.exe,从def文件导出lib文件，以实现对dll的调用 <br />这是dos下的命令行。matlab的高版本已经不需要这么用了，它的lib文件全在 <br />&lt;matlabroot&gt;/extern/lib/win32里，根据各个编译器的不同，此文件夹里还有分类的 <br />文件夹。 <br />5.我在Vc中选择新建一个matlab工程，可是最后一步确定的时候总是弹出一个窗口说  <br />MSDEV.EXE应用程序错误."0x528aa3003指令”  <br />引用的“0x52880000"内存.该内存不能为”written“? <br />这种情况是matlab的addin不能用，没有太好的解决方法，所以只能改用mcc <br />来代替addin了 <br />6.matlab下生成的exe文件，怎么拿到没有matlab的机器上运行？ <br />参看精华区x-6-1-8 </p>
						<p>-- <br /> come on,baby! </p>
						<p>
								<br />※ 修改:·xxhn 于 May 26 20:03:05 修改本文·[FROM:  202.113.40.222] <br />※ 修改:·xxhn 于 Jun 13 19:07:26 修改本文·[FROM:  202.113.35.162] <br />※ 修改:·xxhn 于 Jun 20 09:37:24 修改本文·[FROM:  202.113.38.250] <br />※ 修改:·xxhn 于 Jun 28 12:48:42 修改本文·[FROM:    202.113.41.0] <br />※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.113.35.191] <br /></p>
				</div>
				<p align="right">
				</p>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-10 18:00 <a href="http://www.cppblog.com/erran/archive/2010/07/10/119983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:学习Linux编程开发必读书籍</title><link>http://www.cppblog.com/erran/archive/2010/07/01/119105.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 01 Jul 2010 12:24:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/07/01/119105.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/119105.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/07/01/119105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/119105.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/119105.html</trackback:ping><description><![CDATA[
		<div class="tit">
				<font size="2">

（转）学习Linux编程开发必读书籍</font>
		</div>
		<div class="date">
				<font size="2">2010-06-25  15:07</font>
		</div>
		<div id="blog_text" class="cnt">
				<div class="article">
						<div class="resizeimg">
								<div class="resizeimg2">
										<div class="resizeimg3">
												<div class="resizeimg4">
														<p>
																<font size="2">假设你是计算机科班出身，计算机系的基本课程如数据结构、操作系统、体系结构、编译原理、计算机网络你全修过<br />
我想大概可以分为4个阶段，水平从低到高<br />
从安装使用=&gt;linux常用命令=&gt;linux系统编程=&gt;内核开发阅读内核源码<br />
其中学习linux常用命令时就要学会自己编译内核，优化系统，调整参数<br />
安装和常用命令书太多了，找本稍微详细点的就ok，其间需要学会正则表达式<br />
系统编程推荐《高级unix环境编程》，黑话叫APUE<br />
还有《unix网络编程》<br />
这时候大概还需要看资料理解elf文件格式，连接器和加载器，cmu的一本教材中文名为《深入理解计算机系统》比较好<br />
内核开发阅读内核源码阶段，从写驱动入手逐渐深入linux内核开发<br />
参考书如下《linux device drivers》，黑话叫ldd<br />
《linux kernel development》，黑话叫lkd<br />
《understading the linux kernel》，黑话叫utlk<br />
《linux源码情景分析》<br />
这四本书为搞内核的必读书籍<br />
最后，第三阶段和第四阶段最重动手，空言无益，光看书也不罩，不动手那些东西理解不了<br />
学习linux/unix编程方法的建议<br />
建议学习路径：<br />
首先先学学编辑器，vim, emacs什么的都行。<br />
然后学make file文件，只要知道一点就行，这样就可以准备编程序了。<br />
然后看看《C程序设计语言》K&amp;R，这样呢，基本上就可以进行一般的编程了，顺便找本数据结构的书来看。<br />
如果想学习UNIX/LINUX的编程，《APUE》绝对经典的教材，加深一下功底，学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。<br />
然后再看Douglus E.
Comer的《用TCP/IP进行网际互连》第一卷，学习一下网络的知识，再看《UNP》的第一卷，不仅学习网络编程，而且对系统编程的一些常用的技巧就
很熟悉了，如果继续网络编程，建议看《TCP/IP进行网际互连》的第三卷，里面有很多关于应用协议telnet、ftp等协议的编程。<br />
如果想写设备驱动程序，首先您的系统编程的接口比如文件、IPC等必须要熟知了，再学习《LDD》2。<br />
对于几本经典教材的评价：<br />
《The C Programing Language》K&amp;R
经典的C语言程序设计教材，作者是C语言的发明者，教材内容深入浅出。虽然有点老，但是必备的一本手册，现在有时候我还常翻翻。篇幅比较小，但是每看一
遍，就有一遍的收获。另外也可用谭浩强的《C语言程序设计》代替。<br />
《Advanced Programing in Unix Envirement》 W.Richard
Stevens：也是非常经典的书（废话，Stevens的书哪有不经典的！），虽然初学者就可以看，但是事实上它是《Unix Network
Programing》的一本辅助资料。国内的翻译的《UNIX环境高级编程》的水平不怎么样，现在有影印版，直接读英文比读中文来得容易。<br />
《Unix Network Programing》W.Richard Stevens：第一卷讲BSD
Socket网络编程接口和另外一种网络编程接口的，不过现在一般都用BSD
Socket，所以这本书只要看大约一半多就可以了。第二卷没有设计到网络的东西，主要讲进程间通讯和Posix线程。所以看了《APUE》以后，就可以
看它了，基本上系统的东西就由《APUE》和《UNP》vol2概括了。看过《UNP》以后，您就会知道系统编程的绝大部分编程技巧，即使卷一是讲网络编
程的。国内是清华翻译得《Unix网络编程》，翻译者得功底也比较高，翻译地比较好。所以建议还是看中文版。<br />
《TCP/IP祥解》一共三卷，卷一讲协议，卷二讲实现，卷三讲编程应用。我没有怎么看过。，但是据说也很经典的，因为我没有时间看卷二，所以不便评价。<br />
《用TCP/IP进行网际互连》Douglus.E.Comer
一共三卷，卷一讲原理，卷二讲实现，卷三讲高级协议。感觉上这一套要比Stevens的那一套要好，就连Stevens也不得不承认它的第一卷非常经典。
事实上，第一卷即使你没有一点网络的知识，看完以后也会对网络的来龙去脉了如指掌。第一卷中还有很多习题也设计得经典和实用，因为作者本身就是一位教师，
并且卷一是国外研究生的教材。习题并没有答案，留给读者思考，因为问题得答案可以让你成为一个中级的Hacker，这些问题的答案可以象Douglus索
取，不过只有他只给教师卷二我没有怎么看，卷三可以作为参考手册，其中地例子也很经典。如果您看过Qterm的源代码，就会知道Qterm的telnet
实现部分大多数就是从这本书的源代码过来的。对于网络原理的书，我推荐它，而不是Stevens的《TCP/IP祥解》。<br />
《Operating System - Design and
Implement》这个是讲操作系统的书，用Minix做的例子。作者母语不是英文，所以英文看起来比较晦涩。国内翻译的是《操作系统设计与实现》，我
没看过中文版，因为翻译者是尤晋元，他翻译的《APUE》已经让我失望头顶了。读了这本书，对操作系统的底层怎么工作的就会<br />
有一个清晰的认识。<br />
《Linux Device Driver》2e
，为数不多的关于Linux设备驱动程序的好书。不过内容有些杂乱，如果您没有一些写驱动的经验，初次看会有些摸不着南北。国内翻译的是《Linux设备
驱动程序》第二版，第一版，第二版的译者我都有很深的接触，不过总体上来说，虽然第二版翻译的有些不尽人意，但是相比第一版来说已经超出了一大截。要读这
一本书，至少应该先找一些《计算机原理》《计算机体系结构》的书来马马虎虎读读，至少应该对硬件和计算机的工作过程有一些了解。</font>
														</p>
														<p>
																<font size="2">本文来自CSDN博客，转载请标明出处：<a target="_blank" href="http://student.csdn.net/link.php?url=http://blog.csdn.net%2Fwanxiao009%2Farchive%2F2009%2F11%2F13%2F4808778.aspx">http://blog.csdn.net/wanxiao009/archive/2009/11/13/4808778.aspx</a></font>
														</p>
												</div>
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/119105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-07-01 20:24 <a href="http://www.cppblog.com/erran/archive/2010/07/01/119105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to edit and understand /etc/fstab </title><link>http://www.cppblog.com/erran/archive/2010/06/24/118642.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 24 Jun 2010 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/24/118642.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118642.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/24/118642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118642.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118642.html</trackback:ping><description><![CDATA[
		<h1 class="mnonsense">
				<strong>
						<span class="mtitle">How to edit and understand /etc/fstab - 1.1</span>
				</strong> &gt;</h1>
		<p>There's a file called <code>/etc/fstab</code> in your Linux system. Learn what its contents mean and how it's used in conjunction with the <code>mount</code> command. When you learn to understand the <code>fstab</code> file, you'll be able to edit its contents yourself, too.</p>
		<p>In this tuXfile I assume you already know how to mount filesystems and partitions with the <code>mount</code> command. If you don't, I suggest reading the <a href="http://www.tuxfiles.org/linuxhelp/mounting.html">Mounting tuXfile</a> before reading this one.</p>
		<p>
				<span class="tuxinfo">Author:</span> Nana Långstedt &lt; nana.langstedt at gmail.com &gt;<br /><span class="tuxinfo">tuXfile created:</span> 12 October 2003<br /><span class="tuxinfo">Last updated:</span> 5 September 2009</p>
		<br />
		<!-- The MIDDLE 1 stuff end -->
		<!-- The SIDEBOXES stuff start -->
		<div class="sboxleft" id="tuxnav">
				<h2 class="sbtitle" id="printtitle">contents</h2>
				<ul class="sblinx" id="printcon">
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#what">What is fstab and why it's useful</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#over">Overview of the file</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#one-two">Device and default mount point</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#three">Filesystem type</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#four">Mount options</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#five-six">Dump and fsck options</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/fstab.html#ex">Example fstab entries</a>
						</li>
				</ul>
				<br />
				<h3 class="sbtitle" id="noprint">back to</h3>
				<ul class="sblinx" id="noprint2">
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/dirs.html">File systems and directories</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/linuxhelp/">Linux help</a>
						</li>
						<li>
								<a href="http://www.tuxfiles.org/">tuXfiles home</a>
						</li>
				</ul>
				<br />
		</div>
		<!-- the SIDEBOXES stuff end -->
		<!-- The MIDDLE 2 stuff start -->
		<div class="middle22">
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="what">What is fstab and why it's useful</span></strong> &gt;</h2>
								<p>
										<code>fstab</code>
is a configuration file that contains information of all the partitions
and storage devices in your computer. The file is located under <code>/etc</code>, so the full path to this file is <code>/etc/fstab</code>.</p>
								<p>
										<code>/etc/fstab</code>
contains information of where your partitions and storage devices
should be mounted and how. If you can't access your Windows partition
from Linux, aren't able to mount your CD or write to your floppy as a
normal user, or have problems with your CD-RW, you probably have a
misconfigured <code>/etc/fstab</code> file. So, you can usually fix your mounting problems by editing your <code>fstab</code> file.</p>
								<p>
										<code>/etc/fstab</code>
is just a plain text file, so you can open and edit it with any text
editor you're familiar with. However, note that you must have the root
privileges before editing <code>fstab</code>. So, in order to edit the file, you must either log in as root or use the <code>su</code> command to become root.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="over">Overview of the file</span></strong> &gt;</h2>
								<p>Of course everybody has a bit different <code>/etc/fstab</code> file because the partitions, devices and their properties are different on different systems. But the basic structure of <code>fstab</code> is always the same. Here's an example of the contents of <code>/etc/fstab</code>:</p>
								<div class="tuxtbl">
										<table class="tuxtable2" border="0" cellpadding="5" cellspacing="0">
												<tbody>
														<tr>
																<td>/dev/hda2</td>
																<td>/</td>
																<td>ext2</td>
																<td>defaults</td>
																<td>1 1</td>
														</tr>
														<tr>
																<td>/dev/hdb1</td>
																<td>/home</td>
																<td>ext2</td>
																<td>defaults</td>
																<td>1 2</td>
														</tr>
														<tr>
																<td>/dev/cdrom</td>
																<td>/media/cdrom</td>
																<td>auto</td>
																<td>ro,noauto,user,exec</td>
																<td>0 0</td>
														</tr>
														<tr>
																<td>/dev/fd0</td>
																<td>/media/floppy</td>
																<td>auto</td>
																<td>rw,noauto,user,sync</td>
																<td>0 0</td>
														</tr>
														<tr>
																<td>proc</td>
																<td>/proc</td>
																<td>proc</td>
																<td>defaults</td>
																<td>0 0</td>
														</tr>
														<tr>
																<td>/dev/hda1</td>
																<td>swap</td>
																<td>swap</td>
																<td>pri=42</td>
																<td>0 0</td>
														</tr>
												</tbody>
										</table>
								</div>
								<p>What
does all this gibberish mean? As you see, every line (or row) contains
the information of one device or partition. The first column contains
the device name, the second one its mount point, third its filesystem
type, fourth the mount options, fifth (a number) dump options, and
sixth (another number) filesystem check options. Let's take a closer
look at this stuff.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="one-two">1st and 2nd columns: Device and default mount point</span></strong> &gt;</h2>
								<p>The first and second columns should be pretty straightforward. They tell the <code>mount</code> command exactly the same things that <em>you</em> tell <code>mount</code>
when you mount stuff manually: what is the device or partition, and
what is the mount point. The mount point specified for a device in <code>/etc/fstab</code>
is its default mount point. That is the directory where the device will
be mounted if you don't specify any other mount point when mounting the
device.</p>
								<p>Like you already learned from the <a href="http://www.tuxfiles.org/linuxhelp/mounting.html">Mounting</a> tuXfile, most Linux distros create special directories for mount points. Most distros create them under <code>/mnt</code>, but some (at least SuSE) under <code>/media</code>. As you probably noticed when looking at the example <code>fstab</code>, I use SuSE's mount points as an example.</p>
								<p>What does all this mean? If I type the following command:<br /><span class="tuxexample"><code>$ <strong>mount /dev/fd0</strong></code></span><br />
		... my floppy will be mounted in <code>/media/floppy</code>, because that's the default mount point specified in <code>/etc/fstab</code>. If there is no entry for <code>/dev/fd0</code> in my <code>fstab</code> when I issue the command above, <code>mount</code> gets very confused because it doesn't know where to mount the floppy.</p>
								<p>You can freely change the default mount points listed in <code>/etc/fstab</code>
if you're not satisfied with the defaults your distro has given you.
Just make sure the mount point is a directory that already exists on
your system. If it doesn't, simply create it.</p>
								<p>Some partitions
and devices are also automatically mounted when your Linux system boots
up. For example, have a look at the example <code>fstab</code> above. There are lines that look like this:</p>
								<p class="tuxexample">
										<code>/dev/hda2 / ext2 defaults 1 1<br />
		/dev/hdb1 /home ext2 defaults 1 2</code>
								</p>
								<p>As you've learned, these lines mean that <code>/dev/hda2</code> will be mounted to / and <code>/dev/hdb1</code> to <code>/home</code>.
This is done automatically when your Linux system boots up... if it
wouldn't, you'd have a hard time using your cool Linux system because
all the programs you use are in / and you wouldn't be able to run them
if / wasn't mounted! But how does the system know where you want to
mount <code>/dev/hda2</code> and <code>/dev/hdb1</code>? By looking at the <code>/etc/fstab</code> file of course.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="three">3rd column: Filesystem type</span></strong> &gt;</h2>
								<p>The third column in <code>/etc/fstab</code>
specifies the filesystem type of the device or partition. Many
different filesystems are supported but we'll take a look at the most
common ones only.</p>
								<p>
										<strong class="tuxstrong">ext2 and ext3</strong>
Very likely your Linux partitions are Ext3. Ext2 used to be the
standard filesystem for Linux, but these days, Ext3 and ReiserFS are
usually the default filesystems for almost every new Linux distro. Ext3
is a newer filesystem type that differs from Ext2 in that it's <em>journaled</em>,
meaning that if you turn the computer off without properly shutting
down, you shouldn't lose any data and your system shouldn't spend ages
doing filesystem checks the next time you boot up.</p>
								<p>
										<strong class="tuxstrong">reiserfs</strong>
Your Linux partitions may very well be formatted as ReiserFS. Like
Ext3, ReiserFS is a journaled filesystem, but it's much more advanced
than Ext3. Many Linux distros (including SuSE) have started using
ReiserFS as their default filesystem for Linux partitions.</p>
								<p>
										<strong class="tuxstrong">swap</strong> The filesystem name is self-explanatory. The filesystem type "swap" is used in your swap partitions.</p>
								<p>
										<strong class="tuxstrong">vfat and ntfs</strong>
Your USB stick is most likely formatted as Vfat (more widely known as
FAT32). Your Windows partitions are probably either Vfat or NTFS. The
9x series (95, 98, ME) all use Vfat, and the NT series (NT, 2000, XP,
Vista, 7) use NTFS but they may be formatted as Vfat, too.</p>
								<p>
										<strong class="tuxstrong">auto</strong>
No, this isn't a filesystem type :-) The option "auto" simply means
that the filesystem type is detected automatically. If you take a look
at the example <code>fstab</code> above, you'll see that the floppy
and CD-ROM both have "auto" as their filesystem type. Why? Their
filesystem type may vary. One floppy might be formatted for Windows and
the other for Linux's Ext2. That's why it's wise to let the system
automatically detect the filesystem type of media such as floppies and
cdroms.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="four">4th column: Mount options</span></strong> &gt;</h2>
								<p>The fourth column in <code>fstab</code> lists all the mount options for the device or partition. This is also the most confusing column in the <code>fstab</code>
file, but knowing what some of the most common options mean, saves you
from a big headache. Yes, there are many options available, but I'll
take a look at the most widely used ones only. For more information,
check out the man page of <code>mount</code>.</p>
								<p>
										<strong class="tuxstrong">auto and noauto</strong> With the <code>auto</code> option, the device will be mounted automatically (at bootup, just like I told you a bit earlier, or when you issue the <code>mount -a</code> command). <code>auto</code> is the default option. If you don't want the device to be mounted automatically, use the <code>noauto</code> option in <code>/etc/fstab</code>. With <code>noauto</code>, the device can be mounted only explicitly.</p>
								<p>
										<strong class="tuxstrong">user and nouser</strong> These are very useful options. The <code>user</code> option allows normal users to mount the device, whereas <code>nouser</code> lets only the root to mount the device. <code>nouser</code>
is the default, which is a major cause of headache for new Linux users.
If you're not able to mount your cdrom, floppy, Windows partition, or
something else as a normal user, add the <code>user</code> option into <code>/etc/fstab</code>.</p>
								<p>
										<strong class="tuxstrong">exec and noexec</strong>
										<code>exec</code> lets you execute binaries that are on that partition, whereas <code>noexec</code> doesn't let you do that. <code>noexec</code>
might be useful for a partition that contains binaries you don't want
to execute on your system, or that can't even be executed on your
system. This might be the case of a Windows partition.</p>
								<p>
										<code>exec</code> is the default option, which is a good thing. Imagine what would happen if you accidentally used the <code>noexec</code> option with your Linux root partition...</p>
								<p>
										<strong class="tuxstrong">ro</strong> Mount the filesystem read-only.</p>
								<p>
										<strong class="tuxstrong">rw</strong>
Mount the filesystem read-write. Again, using this option might cure
the headache of many new Linux users who are tearing their hair off
because they can't write to their floppies, Windows partitions, or
something else.</p>
								<p>
										<strong class="tuxstrong">sync and async</strong> How the input and output to the filesystem should be done. <code>sync</code> means it's done synchronously. If you look at the example <code>fstab</code>,
you'll notice that this is the option used with the floppy. In plain
English, this means that when you, for example, copy a file to the
floppy, the changes are physically written to the floppy at the <em>same time</em> you issue the copy command.</p>
								<p>However, if you have the <code>async</code> option in <code>/etc/fstab</code>,
input and output is done asynchronously. Now when you copy a file to
the floppy, the changes may be physically written to it long time <em>after</em>
issuing the command. This isn't bad, and may sometimes be favorable,
but can cause some nasty accidents: if you just remove the floppy
without unmounting it first, the copied file may not physically exist
on the floppy yet!</p>
								<p>
										<code>async</code> is the default. However, it may be wise to use <code>sync</code>
with the floppy, especially if you're used to the way it's done in
Windows and have a tendency to remove floppies before unmounting them
first.</p>
								<p>
										<strong class="tuxstrong">defaults</strong> Uses the default options that are rw, suid, dev, exec, auto, nouser, and async.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="five-six">5th and 6th columns: Dump and fsck options</span></strong> &gt;</h2>
								<p>Dump and, uh, <em>what</em>
options? Well, dump is a backup utility and fsck is a filesystem check
utility. I won't discuss them in great length here (they would both
need their own tuXfile), but I'll mention them, because otherwise you'd
spend the rest of the day wondering what on God's green Earth do these
things mean.</p>
								<p>The 5th column in <code>/etc/fstab</code> is the
dump option. Dump checks it and uses the number to decide if a
filesystem should be backed up. If it's zero, dump will ignore that
filesystem. If you take a look at the example <code>fstab</code>, you'll notice that the 5th column is zero in most cases.</p>
								<p>The
6th column is a fsck option. fsck looks at the number in the 6th column
to determine in which order the filesystems should be checked. If it's
zero, fsck won't check the filesystem.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<h2 class="mnonsense">&lt; <strong><span class="mtitle" id="ex">Example /etc/fstab entries</span></strong> &gt;</h2>
								<p>As an example, we'll take a look at a couple of <code>fstab</code>
entries that have been a source of endless frustration for new Linux
users: floppy and CD-ROM (although these days floppies aren't that
important anymore).</p>
								<p class="tuxexample">
										<code>/dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0</code>
								</p>
								<p>This line means that the floppy is mounted to <code>/media/floppy</code>
by default and that its filesystem type is detected automatically. This
is useful because the type of the floppy may wary. Note especially the <strong>rw</strong> and <strong>user</strong>
options: they must be there if you want to be able to mount and write
to the floppy as a normal user. If you have trouble with this, check
your <code>fstab</code> file to see if these options are there. Also note the <strong>sync</strong> option. It can be async just as well, but it's sync because of reasons discussed a bit earlier.</p>
								<p class="tuxexample">
										<code>/dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0</code>
								</p>
								<p>Note, again, the <strong>user</strong>
option that enables you to mount the CD as a normal user. The CD-ROM
has the ro option because it's no use mounting a CD-ROM read-write
because you wouldn't be able to write to it anyway. Also note the <strong>exec</strong> option. It's especially useful if you'd like to be able to execute something from your CD.</p>
								<p>Also note that the <strong>noauto</strong>
option is used with the floppy and CD-ROM. This means that they won't
be automatically mounted when your Linux system boots up. This is
useful for removable media, because sometimes there won't be any floppy
or CD-ROM when you boot up your system, so there isn't any reason to
try to mount something that doesn't even exist.</p>
						</div>
				</div>
				<br />
				<div class="mainback">
						<div class="maintext">
								<p class="mnonsense">
										<strong>
												<a href="http://www.tuxfiles.org/linuxhelp/">Linux help</a> &gt; <a href="http://www.tuxfiles.org/linuxhelp/dirs.html">File systems and directories</a> &gt; <span class="mtitle">How to edit /etc/fstab</span></strong>
								</p>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/118642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-24 15:45 <a href="http://www.cppblog.com/erran/archive/2010/06/24/118642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：在Fedora core 4.0 加载NTFS和FAT32分区详述</title><link>http://www.cppblog.com/erran/archive/2010/06/24/118629.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 24 Jun 2010 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/24/118629.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118629.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/24/118629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118629.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118629.html</trackback:ping><description><![CDATA[
		<div id="app-share-content">
				<h1 class="title">在Fedora core 4.0 加载NTFS和FAT32分区详述</h1>
				<div class="meta with-taxonomy">
						<div class="submitted">Posted 八月 12th, 2005 by beinan</div>
						<div class="taxonomy">
								<ul class="links inline">
										<li class="first taxonomy_term_18">
												<a class="taxonomy_term_18" rel="tag">Fedora</a>
										</li>
										<li class="taxonomy_term_5">
												<a class="taxonomy_term_5" title="安装配置" rel="tag">安装配置</a>
										</li>
										<li class="last taxonomy_term_6">
												<a class="taxonomy_term_6" title="桌面环境 KDE GNOME 窗口管理器" rel="tag">桌面环境</a>
										</li>
								</ul>
						</div>
				</div>
				<p>
						<strong>作者：</strong>北南南北<br /><strong>来自：</strong>LinuxSir.Org<br /><strong>提要：</strong>本文主要介绍ntfs文件系统分区及fat32格式分区的挂载方法：简单的说就是让Linux能读取Windows系统下的分区；</p>
				<p>
						<strong>
								<br />
++++++++++++++++++++++++++++++++++++<br />
正文：<br />
++++++++++++++++++++++++++++++++++++<br /></strong>
						<br />
						<strong>
								<br />
一、最基本的几个命令；<br /></strong>
						<br />
						<font color="blue">
								<strong>
										<br />
1、查看磁盘分区情况的命令fdisk -l ；<br /></strong>
						</font>
						<br />
比如：</p>
				<div class="codeblock">
						<code>[root@localhost beinan]# /sbin/fdisk -l<br /><br />
Disk /dev/hda: 80.0 GB, 80026361856 bytes<br />
255 heads, 63 sectors/track, 9729 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br /><br />
    Device Boot       Start          End       Blocks    Id  System<br />
/dev/hda1    *            1          765      6144831     7  HPFS/NTFS<br />
/dev/hda2              766         2805     16386300     c  W95 FAT32 (LBA)<br />
/dev/hda3             2806         7751     39728745     5  Extended<br />
/dev/hda5             2806         3825      8193118+  83  Linux<br />
/dev/hda6             3826         5100     10241406    83  Linux<br />
/dev/hda7             5101         5198       787153+  82  Linux swap / Solaris<br />
/dev/hda8             5199         6657     11719386    83  Linux<br />
/dev/hda9             6658         7751      8787523+  83  Linux</code>
				</div>
				<p>通过上面的我们可以知道 /dev/hda1 是NTFS格式；/dev/hda2是FAT32格式；</p>
				<p>
						<font color="blue">
								<strong>
										<br />
2、mount 命令；<br /></strong>
						</font>
						<br />
就是磁盘分区的挂载命令，如果内核支持的话，mount 命令能挂载几乎所有的文件系统，比如
reiserfs;ext2;ext3;ntfs;fat32;jfs等等；在Linux系统中，我们常用的主要有reiserfs;ext3;
ext3；在Windows系统中，我们主要用的是NTFS;FAT32;FAT等；</p>
				<div class="codeblock">
						<code>mount 挂载磁盘分区的用法：<br /><br />
mount -t 文件格式 -o 选项参数  磁盘分区  挂载点目录名</code>
				</div>
				<br />
这样说可能新手不太明白，什么是文件格式，什么是挂载点目录名，我们要把一个分区加载到Linux，是不是得有个存放在地方？比如我们把
/dev/hda1
挂载到/mnt/winc目录中；首先我们要看是不是winc是否存在于/mnt目建录中；如果没有winc，我们必须建一个；当然挂载点目录名是自己随
便起命名的，最好用英文；
<p>例子在后面举了，新手弟兄先知道有这回事就行了；<br /><font color="blue"><strong><br />
3、df -lh 磁盘使用情况的命令；这个重要吧；<br /></strong></font></p><div class="codeblock"><code>[root@localhost beinan]# df -lh<br />
Filesystem             容量  已用 可用 已用% 挂载点<br />
/dev/hda8               11G  5.9G  4.5G  57% /<br />
/dev/shm               236M      0  236M    0% /dev/shm<br />
/dev/hda1              5.9G  3.2G  2.7G  55% /mnt/winc<br />
/dev/hda2               16G  8.1G  7.7G  52% /mnt/wind<br />
/dev/hda5              7.9G  5.8G  2.1G  74% /mnt/slack</code></div><br /><font color="blue"><strong><br />
4、文件和目录的权限；<br /></strong></font><br />
这个在论坛中，我写过，有时间整理上来；知道umask=000是任何用户都能读写执行的就行了。有些东西慢慢就明白了，多执行几个命令就OK了。<br /><font color="blue"><strong><br />
5、内核的版本；<br /></strong></font><br /><div class="codeblock"><code>[root@localhost beinan]# uname -a<br />
Linux localhost.localdomain 2.6.11-1.1369_FC4 #1 Thu Jun 2 22:55:56 EDT 2005 i686 i686 i386 GNU/Linux</code></div><br />
通过上面得知我目前用的内核的版本是 2.6.11-1.1369_FC4<br /><font color="blue"><strong><br />
6.获取root用户的命令是su<br /></strong></font><br /><div class="codeblock"><code>[beinan@localhost ~]$ su<br />
Password: 在这里输入您的root密码，即使输入了，也不会显示出来；我们要安装RPM包，要用到root的超级权限；<br />
[root@localhost beinan]#</code></div><br /><strong><br />
二、NTFS文件系统的加载；<br /></strong><br /><font color="blue"><strong><br />
1、我们要首先确认系统的内核；我们要根据系统的内核版本来下载支持ntfs的内核补丁；<br /></strong></font><p>我们在前面已经通过fdisk -l 得知/dev/hda1 是NTFS分区；我们如何加载它呢？在Fedora core 4.0
中，系统默认是不支持NTFS加载的；我们只能安装第三方kernel的ntfs插件或者编内核来实现，相对于编译内核来说，插件是最方便的，也是最简单
的；</p><div class="codeblock"><code>[root@localhost beinan]# uname -a<br />
Linux localhost.localdomain 2.6.11-1.1369_FC4 #1 Thu Jun 2 22:55:56 EDT 2005 i686 i686 i386 GNU/Linux</code></div><br />
一定要看仔细，是2.6.11-1.1369_FC4，是i686的，没有带smp字样的，smp是支持多处理器的内核，如果您用这样的内核，就要下载相应版本的smp的；
<p>我们到哪去下载呢？</p><p>kernel ntfs 项目在 http://linux-ntfs.sourceforge.net</p><p>Fedora core 4.0的kernel NTFS的RPM包在：</p><p>http://linux-ntfs.sourceforge.net/rpm/fedora4.html</p><p>根据上面内核的信息，我们要下载：2.6.11-1.1369_FC4 i686的，下载的应该是：</p><p>kernel-module-ntfs-2.6.11-1.1369_FC4-2.1.22-0.rr.6.0.i686.rpm</p><p>地址： http://prdownloads.sourceforge.net/linux-ntfs/kernel-module-ntfs-2.6.11-1.1369_FC4-2.1.22-0.rr.6.0.i686.rpm</p><p>在这里选一个镜像下载：</p><p>安装kernel ntfs模块：</p><div class="codeblock"><code>[root@localhost beinan]# rpm -ivh kernel-module-ntfs*</code></div><br /><font color="blue"><strong><br />
2.判断哪个分区是NTFS格式，加载NTFS分区；<br /></strong></font><br /><div class="codeblock"><code>[root@localhost beinan]# /sbin/fdisk -l<br /><br />
Disk /dev/hda: 80.0 GB, 80026361856 bytes<br />
255 heads, 63 sectors/track, 9729 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br /><br />
    Device Boot       Start          End       Blocks    Id  System<br />
/dev/hda1    *            1          765      6144831     7  HPFS/NTFS<br />
/dev/hda2              766         2805     16386300     c  W95 FAT32 (LBA)<br />
/dev/hda3             2806         7751     39728745     5  Extended<br />
/dev/hda5             2806         3825      8193118+  83  Linux<br />
/dev/hda6             3826         5100     10241406    83  Linux<br />
/dev/hda7             5101         5198       787153+  82  Linux swap / Solaris<br />
/dev/hda8             5199         6657     11719386    83  Linux<br />
/dev/hda9             6658         7751      8787523+  83  Linux</code></div><p>我们已经把kernel ntfs的模式安装好了，现在进入NTFS的分区的加载过程；通过上面的查看，我们知道/dev/hda1是NTFS格式的；<br /><font color="blue"><br />
1］我们要建一个挂载点的目录，比如是在/mnt/目录下建一个winc的目录：<br /></font><br />
[root@localhost beinan]# mkdir /mnt/winc<br /><font color="blue"><br />
2］把/dev/hda1 挂载到 /mnt/winc中，这样我们如果查看/dev/hda1磁盘内容时，就会在/mnt/winc中找得到；<br /></font></p><div class="codeblock"><code>[root@localhost beinan]# mount -t ntfs -o nls=utf8,umask=000 /dev/hda1 /mnt/winc</code></div><p><font color="red">注：</font>-t ntfs 说明文件系统的格式是ntfs的；-o是选项
，选项有什么呢？有nls=utf8 ，意思是Native Language
Support（本地语言支持）是utf8，也就是大家常说的语言编码；Fedora core 4.0
默认的语言编码就是utf8的，这样能显示出中文来；umask=000表示所有的用户组都可读可写，但因为NTFS在Linux中写入不安全，所以只能
读，不能写入；如果想写入，只能自己编内核来实现；但意义并不是太大；</p><p>是不是挂载好了呢？</p><div class="codeblock"><code>[root@localhost beinan]# df -lh<br />
Filesystem             容量  已用 可用 已用% 挂载点<br />
/dev/hda8               11G  5.9G  4.5G  57% /<br />
/dev/shm               236M      0  236M    0% /dev/shm<br />
/dev/hda1              5.9G  3.2G  2.7G  55% /mnt/winc</code></div><br />
看来是挂载好了；我们进入 /mnt/winc就知道是不是有内容了；<br /><div class="codeblock"><code>[root@localhost beinan]# cd /mnt/winc <br />
[root@localhost beinan]# ls </code></div><br /><font color="blue"><br />
3］如何开机自动加载NTFS文件系统的分区；<br /></font><br />
我们要根据磁盘的位置，上面我们看到了是/dev/hda1，对不对？所以我在/etc/fstab文件中找加如下的一行；<br /><div class="codeblock"><code>/dev/hda1                /mnt/winc                ntfs     umask=000,nls=utf8</code></div><br /><font color="blue"><br />
4]如何将这个磁盘分区放在GNOME或者KDE的桌面上呢？<br /></font><br />
在KDE下，只需要点一下鼠标，在桌面的空白处按鼠标右键就可以找得到了；不多说了，太简单；
<p>在GNOME下也是极简单的：</p><p>比如我是以beinan这个用户登入的系统，想在放在 beinan 这个用户的GNOME桌面上；</p><div class="codeblock"><code>[beinan@localhost ~]$ ln -s /mnt/winc/ ~beinan/Desktop/winc</code></div><br /><strong><br />
三、FAT32文件系统的分区的加载；<br /></strong><br />
通过fdisk -l ，我们也知道了 /dev/hda2是FAT32格式的；<br /><div class="codeblock"><code>/dev/hda2              766         2805     16386300     c  W95 FAT32 (LBA)</code></div><p>Linux对FAT32的支持是可读可写的，所以没有必要再安装什么模块之类的；<br /><font color="blue"><strong><br />
1.我们要建一个挂载点的目录，比如是在/mnt/目录下建一个wind的目录：<br /></strong></font></p><div class="codeblock"><code>[root@localhost beinan]# mkdir /mnt/wind</code></div><br /><font color="blue"><strong><br />
2.挂载 /dev/hda2 到/mnt/wind上<br /></strong></font><br /><div class="codeblock"><code>[root@localhost beinan]# mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/wind/</code></div><br />
看一下是不是挂载好了？<br /><div class="codeblock"><code>[root@localhost beinan]# df -lh<br />
Filesystem             容量  已用 可用 已用% 挂载点<br />
/dev/hda8               11G  5.9G  4.5G  57% /<br />
/dev/shm               236M      0  236M    0% /dev/shm<br />
/dev/hda1              5.9G  3.2G  2.7G  55% /mnt/winc<br />
/dev/hda2               16G  8.1G  7.7G  52% /mnt/wind</code></div><br />
看来是挂载好了；应该进去看看；<br /><div class="codeblock"><code>[root@localhost beinan]#cd /mnt/wind <br />
[root@localhost beinan]#ls -lh <br /><br />
drwxrwxrwx    3 root root 8.0K  7月 27 11:45 抓图<br />
drwxrwxrwx    2 root root 8.0K  8月 12 10:21 测试文件<br />
drwxrwxrwx    4 root root 8.0K  7月 27 11:45 电脑硬件<br />
drwxrwxrwx    5 root root 8.0K  7月 27 11:45 网际快车</code></div><br />
中文支持没有问题；这是我机器中的；<br /><font color="blue"><strong><br />
3.如何开机自动加载FAT文件系统的分区；<br /></strong></font><br />
我们要根据磁盘的位置，上面我们看到了是/dev/hda1，对不对？所以我在/etc/fstab文件中找加如下的一行；<br /><div class="codeblock"><code>/dev/hda2                /mnt/wind                vfat     umask=000,nls=utf8</code></div><br /><font color="blue"><br />
4]如何将这个磁盘分区放在GNOME或者KDE的桌面上呢？<br /></font><br />
在KDE下，只需要点一下鼠标，在桌面的空白处按鼠标右键就可以找得到了；不多说了，太简单；
<p>在GNOME下也是极简单的：</p><p>比如我是以beinan这个用户登入的系统，想在放在 beinan 这个用户的GNOME桌面上；</p><div class="codeblock"><code>[beinan@localhost ~]$ ln -s /mnt/wind/ ~beinan/Desktop/wind</code></div><br /><strong><br />
四、对于文本文件乱码处理； </strong><p><br />
比如我们看到有些文本文件内容是乱码，我们可以用gedit 打开，然后另存为utf8格式就OK了；</p><p><strong>后记：</strong>虽然写的详细，但我不敢保证所有初学者都能会操作，但我感觉80%初学者还是按步骤操作不会有问题；</p><p>正在修订之中；欢迎提出点意见和建议；谢谢~</p></div>
		<div id="appShareUrl">
				<div id="appShareSafeLinkTip" style="display: none;">为了您的安全，请只打开来源可靠的网址<p><a href="http://hi.baidu.com/taylergreen/blog/item/54825f54a792481a3a2935f4.html" target="_blank">打开网站</a>    <a href="http://apps.hi.baidu.com/share/detail/4328995#" onclick="share.safelink.close();return false;">取消</a></p></div>
                来自: <a href="http://hi.baidu.com/taylergreen/blog/item/54825f54a792481a3a2935f4.html" target="_blank">http://hi.baidu.com/taylergreen/blog/item/54825f54a792481a3a2935f4.html</a></div>
<img src ="http://www.cppblog.com/erran/aggbug/118629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-24 13:07 <a href="http://www.cppblog.com/erran/archive/2010/06/24/118629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：文件和目录访问权限设置 </title><link>http://www.cppblog.com/erran/archive/2010/06/24/118609.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 24 Jun 2010 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/24/118609.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118609.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/24/118609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118609.html</trackback:ping><description><![CDATA[
		<h1 class="title">文件和目录访问权限设置</h1>
		<div class="meta with-taxonomy">
				<div class="submitted">Posted 十一月 19th, 2005 by wangxudong</div>
				<div class="taxonomy">
						<ul class="links inline">
								<li class="first taxonomy_term_2">
										<a href="http://fedora.linuxsir.org/main/taxonomy/term/2" rel="tag" title="基础入门" class="taxonomy_term_2">基础入门</a>
								</li>
								<li class="last taxonomy_term_1">
										<a href="http://fedora.linuxsir.org/main/taxonomy/term/1" rel="tag" title="Fedora 学习讨论" class="taxonomy_term_1">Fedora</a>
								</li>
						</ul>
				</div>
		</div>
		<div class="content">
				<p>
						<b>作者：</b>王旭东 At xmu.edu.cn<br /><b>来自：</b>LinuxSir.Org<br /><b>摘要：</b>本文主要讲述Linux 系统中目录和文件权限设置；通过理论和实践相结合的方式，引导初学者对文件和目录的权限了解并深入；</p>
				<p>
						<font size="4">
								<b>目录索引</b>
						</font>
				</p>
				<p>
						<a href="http://fedora.linuxsir.org/main/?q=node/112#1">
								<b>一、文件和目录权限概述；</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#2">
								<b>二、一般权限</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#3">
								<b>三、特殊权限</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#4">
								<b>四、使用文件管理器来改变文件或目录的权限：</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#5">
								<b>五、使用chmod和数字改变文件或目录的访问权限</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#6">
								<b>六、使用命令chown改变目录或文件的所有权</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#7">
								<b>七、关于本文；</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#8">
								<b>八、参考文档；</b>
						</a>
						<br />
						<a href="http://fedora.linuxsir.org/main/?q=node/112#9">
								<b>九、相关文档；</b>
						</a>
				</p>
				<p>
						<font color="blue">
								<b>
										<br />
++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
正文<br />
++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br /></b>
						</font>
				</p>
				<p>
						<font id="1" size="4">
								<b>
										<br />
一、文件和目录权限概述<br /></b>
						</font>
				</p>
				<p>    在linux中的每一个文件或目录都包含有访问权限，这些访问权限决定了谁能访问和如何访问这些文件和目录。</p>
				<p>
通过设定权限可以从以下三种访问方式限制访问权限：只允许用户自己访问；允许一个预先指定的用户组中的用户访问；允许系统中的任何用户访问。同时，用户能
够控制一个给定的文件或目录的访问程度。一个文件活目录可能有读、写及执行权限。当创建一个文件时，系统会自动地赋予文件所有者读和写的权限，这样可以允
许所有者能够显示文件内容和修改文件。文件所有者可以将这些权限改变为任何他想指定的权限。一个文件也许只有读权限，禁止任何修改。文件也可能只有执行权
限，允许它想一个程序一样执行。</p>
				<p>
三种不同的用户类型能够访问一个目录或者文件：所有着、用户组或其他用户。所有者就是创建文件的用户，用户是所有用户所创建的文件的所有者，用户可以允许
所在的用户组能访问用户的文件。通常，用户都组合成用户组，例如，某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组，一个用户能够授予所在
用户组的其他成员的文件访问权限。最后，用户也将自己的文件向系统内的所有用户开放，在这种情况下，系统内的所有用户都能够访问用户的目录或文件。在这种
意义上，系统内的其他所有用户就是other用户类。</p>
				<p>
每一个用户都有它自身的读、写和执行权限。第一套权限控制访问自己的文件权限，即所有者权限。第二套权限控制用户组访问其中一个用户的文件的权限。第三套
权限控制其他所有用户访问一个用户的文件的权限，这三套权限赋予用户不同类型（即所有者、用户组和其他用户）的读、写及执行权限就构成了一个有9种类型的
权限组。</p>
				<p>    我们可以用-l参数的ls命令显示文件的详细信息，其中包括权限。如下所示：</p>
				<div class="codeblock">
						<code>[root@localhost ~]# ls -lh<br />总用量 368K<br />-rw-r--r--  1 root root  12K  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root   48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root 325K 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root   48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root 9.6K 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root 9.6K 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root  512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root   48  9月  6 13:06 vmware</code>
				</div>
				<p>当执行ls -l 或 ls -al 命令后显示的结果中，最前面的第2～10个字符是用来表示权限。第一个字符一般用来区分文件和目录：<br /></p>
				<div class="codeblock">
						<code>    d：表示是一个目录，事实上在ext2fs中，目录是一个特殊的文件。<br />    －：表示这是一个普通的文件。<br />    l:  表示这是一个符号链接文件，实际上它指向另一个文件。<br />    b、c：分别表示区块设备和其他的外围设备，是特殊类型的文件。<br />    s、p：这些文件关系到系统的数据结构和管道，通常很少见到。</code>
				</div>
				<br />
下面详细介绍一下权限的种类和设置权限的方法。
<p><font id="2" size="4"><b><br />
二、一般权限<br /></b></font><br />
    第2～10个字符当中的每3个为一组，左边三个字符表示所有者权限，中间3个字符表示与所有者同一组的用户的权限，右边3个字符是其他用户的权限。这三个一组共9个字符，代表的意义如下：<br />
      r(Read，读取)：对文件而言，具有读取文件内容的权限；对目录来说，具有浏览目   录的权限。<br />
      w(Write,写入)：对文件而言，具有新增、修改文件内容的权限；对目录来说，具有删除、移动目录内文件的权限。<br />
      x(eXecute，执行)：对文件而言，具有执行文件的权限；对目录了来说该用户具有进入目录的权限。<br />
      －：表示不具有该项权限。</p><p>下面举例说明：<br /></p><div class="codeblock"><code>      -rwx------: 文件所有者对文件具有读取、写入和执行的权限。<br />      -rwxr—r--: 文件所有者具有读、写与执行的权限，其他用户则具有读取的权限。<br />      -rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限，而其他用户仅具有读取和执行的权限。<br />      drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录，却无法读取任何数据。<br />      Drwx------: 除了目录所有者具有完整的权限之外，其他用户对该目录完全没有任何权限。</code></div><br />
每个用户都拥有自己的专属目录，通常集中放置在/home目录下，这些专属目录的默认权限为rwx------:
<div class="codeblock"><code>[root@localhost ~]# ls -al<br />总用量 5<br />drwxr-xr-x   9 root   root   240 11月  8 18:30 .<br />drwxr-xr-t  22 root   root   568 10月 15 09:13 ..<br />drwxr-xr-x   2 root   root    48  8月 11 08:09 ftp<br />drwxrwxrwx   2 habil  users  272 11月 13 19:13 habil<br />-rw-r--r--   1 root   root     0  7月 31 00:41 .keep<br />drwxr-xr-x   2 root   root    72 11月  3 19:34 mp3<br />drwxr-xr-x  39 sailor users 1896 11月 11 13:35 sailor<br />drwxr-xr-x   3 temp   users  168 11月  8 18:17 temp<br />drwxr-xr-x   3 test   users  200 11月  8 22:40 test<br />drwxr-xr-x  65 wxd    users 2952 11月 19 18:53 wxd</code></div><p>表示目录所有者本身具有所有权限，其他用户无法进入该目录。执行mkdir命令所创建的目录，其默认权限为rwxr-xr-x,用户可以根据需要修改目录的权限。</p><p> 此外，默认的权限可用umask命令修改，用法非常简单，只需执行umask 777
命令，便代表屏蔽所有的权限，因而之后建立的文件或目录，其权限都变成000，依次类推。通常root帐号搭配umask命令的数值为022、027和
077，普通用户则是采用002，这样所产生的权限依次为755、750、700、775。有关权限的数字表示法，后面将会详细说明。<br />
   用户登录系统时，用户环境就会自动执行rmask命令来决定文件、目录的默认权限。</p><p><font id="3" size="4"><b><br />
三、特殊权限<br /></b></font><br />
   其实文件与目录设置不止这些，还有所谓的特殊权限。由于特殊权限会拥有一些“特权”，因而用户若无特殊需求，不应该启用这些权限，避免安全方面出现严重漏洞，造成黑客入侵，甚至摧毁系统!!!<br />
s或S（SUID,Set
UID）：可执行的文件搭配这个权限，便能得到特权，任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件，黑客经常利用这种权
限，以SUID配上root帐号拥有者，无声无息地在系统中开扇后门，供日后进出使用。<br />
    s或S（SGID，Set GID）：设置在文件上面，其效果与SUID相同，只不过将文件所有者换成用户组，该文件就可以任意存取整个用户组所能使用的系统资源。<br />
    T或T（Sticky）：/tmp和 /var/tmp目录供所有用户暂时存取文件，亦即每位用户皆拥有完整的权限进入该目录，去浏览、删除和移动文件。</p><p>   因为SUID、SGID、Sticky占用x的位置来表示，所以在表示上会有大小写之分。加入同时开启执行权限和SUID、SGID、Sticky，则权限表示字符是小写的：<br /></p><div class="codeblock"><code>     -rwsr-sr-t    1   root    root    4096      6月 23     08：17      conf</code></div><br />
   如果关闭执行权限，则表示字符会变成大写：<br /><div class="codeblock"><code>     -rwSr-Sr-T    1   root    root    4096      6月 23     08：17      conf</code></div><p><font id="4" size="4"><b><br />
四、使用文件管理器来改变文件或目录的权限：<br /></b></font><br />
如果用户要改变一个文件目录的权限，右击要改变权限的文件或者目录，在弹出的快捷菜单中选择“属性”，系统将打开属性对话框</p><p>在“属性”对话框中，单击“权限”标签，就会打开“权限”选项卡。</p><p>在这里你可以修改文件或者目录的所有者、组群和其他用户的权限，而且可以设置特殊权限</p><p>对于特殊权限，最好不要设置，不然会带来很严重的安全问题。</p><p>当然，在这里你也可以改变文件和目录的所有者和所属组。</p><p><a href="http://fedora.linuxsir.org/main/files/fsx0001sslinuxsirorg.jpg"><img src="http://fedora.linuxsir.org/main/files/fsx0001sslinuxsirorg.jpg" weight="200" height="200" /></a><a href="http://fedora.linuxsir.org/main/files/fsx0002sslinuxsirorg.jpg"><img src="http://fedora.linuxsir.org/main/files/fsx0002sslinuxsirorg.jpg" weight="200" height="200" /></a></p><p><font id="5" size="4"><b><br />
五、使用chmod和数字改变文件或目录的访问权限<br /></b></font><br />
    文件和目录的权限表示，是用rwx这三个字符来代表所有者、用户组和其他用户的权限。有时候，字符似乎过于麻烦，因此还有另外一种方法是以数字来表示权限，而且仅需三个数字。<br /></p><div class="codeblock"><code>     r: 对应数值4<br />     w: 对应数值2<br />     x：对应数值1<br />     －：对应数值0</code></div><br />
　　数字设定的关键是mode的取值，一开始许多初学者会被搞糊涂，其实很简单，我们将rwx看成二进制数，如果有则有1表示，没有则有0表示，那么rwx r-x r- -则可以表示成为：<br /><div class="codeblock"><code>　　111 101 100<br /><br /><br />　　再将其每三位转换成为一个十进制数，就是754。<br /><br />　　例如，我们想让a.txt这个文件的权限为：<br /><br />　　      自己 同组用户 其他用户<br />　　可读   是       是     是<br />　　可写   是       是     <br />    可执行</code></div><br />
　　那么，我们先根据上表得到权限串为：rw-rw-r--，那么转换成二进制数就是110 110 100，再每三位转换成为一个十进制数，就得到664，因此我 们执行命令：<br /><div class="codeblock"><code>[root@localhost ~]# chmod 664 a.txt</code></div><br />
    按照上面的规则，rwx合起来就是4+2+1＝7，一个rwxrwxrwx权限全开放的文件，数值表示为777；而完全不开放权限的文件“－－－－－－－－－”其数字表示为000。下面举几个例子：<br /><div class="codeblock"><code>-rwx------:等于数字表示700。<br />-rwxr—r--:等于数字表示744。<br />-rw-rw-r-x:等于数字表示665。<br />drwx—x—x:等于数字表示711。<br />drwx------:等于数字表示700。</code></div><br />
在文本模式下，可执行chmod命令去改变文件和目录的权限。我们先执行ls -l 看看目录内的情况：<br /><div class="codeblock"><code>[root@localhost ~]# ls -l<br />总用量 368<br />-rw-r--r--  1 root root  12172  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root     48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root 331844 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root     48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root    512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root     48  9月  6 13:06 vmware</code></div><p>可以看到当然文件conkyrc.sample文件的权限是644,然后把这个文件的权限改成777。执行下面命令<br /></p><div class="codeblock"><code>[root@localhost ~]# chmod 777 conkyrc.sample</code></div><br />
然后ls -l看一下执行后的结果：<br /><div class="codeblock"><code>[root@localhost ~]# ls -l<br />总用量 368<br />-rwxrwxrwx  1 root root  12172  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root     48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root 331844 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root     48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root    512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root     48  9月  6 13:06 vmware</code></div><br />
可以看到conkyrc.sample文件的权限已经修改为rwxrwxrwx
<p>如果要加上特殊权限，就必须使用4位数字才能表示。特殊权限的对应数值为：<br /></p><div class="codeblock"><code>     s或 S （SUID）：对应数值4。<br />     s或 S （SGID）：对应数值2。<br />     t或 T ：对应数值1。<br />&lt;code&gt;<br />用同样的方法修改文件权限就可以了<br /><br />例如：<br />&lt;code&gt;<br />[root@localhost ~]# chmod 7600 conkyrc.sample<br /><br />[root@localhost ~]# ls -l<br />总用量 368<br />-rwS--S--T  1 root root  12172  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root     48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root 331844 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root     48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root    512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root     48  9月  6 13:06 vmware</code></div><br />
加入想一次修改某个目录下所有文件的权限，包括子目录中的文件权限也要修改，要使用参数－R表示启动递归处理。
<p>例如：<br /></p><div class="codeblock"><code>[root@localhost ~]# chmod 777 /home/user  注：仅把/home/user目录的权限设置为rwxrwxrwx<br /><br />[root@localhost ~]# chmod  -R 777 /home/user  注：表示将整个/home/user目录与其中的文件和子目录的权限都设置为rwxrwxrwx</code></div><br /><font id="6" size="4"><b><br />
六、使用命令chown改变目录或文件的所有权<br /></b></font><br />
文件与目录不仅可以改变权限，其所有权及所属用户组也能修改，和设置权限类似，用户可以通过图形界面来设置，或执行chown命令来修改。
<p>我们先执行ls -l看看目录情况：</p><div class="codeblock"><code>[root@localhost ~]# ls -l<br />总用量 368<br />-rwxrwxrwx  1 root root  12172  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root     48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root 331844 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root     48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root    512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root     48  9月  6 13:06 vmware</code></div><br />
可以看到conkyrc.sample文件的所属用户组为root，所有者为root。
<p>执行下面命令，把conkyrc.sample文件的所有权转移到用户user:<br /></p><div class="codeblock"><code>[root@localhost ~]# chown user conkyrc.sample<br />[root@localhost ~]# ls -l<br /><br />总用量 368<br />-rwxrwxrwx  1 user root  12172  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root     48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root 331844 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root     48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root   9776 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root    512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root     48  9月  6 13:06 vmware</code></div><br />
要改变所属组，可使用下面命令：<br /><div class="codeblock"><code>[root@localhost ~]# chown :users conkyrc.sample<br />[root@localhost ~]# ls -l<br />总用量 368<br />-rwxrwxrwx  1 user users  12172  8月 15 23:18 conkyrc.sample<br />drwxr-xr-x  2 root root      48  9月  4 16:32 Desktop<br />-r--r--r--  1 root root  331844 10月 22 21:08 libfreetype.so.6<br />drwxr-xr-x  2 root root      48  8月 12 22:25 MyMusic<br />-rwxr-xr-x  1 root root    9776 11月  5 08:08 net.eth0<br />-rwxr-xr-x  1 root root    9776 11月  5 08:08 net.eth1<br />-rwxr-xr-x  1 root root     512 11月  5 08:08 net.lo<br />drwxr-xr-x  2 root root      48  9月  6 13:06 vmware</code></div><p>要修改目录的权限，使用－R参数就可以了，方法和前面一样。</p><p><font id="7" size="4"><b>七、关于本文；</b></font></p><p><font id="8" size="4"><b>八、参考文档；</b></font></p><p><font id="9" size="4"><b>九、相关文档；</b></font></p></div>
<img src ="http://www.cppblog.com/erran/aggbug/118609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-24 10:28 <a href="http://www.cppblog.com/erran/archive/2010/06/24/118609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wine中文乱码的终极解决方法 </title><link>http://www.cppblog.com/erran/archive/2010/06/22/118464.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 22 Jun 2010 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/22/118464.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118464.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/22/118464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118464.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118464.html</trackback:ping><description><![CDATA[wine中文乱码的终极解决方法
            
			
			<div id="appShareOpt"></div>
            

			
			                新装的wine中文全是乱码，需要修改一下几个配置文件，找到一篇比较详细的配置说明，分享一下：<br />
“ wine下中文的配置方案<br />
步骤：
<p>1. 初始设置</p><p>运行 winecfg，把模拟的 Windows 系统设置为 Windows XP 或者 Windows 2000。</p><p>2. 准备字体</p><p>为了让 Windows 应用程序看上去更美观，所以需要 Windows 下面的字体。</p><p>由于我已经将 simsun.ttc 复制到 /usr/share/fonts/windows/ 目录中了。所以我只需要在 ~/.wine/drive_c/windows/fonts/ 目录中为 simsun.ttc 创建一个符号连接：</p><p>cd ~/.wine/drive_c/windows/fonts<br />
ln -s /usr/share/fonts/windows/simsun.ttc simsun.ttc<br />
ln -s /usr/share/fonts/windows/simsun.ttc simfang.ttc</p><p>创建一个 simfang.ttc 是许多 Windows 应用默认使用 simfang.ttc 字体。<br />
3. 修改 ~/.wine/system.reg</p><p>装好字体后，还要修改一下 Wine 的注册表设置，指定与字体相关的设置：</p><p>gedit ~/.wine/system.reg</p><p>（一定要使用 gedit 或其他支持 gb2312/utf8 编码的编辑器修改这些文件，否则文件中的中文可能变乱码）</p><p>搜索： LogPixels<br />
找到的行应该是：[System\\CurrentControlSet\\Hardware Profiles\\Current\\Software\\Fonts]<br />
将其中的：<br />
"LogPixels"=dword:00000060</p><p>改为：<br />
"LogPixels"=dword:00000070</p><p>搜索： FontSubstitutes<br />
找到的行应该是：[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes]<br />
将其中的：<br />
"MS Shell Dlg"="Tahoma"<br />
"MS Shell Dlg 2″="Tahoma"</p><p>改为：<br />
"MS Shell Dlg"="SimSun"<br />
"MS Shell Dlg 2″="SimSun"</p><p>4. 修改 ~/.wine/drive_c/windows/win.ini</p><p>gedit ~/.wine/drive_c/windows/win.ini<br />
在文件末尾加入：</p><p>[Desktop]<br />
menufontsize=13<br />
messagefontsize=13<br />
statusfontsize=13<br />
IconTitleSize=13</p><br /><p></p><p><span>    5.  <font color="#ff0000">最关键的一步，网上很多文章中没有提到的一步</font>──把下面的代码保存为zh.reg，然后终端执行regedit zh.reg。从Windows目录下的Fonts里的simsun.ttc复制到/home/user/.wine/drive_c/windows/fonts里面。<br />
       代码:<br />
       REGEDIT4<br /><br />
       [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]<br />
       "Arial"="simsun"<br />
       "Arial CE,238"="simsun"<br />
       "Arial CYR,204"="simsun"<br />
       "Arial Greek,161"="simsun"<br />
       "Arial TUR,162"="simsun"<br />
       "Courier New"="simsun"<br />
       "Courier New CE,238"="simsun"<br />
       "Courier New CYR,204"="simsun"<br />
       "Courier New Greek,161"="simsun"<br />
       "Courier New TUR,162"="simsun"<br />
       "FixedSys"="simsun"<br />
       "Helv"="simsun"<br />
       "Helvetica"="simsun"<br />
       "MS Sans Serif"="simsun"<br />
       "MS Shell Dlg"="simsun"<br />
       "MS Shell Dlg 2"="simsun"<br />
       "System"="simsun"<br />
       "Tahoma"="simsun"<br />
       "Times"="simsun"<br />
       "Times New Roman CE,238"="simsun"<br />
       "Times New Roman CYR,204"="simsun"<br />
       "Times New Roman Greek,161"="simsun"<br />
       "Times New Roman TUR,162"="simsun"<br />
       "Tms Rmn"="simsun"</span></p><p>之后，中文正常显示哈哈！</p><img src ="http://www.cppblog.com/erran/aggbug/118464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-22 15:04 <a href="http://www.cppblog.com/erran/archive/2010/06/22/118464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：wine安装手记</title><link>http://www.cppblog.com/erran/archive/2010/06/22/118458.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 22 Jun 2010 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/22/118458.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118458.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/22/118458.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118458.html</trackback:ping><description><![CDATA[
		<table align="center" border="0" cellpadding="0" cellspacing="0" width="660">
				<tbody>
						<tr>
								<td class="Ftext1" align="center" height="30">wine安装手记</td>
						</tr>
						<tr>
								<td>
										<table align="center" border="0" cellpadding="0" cellspacing="0" width="80%">
												<tbody>
														<tr>
																<td bgcolor="#cccccc" height="1">
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td align="center" height="40">来源: 
 ChinaUnix博客 　日期：
2006.04.13 13:31　</td>
						</tr>
						<tr>
								<td> </td>
						</tr>
						<tr>
								<td class="F14">
本来不打算写这篇文章，感觉似乎是鸡肋。不过看到我博客上另一篇《Wine模拟器使用手册》点击率很高，忍不住想说两句，不想让其它的学习者多绕弯子，文笔不好，理解不深，切望指出。<br />
                                                    ——若诲和尚<br /><br />
那一篇《Wine模拟器使用手册》，是我转来的文章。不过近日我又找到一个另一个翻译此文的地址。个人认为更好：<br /><a href="http://www.bsdmap.com/UNIX_html/Wine_manual/" target="_blank">http://www.bsdmap.com/UNIX_html/Wine_manual/</a><br />
，看过这些译文后，我就开始自己安装和配置wine，我用的是wine-0.9.10和wine-0.9.11两个版本，安装过程没什么大的问题，不过后来配置的时候遇到了一些问题，于是上wine的官司方网站上去查资料找到了原文：<br /><a href="http://www.winehq.org/site/docs/wineusr-guide/index" target="_blank">http://www.winehq.org/site/docs/wineusr-guide/index</a><br />
才发现新版本的wine的文档更新了。这里先将我安装的过程写下，现在我在抽空翻译新文档的配置方法那一节。稍后也会放上来。<br /><br />
配置手记：<br />
Wine全名（Wine Is Not a Emulator,Wine不仅仅是一个模拟器）<br />
准备：首先Linux系统里要GCC编译器，没有GCC下面的工作无法进行。虽然网上有各个发行版本的wine
RPM安装包，但是还是建议自己编译，不然有很多模windows的库文件将会不能调用，wine的功能等于减半。经常有人说为什么别人模拟到的软件为什
么自己模拟不到，很多时候就是因为这个原因做成的。<br />
卸载wine：<br />
如果先前安装过wine，那么在安装新版wine前必须拆卸原先的wine。检验方法：$ wine
--version，如果显示了wine版本号，那么系统就存要wine。卸载方法：rpm -e
wine，如果原先是源码安装的，进入原编wine的目录，执行make unistall就O了。<br />
然后要下载wine（非RPM包）：<br />
我用的是wine0.9.10，下载wine-0.9.10.tar.bz2。有两种方法编译wine。<br />
方法一（简单，推荐），用wineinstall安装：用普通用户登录，解压wine-0.9.10.tar.bz2，解压后的目录就是原码安装包，进入该目录。运行：./tools/wineinstall按提示回答就可以了。<br />
实际操作：<br />
用普通用户登录，将tar包复制到/home/当前user目录下（我的是gener)<br />
cd /home/gener<br />
tar jxvf wine-0.9.10.tar.bz2<br />
cd wine-0.9.10<br />
./tools/wineinstall<br />
之后它会运行./configure，然后显示：We need to install wine as root user, do you
want us to build wine,'su root' and install Wine?  Enter 'no' to
continue without installing(yes/no)<br />
yes 回车<br />
如果在此处出现错误，请检查此命令的输出，如果他没有找到一些需要的包，而你又希望使用那个包提供的功能时，请安装相应的 devel 包。<br />
如果你root用户设置了密码，还会提示你输入密码。<br />
待屏幕上出现：<br />
Installation complete for now. Good luck (this is still alpha software).<br />
If you have problems with WINE, please read the documentation first,<br />
as many kinds of potential problems are explained there.<br />
则表示安装成功了。<br />
方法二：<br />
以root用户登入。进入wine源码安装包的目录，依次执行<br />
./configure<br />
make depend<br />
make<br />
make install<br />
实际操作：<br />
以root登录，将wine-0.9.10.tar.bz2复制到/root/目录下面。<br />
打开终端，运行：<br />
cd /root<br />
tar jxvf wine-0.9.10.tar.bz2<br />
cd wine-0.9.10<br />
./configure --prefix=/usr/local/wine <br />
如果在此处出现错误，请检查此命令的输出，如果他没有找到一些需要的包，而你又希望使用那个包提供的功能时，请安装相应的 devel 包.<br />
make depend &amp;&amp; make &amp;&amp; make install<br />
wine<br />
至此，wine安装成功。<br /><br />
附带一些笔记：<br />
（1）wine运行程序的两种方式<br />
   wine可以用两种不同的度式运行应用程序：作为预编译的windows二进制程序，或者作为本地编译X11（X
Windows系统）应用程序。前者使用模拟把一个windows应用程序连接到wine库上。通过wine安装或是简单的把windows程序复制到
Linux系统下，就可以直接用模拟器运行windows程序。后者运wine运行windows程序必须有这个应用程序的源代码。不用本地
windows编译它，象对其它UNIX应用程序所做的一样，要用本地Linux编译它－例如gcc－并连接上Wine库。这些本地连接的应用程序被称为
Winelib应用程序。wine应用的重点要前种使用方式。<br />
（2）windows程序的三个方面<br />
   ·注册表——windows中重要的数据库，作用大，不用说；<br />
   ·目录结构——就用程序期望在指定的预先决定的位置找到或安装东西，期望这些目录存在。由于与UNIX目录结构不同，并且多数这些位置是硬编(hardcode)，然后通过Windows API和注册表来查找。在Wine安装上这是必需注意的一个方面；<br />
 
 ·系统DLL——在windows中它们通常驻留在system（或system32）目录中。一些windows应用程序运行时需要装载这些DLL，
会尝试到上述目录中去查找并装载。当应用程序要求一个DLL而Wine不能装载它们自己的内部DLL（.so文件）时，Wine不模拟不存在的文件（舍弃
模拟）；<br />
   
注：wine安装两种方法，一是用wine小组制作的自动Wine安装脚本tool/wineinstall，它可以做我们认为必要的所有事情。另外一种
是常规的编译安装方式，除非用户很清楚正在做什么，否则不推荐运行常规的configure&amp;&amp;make
depend&amp;&amp;make
install方式。此时，建议用户可以使用tools/wineinstall来建立一个配置文件、安装注册表、并建立自己的目录结构。<br />
（3）系统DLL的解决方案<br />
 
 ·对于那些在运行中只需检查文件是否存在来确定调用的程序。Wine的解决方法是建立伪DLL文件来模拟真实DLL文件使程序运行起来。如果存在这样的
问题，可以在system目录中建立一个空文件来让应用程序认为它存在，而在实质调用时wine装载它的内置DLL替代。（wine原文手册写道：可惜
wineinstll工具不具有建立这种空文件的功能）；<br />
   ·而有些DLL文件，应用程序不仅要查询其是否存在（如DirectX版本），而且还要从原资源文件中查询资源的版本。这样空文件不起作用，因此必须有完整版本资源的安装文件。wine当前正处理这个问题。因此，目前要解决这些问题仍需要真实的DLL文件。<br />
   ·对于另外一些wine目前未很好实现（或根本未实现）的DLL，如果不拥有一个真实的windows，则有的人会找到所需的DLL。<br /><br />
=================================END================================<br /><br /><br /><b>本文来自ChinaUnix博客，如果查看原文请点：</b><a href="http://blog.chinaunix.net/u/15744/showart_99270.html" target="_blank">http://blog.chinaunix.net/u/15744/showart_99270.html</a></td>
						</tr>
						<tr>
								<td align="right" height="20"> 　 <span class="STYLE1" id="postcount2"></span></td>
						</tr>
						<tr>
								<td> </td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/erran/aggbug/118458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-22 13:15 <a href="http://www.cppblog.com/erran/archive/2010/06/22/118458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：QT的信号与槽机制介绍</title><link>http://www.cppblog.com/erran/archive/2010/06/18/118185.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 18 Jun 2010 10:11:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/18/118185.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118185.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/18/118185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118185.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="31">
				<tbody sizcache="1" sizset="31">
						<tr valign="top">
								<td width="10" height="18">
								</td>
								<td width="100%">
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
										<br />
										<a class="bctl" href="http://www.ibm.com/developerworks/cn/">
												<font color="#999999" size="2">developerWorks 中国</font>
										</a>
										<span class="bct">
												<font color="#cccccc" size="2">  &gt;  </font>
										</span>
										<a class="bctl" href="http://www.ibm.com/developerworks/cn/linux/">
												<font color="#999999" size="2">Linux</font>
										</a>
										<font size="2">
												<font color="#cccccc">
														<span class="bct">  &gt;</span>
														<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
														<br />
												</font>
										</font>
										<h1>QT的信号与槽机制介绍</h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
										<img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="32">
				<tbody sizcache="2" sizset="33">
						<tr valign="top" sizcache="2" sizset="33">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%" sizcache="2" sizset="33">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0" sizcache="2" sizset="33">
												<tbody sizcache="2" sizset="34">
														<tr sizcache="2" sizset="34">
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td sizcache="2" sizset="34">
																		<table cellspacing="0" cellpadding="0" width="150" border="0" sizcache="2" sizset="34">
																				<tbody sizcache="1" sizset="34">
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="35">
																				<tbody sizcache="2" sizset="36">
																						<tr sizcache="2" sizset="36">
																								<td class="no-padding" width="150" sizcache="2" sizset="36">
																										<table cellspacing="0" cellpadding="0" width="143" border="0" sizcache="2" sizset="36">
																												<script language="JavaScript" type="text/javascript">
																														<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td><td width="122"><p><b><a class="smallplainlink" href="javascript:print()">打印本页</a></b></p></td></tr>');
//-->
																												</script>
																												<tbody sizcache="1" sizset="36">
																														<tr valign="top">
																																<td width="8">
																																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																</td>
																																<td width="16">
																																		<img height="16" alt="将打印机的版面设置成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" />
																																</td>
																																<td width="122">
																																		<p>
																																				<b>
																																						<a class="smallplainlink" href="javascript:print()">打印本页</a>
																																				</b>
																																		</p>
																																</td>
																														</tr>
																														<noscript>
																														</noscript>
																														<form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" sizcache="1" sizset="37">
																																<input type="hidden" value="信号与槽作为QT的核心机制在QT编程中有着广泛的应用，本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。" name="body" />
																																<input type="hidden" value="QT的信号与槽机制介绍" name="subject" />
																																<input type="hidden" value="cn" name="lang" />
																																<script language="JavaScript" type="text/javascript">
																																		<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																																</script>
																																<tr valign="top">
																																		<td width="8">
																																				<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																		</td>
																																		<td width="16">
																																				<img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" />
																																		</td>
																																		<td width="122">
																																				<p>
																																						<a class="smallplainlink" href="javascript:document.email.submit();">
																																								<b>
																																										<font color="#5c81a7" size="2">将此页作为电子邮件发送</font>
																																								</b>
																																						</a>
																																				</p>
																																		</td>
																																</tr>
																																<noscript>
																																		<tr valign="top">
																																				<td width="8">
																																						<img height="1" alt="" src="//www.ibm.com/i/c.gif" width="8" />
																																				</td>
																																				<td width="16">
																																						<img height="16" alt="" src="//www.ibm.com/i/c.gif" width="16" />
																																				</td>
																																				<td class="small" width="122">
																																						<p>
																																								<span class="ast">未显示需要 JavaScript 的文档选项</span>
																																						</p>
																																				</td>
																																		</tr>
																																</noscript>
																														</form>
																												</tbody>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<!-- this content will be automatically generated across all content areas -->
																		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
										<p>级别： 初级</p>
										<p>
												<a href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#author">
														<font color="#996699">唐新华</font>
												</a>(<a href="mailto:xhsmart@263.net?subject=QT的信号与槽机制介绍&amp;cc=xhsmart@263.net"><font color="#5c81a7">xhsmart@263.net</font></a>), 软件工程师<br /></p>
										<p>2001 年 6 月 01 日</p>
										<blockquote>信号与槽作为QT的核心机制在QT编程中有着广泛的应用，本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。</blockquote>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>QT是一个跨平台的C++ GUI应用构架，它提供了丰富的窗口部件集，具有面向对象、易于扩展、真正的组件编程等特点，更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台：MS/WINDOWS-95、98、NT和2000；UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX；EMBEDDED-支持framebuffer的Linux平台。伴随着KDE的快速发展和普及，QT很可能成为Linux窗口平台上进行软件开发时的GUI首选。</p>
										<p>
												<a name="1">
														<span class="atitle">概述</span>
												</a>
										</p>
										<p>
										</p>
										<p>信号和槽机制是QT的核心机制，要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口，应用于对象之间的通信，它是QT的核心特性，也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制，它独立于标准的C/C++语言，因此要正确的处理信号和槽，必须借助一个称为moc（Meta Object Compiler）的QT工具，该工具是一个C++预处理程序，它为高层次的事件处理自动生成所需要的附加代码。</p>
										<p>在我们所熟知的很多GUI工具包中，窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作，这个回调函数通常是一个指向某个函数的指针。但是，在QT中信号和槽取代了这些凌乱的函数指针，使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数，他们是类型完全安全的，不会像回调函数那样产生core dumps。</p>
										<p>所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时，信号就由该对象发射(emit)出去，这就是对象所要做的全部事情，它不知道另一端是谁在接收这个信号。这就是真正的信息封装，它确保对象被当作一个真正的软件组件来使用。槽用于接收信号，但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且，对象并不了解具体的通信机制。</p>
										<p>你可以将很多信号与单个的槽进行连接，也可以将单个的信号与很多的槽进行连接，甚至于将一个信号与另外一个信号相连接也是可能的，这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之，信号与槽构造了一个强大的部件编程机制。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="38">
												<tbody sizcache="1" sizset="38">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="39">
												<tbody sizcache="2" sizset="40">
														<tr align="right" sizcache="2" sizset="40">
																<td sizcache="2" sizset="40">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="40">
																				<tbody sizcache="1" sizset="40">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="2">
														<span class="atitle">信号</span>
												</a>
										</p>
										<p>
										</p>
										<p>当某个信号对其客户或所有者发生的内部状态发生改变，信号被一个对象发射。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时，与其相关联的槽将被立刻执行，就象一个正常的函数调用一样。信号-槽机制完全独立于任何GUI事件循环。只有当所有的槽返回以后发射函数（emit）才返回。 如果存在多个槽与某个信号相关联，那么，当这个信号被发射时，这些槽将会一个接一个地 执行，但是它们执行的顺序将会是随机的、不确定的，我们不能人为地指定哪个先执行、哪 个后执行。</p>
										<p>信号的声明是在头文件中进行的，QT的signals关键字指出进入了信号声明区，随后即可 声明自己的信号。例如，下面定义了三个信号：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="41">
												<tbody sizcache="1" sizset="41">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						signals: 
		void mySignal();
		void mySignal(int x);
		void mySignalParam(int x,int y);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>在上面的定义中，signals是QT的关键字，而非C/C++的。接下来的一行void mySignal() 定义了信号mySignal，这个信号没有携带参数；接下来的一行void mySignal(int x)定义 了重名信号mySignal，但是它携带一个整形参数，这有点类似于C++中的虚函数。从形式上 讲信号的声明与普通的C++函数是一样的，但是信号却没有函数体定义，另外，信号的返回 类型都是void，不要指望能从信号返回什么有用信息。</p>
										<p>信号由moc自动产生，它们不应该在.cpp文件中实现。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="42">
												<tbody sizcache="1" sizset="42">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="43">
												<tbody sizcache="2" sizset="44">
														<tr align="right" sizcache="2" sizset="44">
																<td sizcache="2" sizset="44">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="44">
																				<tbody sizcache="1" sizset="44">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="3">
														<span class="atitle">槽</span>
												</a>
										</p>
										<p>
										</p>
										<p>槽是普通的C++成员函数，可以被正常调用，它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时，这个槽就会被调用。槽可以有参数，但槽的参数不能有缺省值。</p>
										<p>既然槽是普通的成员函数，因此与其它的函数一样，它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C++成员函数一样，槽函数也分为三种类型，即public slots、private slots和protected slots。</p>
										<ul>
												<li>public slots：在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用，你可以创建彼此互不了解的对象，将它们的信号与槽进行连接以便信息能够正确的传递。 
</li>
												<li>protected slots：在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽，它们是类实现的一部分，但是其界面接口却面向外部。 
</li>
												<li>private slots：在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。 </li>
										</ul>
										<p>槽也能够声明为虚函数，这也是非常有用的。</p>
										<p>槽的声明也是在头文件中进行的。例如，下面声明了三个槽：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="45">
												<tbody sizcache="1" sizset="45">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						public slots:
		void mySlot();
		void mySlot(int x);
		void mySignalParam(int x,int y);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="46">
												<tbody sizcache="1" sizset="46">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="47">
												<tbody sizcache="2" sizset="48">
														<tr align="right" sizcache="2" sizset="48">
																<td sizcache="2" sizset="48">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="48">
																				<tbody sizcache="1" sizset="48">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="4">
														<span class="atitle">信号与槽的关联</span>
												</a>
										</p>
										<p>
										</p>
										<p>通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联，这样当发射者发射信号时，接收者的槽函数将被调用。该函数的定义如下：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="49">
												<tbody sizcache="1" sizset="49">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">  	 	  			bool QObject::connect ( const QObject * sender, const char * signal, 
		const QObject * receiver, const char * member ) [static]</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL()，当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话，那么在connect调用中接收者参数可以省略。</p>
										<p>例如，下面定义了两个对象：标签对象label和滚动条对象scroll，并将valueChanged()信号与标签对象的setNum()相关联，另外信号还携带了一个整形参数，这样标签总是显示滚动条所处位置的值。</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="50">
												<tbody sizcache="1" sizset="50">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						QLabel     *label  = new QLabel;
    QScrollBar *scroll = new QScrollBar;
    QObject::connect( scroll, SIGNAL(valueChanged(int)),
                      label,  SLOT(setNum(int)) );</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>一个信号甚至能够与另一个信号相关联，看下面的例子：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="51">
												<tbody sizcache="1" sizset="51">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class MyWidget : public QWidget
    {
    public:
        MyWidget();
    ...
    signals:
        void aSignal();
    ...
    private:
    ...
        QPushButton *aButton;
    };
    MyWidget::MyWidget()
    {
        aButton = new QPushButton( this );
        connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );
    }</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>在上面的构造函数中，MyWidget创建了一个私有的按钮aButton，按钮的单击事件产生的信号clicked()与另外一个信号aSignal()进行了关联。这样一来，当信号clicked()被发射时，信号aSignal()也接着被发射。当然，你也可以直接将单击事件与某个私有的槽函数相关联，然后在槽中发射aSignal()信号，这样的话似乎有点多余。</p>
										<p>当信号与槽没有必要继续保持关联时，我们可以使用disconnect函数来断开连接。其定义如下：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="52">
												<tbody sizcache="1" sizset="52">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						bool QObject::disconnect ( const QObject * sender, const char * signal, 
		const Object * receiver, const char * member ) [static]</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这个函数断开发射者中的信号与接收者中的槽函数之间的关联。</p>
										<p>有三种情况必须使用disconnect()函数：</p>
										<ul sizcache="2" sizset="53">
												<li sizcache="2" sizset="53">
														<p>断开与某个对象相关联的任何对象。这似乎有点不可理解，事实上，当我们在某个对象中定义了一个或者多个信号，这些信号与另外若干个对象中的槽相关联，如果我们要切断这些关联的话，就可以利用这个方法，非常之简洁。</p>
														<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="53">
																<tbody sizcache="1" sizset="53">
																		<tr>
																				<td class="code-outline">
																						<pre class="displaycode">disconnect( myObject, 0, 0, 0 )
或者
myObject-&gt;disconnect()</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
												</li>
												<li sizcache="2" sizset="54">
														<p>断开与某个特定信号的任何关联。</p>
														<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="54">
																<tbody sizcache="1" sizset="54">
																		<tr>
																				<td class="code-outline">
																						<pre class="displaycode">disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
或者
myObject-&gt;disconnect( SIGNAL(mySignal()) )</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
												</li>
												<li sizcache="2" sizset="55">
														<p>断开两个对象之间的关联。</p>
														<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="55">
																<tbody sizcache="1" sizset="55">
																		<tr>
																				<td class="code-outline">
																						<pre class="displaycode">disconnect( myObject, 0, myReceiver, 0 )
或者
myObject-&gt;disconnect(  myReceiver )</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
												</li>
										</ul>
										<p>在disconnect函数中0可以用作一个通配符，分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者sender不能为0，其它三个参数的值可以等于0。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="56">
												<tbody sizcache="1" sizset="56">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="57">
												<tbody sizcache="2" sizset="58">
														<tr align="right" sizcache="2" sizset="58">
																<td sizcache="2" sizset="58">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="58">
																				<tbody sizcache="1" sizset="58">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="5">
														<span class="atitle">元对象工具</span>
												</a>
										</p>
										<p>
										</p>
										<p>元对象编译器moc（meta object compiler）对C++文件中的类声明进行分析并产生用于初始化元对象的C++代码，元对象包含全部信号和槽的名字以及指向这些函数的指针。</p>
										<p>moc读C++源文件，如果发现有Q_OBJECT宏声明的类，它就会生成另外一个C++源文件，这个新生成的文件中包含有该类的元对象代码。例如，假设我们有一个头文件mysignal.h，在这个文件中包含有信号或槽的声明，那么在编译之前 moc 工具就会根据该文件自动生成一个名为mysignal.moc.h的C++源文件并将其提交给编译器；类似地，对应于mysignal.cpp文件moc工具将自动生成一个名为mysignal.moc.cpp文件提交给编译器。</p>
										<p>元对象代码是signal/slot机制所必须的。用moc产生的C++源文件必须与类实现一起进行编译和连接，或者用#include语句将其包含到类的源文件中。moc并不扩展#include或者#define宏定义,它只是简单的跳过所遇到的任何预处理指令。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="59">
												<tbody sizcache="1" sizset="59">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="60">
												<tbody sizcache="2" sizset="61">
														<tr align="right" sizcache="2" sizset="61">
																<td sizcache="2" sizset="61">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="61">
																				<tbody sizcache="1" sizset="61">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="6">
														<span class="atitle">程序样例</span>
												</a>
										</p>
										<p>
										</p>
										<p>这里给出了一个简单的样例程序，程序中定义了三个信号、三个槽函数，然后将信号与槽进行了关联，每个槽函数只是简单的弹出一个对话框窗口。读者可以用kdevelop生成一个简单的QT应用程序，然后将下面的代码添加到相应的程序中去。</p>
										<p>信号和槽函数的声明一般位于头文件中，同时在类声明的开始位置必须加上Q_OBJECT语句，这条语句是不可缺少的，它将告诉编译器在编译之前必须先应用moc工具进行扩展。关键字signals指出随后开始信号的声明，这里signals用的是复数形式而非单数，siganls没有public、private、protected等属性，这点不同于slots。另外，signals、slots关键字是QT自己定义的，不是C++中的关键字。</p>
										<p>信号的声明类似于函数的声明而非变量的声明，左边要有类型，右边要有括号，如果要向槽中传递参数的话，在括号中指定每个形式参数的类型，当然，形式参数的个数可以多于一个。</p>
										<p>关键字slots指出随后开始槽的声明，这里slots用的也是复数形式。</p>
										<p>槽的声明与普通函数的声明一样，可以携带零或多个形式参数。既然信号的声明类似于普通C++函数的声明，那么，信号也可采用C++中虚函数的形式进行声明，即同名但参数不同。例如，第一次定义的void mySignal()没有带参数，而第二次定义的却带有参数，从这里我们可以看到QT的信号机制是非常灵活的。</p>
										<p>信号与槽之间的联系必须事先用connect函数进行指定。如果要断开二者之间的联系，可以使用函数disconnect。</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="62">
												<tbody sizcache="1" sizset="62">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						//tsignal.h
...
class TsignalApp:public QMainWindow
{
	Q_OBJECT
	...
	//信号声明区
	signals: 
		//声明信号mySignal()
		void mySignal();
		//声明信号mySignal(int)
		void mySignal(int x);
		//声明信号mySignalParam(int,int)
		void mySignalParam(int x,int y);
	//槽声明区
	public slots: 
		//声明槽函数mySlot()
		void mySlot();
		//声明槽函数mySlot(int)
		void mySlot(int x);
		//声明槽函数mySignalParam (int，int)
		void mySignalParam(int x,int y);
}
...
//tsignal.cpp
...
TsignalApp::TsignalApp()
{
	...
	//将信号mySignal()与槽mySlot()相关联
	connect(this,SIGNAL(mySignal()),SLOT(mySlot())); 
	//将信号mySignal(int)与槽mySlot(int)相关联
	connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int))); 
	//将信号mySignalParam(int,int)与槽mySlotParam(int,int)相关联
	connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int))); 
}
// 定义槽函数mySlot()
void TsignalApp::mySlot()
{
	QMessageBox::about(this,"Tsignal", "This is a signal/slot sample without 
parameter.");
}
// 定义槽函数mySlot(int)
void TsignalApp::mySlot(int x)
{
	QMessageBox::about(this,"Tsignal", "This is a signal/slot sample with one 
parameter.");
}
// 定义槽函数mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
{
	char s[256];
	sprintf(s,"x:%d y:%d",x,y);
	QMessageBox::about(this,"Tsignal", s);
}
void TsignalApp::slotFileNew()
{
	//发射信号mySignal()
	emit mySignal();
	//发射信号mySignal(int)
	emit mySignal(5);
	//发射信号mySignalParam(5，100)
	emit mySignalParam(5,100);
}</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="63">
												<tbody sizcache="1" sizset="63">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="64">
												<tbody sizcache="2" sizset="65">
														<tr align="right" sizcache="2" sizset="65">
																<td sizcache="2" sizset="65">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="65">
																				<tbody sizcache="1" sizset="65">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="7">
														<span class="atitle">应注意的问题</span>
												</a>
										</p>
										<p>
										</p>
										<p>信号与槽机制是比较灵活的，但有些局限性我们必须了解，这样在实际的使用过程中做到有的放矢，避免产生一些错误。下面就介绍一下这方面的情况。</p>
										<p>1．信号与槽的效率是非常高的，但是同真正的回调函数比较起来，由于增加了灵活性，因此在速度上还是有所损失，当然这种损失相对来说是比较小的，通过在一台i586-133的机器上测试是10微秒（运行Linux），可见这种机制所提供的简洁性、灵活性还是值得的。但如果我们要追求高效率的话，比如在实时系统中就要尽可能的少用这种机制。</p>
										<p>2．信号与槽机制与普通函数的调用一样，如果使用不当的话，在程序执行时也有可能产生死循环。因此，在定义槽函数时一定要注意避免间接形成无限循环，即在槽中再次发射所接收到的同样信号。例如,在前面给出的例子中如果在mySlot()槽函数中加上语句emit mySignal()即可形成死循环。</p>
										<p>3．如果一个信号与多个槽相联系的话，那么，当这个信号被发射时，与之相关的槽被激活的顺序将是随机的。</p>
										<p>4. 宏定义不能用在signal和slot的参数中。</p>
										<p>既然moc工具不扩展#define，因此，在signals和slots中携带参数的宏就不能正确地工作，如果不带参数是可以的。例如，下面的例子中将带有参数的宏SIGNEDNESS(a)作为信号的参数是不合语法的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="66">
												<tbody sizcache="1" sizset="66">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						#ifdef ultrix
    #define SIGNEDNESS(a) unsigned a
    #else
    #define SIGNEDNESS(a) a
    #endif
    class Whatever : public QObject 
    {
    [...]
    signals:
        void someSignal( SIGNEDNESS(a) );
    [...]
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>5. 构造函数不能用在signals或者slots声明区域内。</p>
										<p>的确，将一个构造函数放在signals或者slots区内有点不可理解，无论如何，不能将它们放在private slots、protected slots或者public slots区内。下面的用法是不合语法要求的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="67">
												<tbody sizcache="1" sizset="67">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class SomeClass : public QObject 
    {
        Q_OBJECT
    public slots:
        SomeClass( QObject *parent, const char *name )
            : QObject( parent, name ) {}  // 在槽声明区内声明构造函数不合语法
    [...]
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>6. 函数指针不能作为信号或槽的参数。</p>
										<p>例如，下面的例子中将void (*applyFunction)(QList*, void*)作为参数是不合语法的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="68">
												<tbody sizcache="1" sizset="68">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class someClass : public QObject 
    {
        Q_OBJECT
    [...]
    public slots:
        void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>你可以采用下面的方法绕过这个限制：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="69">
												<tbody sizcache="1" sizset="69">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">							typedef void (*ApplyFunctionType)(QList*, void*);
    class someClass : public QObject 
    {
        Q_OBJECT
    [...]
    public slots:
        void apply( ApplyFunctionType, char *);
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>7.信号与槽不能有缺省参数。</p>
										<p>既然signal-&gt;slot绑定是发生在运行时刻，那么，从概念上讲使用缺省参数是困难的。下面的用法是不合理的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="70">
												<tbody sizcache="1" sizset="70">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class SomeClass : public QObject 
    {
        Q_OBJECT
    public slots:
        void someSlot(int x=100); // 将x的缺省值定义成100，在槽函数声明中使用是错误的
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>8.信号与槽也不能携带模板类参数。</p>
										<p>如果将信号、槽声明为模板类参数的话，即使moc工具不报告错误，也不可能得到预期的结果。 例如，下面的例子中当信号发射时，槽函数不会被正确调用：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="71">
												<tbody sizcache="1" sizset="71">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						[...]
   public slots:
       void MyWidget::setLocation (pair&lt;int,int&gt; location);
   [...]
   public signals:
       void MyObject::moved (pair&lt;int,int&gt; location);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>但是，你可以使用typedef语句来绕过这个限制。如下所示：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="72">
												<tbody sizcache="1" sizset="72">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						typedef pair&lt;int,int&gt; IntPair; 
   [...]
   public slots:
       void MyWidget::setLocation (IntPair location);
   [...]
   public signals:
       void MyObject::moved (IntPair location);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这样使用的话，你就可以得到正确的结果。</p>
										<p>9.嵌套的类不能位于信号或槽区域内，也不能有信号或者槽。</p>
										<p>例如，下面的例子中，在class B中声明槽b()是不合语法的，在信号区内声明槽b()也是不合语法的。</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="73">
												<tbody sizcache="1" sizset="73">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class A 
    {
        Q_OBJECT
    public:
        class B 
    {
        public slots:   // 在嵌套类中声明槽不合语法
            void b();
        [....]
        };
    signals:
        class B 
    {
        // 在信号区内声明嵌套类不合语法
        void b();
        [....]
        }:
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>10.友元声明不能位于信号或者槽声明区内。</p>
										<p>相反，它们应该在普通C++的private、protected或者public区内进行声明。下面的例子是不合语法规范的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="74">
												<tbody sizcache="1" sizset="74">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class someClass : public QObject 
    {
        Q_OBJECT
    [...]
    signals: //信号定义区
        friend class ClassTemplate; // 此处定义不合语法
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<p>
												<a name="resources">
														<span class="atitle">参考资料 </span>
												</a>
										</p>
										<ul>
												<li>
														<a href="http://www.trolltech.com/">
																<font color="#5c81a7">QT</font>
														</a>
														<br />
														<br />
												</li>
												<li>
														<a href="http://www.kdevelop.org/">
																<font color="#5c81a7">KDevelop</font>
														</a>
														<br />
												</li>
										</ul>
										<br />
										<br />
										<p>
												<a name="author">
														<span class="atitle">关于作者</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="75">
												<tbody sizcache="1" sizset="75">
														<tr>
																<td colspan="3">
																		<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																</td>
														</tr>
														<tr valign="top" align="left">
																<td>
																		<p>
																		</p>
																</td>
																<td>
																		<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
																</td>
																<td width="100%">
																		<p>唐新华 软件工程师。Email: <a href="mailto:xhsmart@263.net?cc=xhsmart@263.net"><font color="#5c81a7">xhsmart@263.net</font></a></p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/erran/aggbug/118185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-18 18:11 <a href="http://www.cppblog.com/erran/archive/2010/06/18/118185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:VC2008 express编译QT4.5</title><link>http://www.cppblog.com/erran/archive/2010/06/18/118146.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 18 Jun 2010 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/18/118146.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118146.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/18/118146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118146.html</trackback:ping><description><![CDATA[
		<div class="tit">VC2008 express编译QT4.5（转帖）</div>
		<div class="date">2009-11-26 15:35</div>
		<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
				<tbody>
						<tr>
								<td>
										<div class="cnt" id="blog_text">
												<p>原文：<a href="http://hi.baidu.com/fairysky/blog/item/883cd1b474c33c7b8bd4b219.html">http://hi.baidu.com/fairysky/blog/item/883cd1b474c33c7b8bd4b219.html</a></p>
												<p>
												</p>
												<p>最新的QT4.5发布了，增加了LGPL2.1协议，实在是众望所归啊。。。</p>
												<p>参考资料：</p>
												<p>1、 <a href="http://blog.5d.cn/user43/JjYyBb/200810/502508.html" target="_blank">【转贴】VC 2005 下如何编译安装并开发 QT 4.4.0 应用程序 </a></p>
												<p>2、 <a href="http://blog.csdn.net/lhfeng/archive/2007/12/03/1913671.aspx" target="_blank">qt4:qt编译安装信息的解读</a></p>
												<p>3、 <a href="http://blog.csdn.net/lhfeng/archive/2007/12/03/1913431.aspx" target="_blank">qt4:windows下编译qt 4.3.2</a></p>
												<p>4、 <a href="http://www.cevx.com/bbs/viewthread.php?tid=16036" target="_blank">网友已编译好的Qt开源版下载(含Debug库)</a> （主要是参考它的configure参数）</p>
												<p>还有QT安装目录下的“ install ”文件</p>
												<p>
												</p>
												<p>
														<font color="#993366" size="4">
																<strong>一、下载QT4.5（本文仅讨论LGPL/Free Downloads）</strong>
														</font>
												</p>
												<p>下载地址：<a href="http://download.qtsoftware.com/qt/source/qt-win-opensource-src-4.5.0.zip">http://download.qtsoftware.com/qt/source/qt-win-opensource-src-4.5.0.zip</a></p>
												<p>解压，假定解压到E:\qt-win-opensource-src-4.5.0 （解压路径不要包含空白，另外也建议不要包含中文名称），解压后目录层次：</p>
												<div align="center" forimg="1">
														<a href="http://hiphotos.baidu.com/fairysky/pic/item/883cd1b457471d528ad4b276.jpg" target="_blank">
																<div forimg="1">
																		<img class="blogimg" height="383" src="http://hiphotos.baidu.com/fairysky/pic/item/883cd1b457471d528ad4b276.jpg" width="260" border="0" small="0" />
																</div>
														</a>
												</div>
												<p>
														<font color="#993366" size="4">
																<strong>二、设置环境变量</strong>
														</font>
												</p>
												<p>set QTDIR=E:\qt-win-opensource-src-4.5.0</p>
												<p>set path=%path%;%QTDIR%\bin</p>
												<p>
														<font color="#993366">
																<strong>方法：</strong>
														</font>
												</p>
												<p>“我的电脑”-&gt;“属性”-&gt;“高级”-&gt;“环境变量”，弹出一个对话框，</p>
												<p>然后“xxx的用户变量”-&gt;“新建”，弹出一个输入对话框，输入：</p>
												<p>“变量名” --- QTDIR</p>
												<p>“变量值” --- E:\qt-win-opensource-src-4.5.0</p>
												<div align="center" forimg="1">
														<img class="blogimg" src="http://hiphotos.baidu.com/fairysky/pic/item/3ccdad1e55bc0b3f413417b3.jpg" border="0" small="0" />
												</div>
												<p>
														<font color="#993366">
																<strong>同上，修改path环境变量方法：</strong>
														</font>
												</p>
												<p>
														<font color="#000000">在“xxx的用户变量”中选择“PATH”，然后“编辑”，在“变量值”的最后输入“ ;%QTDIR%\bin ”（不带引号，注意有一个分号）</font>
												</p>
												<p align="center" forimg="1">
														<img class="blogimg" src="http://hiphotos.baidu.com/fairysky/pic/item/2b8cdac8a2fc3f377f3e6f85.jpg" border="0" small="0" />
												</p>
												<p align="left" forimg="1">
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>三、编译QT</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">1、在命令行设置好vc编译器环境变量（我是通过一个简单的批处理文件来设置好vc编译器的环境变量）</font>
												</p>
												<div style="CLEAR: both">
												</div>
												<div style="BACKGROUND-COLOR: #f9f7ed">
														<div style="BACKGROUND: #fdfdfd">
																<u>Batchfile语言</u>: <a href="http://www.fayaa.com/code/view//">vc编译器环境变量设置.bat</a></div>
														<div class="source" style="BACKGROUND-COLOR: #f9f7ed" jquery1236405784593="2">
																<span style="COLOR: #008000">1 </span>@<span style="COLOR: #0000ff">echo</span><span style="COLOR: #0000ff">off</span><br /><span style="COLOR: #008000">2 </span><span style="COLOR: #0000ff">call</span><span style="COLOR: #a31515">"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"</span> x86<br /><span style="COLOR: #008000">3 </span><br /><span style="COLOR: #008000">4 </span><span style="COLOR: #008000">rem 在这里，调用sqlite3的环境变量设置批处理是因为在后来qt编译时要用到sqlite，qt需要知道sqlite的include和lib以及dll的位置</span><br /><span style="COLOR: #f810b0">5 </span><span style="COLOR: #0000ff">call</span><span style="COLOR: #a31515">"D:\环境变量批处理设置\sqlite3环境变量.bat"</span></div>
												</div>
												<p align="left" forimg="1">过程我就不多说了（如果有不明白的，可以留言；我个人认为尽管在windows下有VS IDE，但是作为一个编程人员，掌握基本的命令行编译知识应该是一个基本的技能）</p>
												<p align="left" forimg="1">如果设置好了vc编译器环境变量，运行" cl/? " （不包括引号），如果输出了cl.exe帮助说明信息，则表示vc编译器环境变量设置成功。</p>
												<p align="left" forimg="1">可以通过" set path "，" set include "，" set lib " 命令查看path、include、lib环境变量</p>
												<p align="left" forimg="1">
														<font color="#993366">2、配置QT（configure</font>）</p>
												<p align="left" forimg="1">在命令行设置好vc编译器环境变量之后，进入到QT解压目录（%QTDIR%），然后输入" configure/? "（configure位于%QTDIR%目录下），查看configure的帮助。</p>
												<p align="left" forimg="1">
														<font color="#993366">下面是我的configure配置参数：</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">1、编译shared版（默认编译为shared版，不需要设置），并且编译debug和release两个版本（<font color="#3366ff">-debug-release</font>）<br />2、使用vc2008（包括express版）(<font color="#3366ff">-platform win32-msvc2008</font>)<br />3、使用qt自带的zlib、gif、libpng、libmng、libtiff、libjpeg (</font>
														<font color="#3366ff">-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg</font>
														<font color="#993366">)<br />4、编译数据库插件支持sqlite、odbc（需要相应的C/C++头文件和库的支持）(</font>
														<font color="#3366ff">-plugin-sql-sqlite -plugin-sql-odbc</font>
														<font color="#993366">)<br />5、不支持qt3 (<font color="#3366ff">-no-qt3support</font>)</font>
												</p>
												<p align="left" forimg="1">
														<font color="#ff0000">其中第4条，我们已经在</font>
														<a href="http://www.fayaa.com/code/view//">
																<font color="#ff0000">vc编译器环境变量设置.bat</font>
														</a>
														<font color="#ff0000">进行了设置，通过</font>
												</p>
												<p align="left" forimg="1">
														<font color="#ff0000">
																<span style="COLOR: #0000ff">call</span>
																<span style="COLOR: #a31515">"D:\环境变量批处理设置\sqlite3环境变量.bat"</span>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#ff0000">设置了sqlite的include和lib以及dll的搜索路径（dll搜索路径设置在path环境变量中）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">附加<br />6、无mmx指令集支持 (<font color="#3366ff">-no-mmx</font>)<br />7、无3dnow指令集支持 (<font color="#3366ff">-no-3dnow</font>)<br />8、无sse和sse2指令集支持 (<font color="#3366ff">-no-sse -no-sse2</font>)<br />9、无direct3d支持（我用不上direct3d，默认不编译direct3d）<br />10、无openssl支持 (<font color="#3366ff">-no-openssl</font>)<br />11、无dbus支持（dbus是一个类似于IPC的实现，不过我好像用不上） (<font color="#3366ff">-no-dbus</font>)<br />12、无phonon支持以及phonon向后兼容性支持（phonon是一个基于kde的多媒体支持，</font>
														<font color="#993366">并且主要是用于那些比较古老的编译器，在我的机器上不需要） （<font color="#3366ff">-no-phonon -no-phonon-backend</font>）<br />13、不编译webkit模块（类似于浏览器的东西，我个人不需要） （<font color="#3366ff">-no-webkit</font>）<br />14、不支持脚本工具scripttools （<font color="#3366ff">-no-scripttools</font>）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">生成工程文件相关<br />15、无生成sln以及vcproj文件（生成的sln文件好像不好使，不能用vc2008打开），只生成makefile文件 （<font color="#3366ff">-no-dsp -no-vcproj</font>）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">上述只是我个人的需求，大家可以根据自己的需要进行调整（我这么做只是为了尽可能的缩短编译时间）</font>
												</p>
												<p align="left" forimg="1">
														<strong>
																<font color="#993366">configure -debug-and-release -platform win32-msvc2008 -qt-zlib -qt-gif -qt</font>
														</strong>
														<strong>
																<font color="#993366">-libpng -qt-libmng -qt-libtiff -qt-libjpeg -plugin-sql-sqlite -plugin-sql-</font>
														</strong>
														<strong>
																<font color="#993366">odbc -no-qt3support -no-mmx -no-3dnow -no-sse -no-sse2 -no-openssl -no-dbus </font>
														</strong>
														<strong>
																<font color="#993366">-no-phonon -no-phonon-backend -no-webkit -no-scripttools -no-dsp -no-vcproj</font>
														</strong>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">configure大概需要执行5~10分钟，如果对configure产生的信息不清楚的话，可以看看这篇文章（<a href="http://blog.csdn.net/lhfeng/archive/2007/12/03/1913671.aspx" target="_blank">qt4:qt编译安装信息的解读</a>）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">configure.exe主要是做两件事：</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">1）编译qmake，并将编译好的qmake.exe拷贝到bin目录下（这又是之前要添加" %QTDIR%\bin ”到path环境变量中的原因）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">2）生成makefile文件（包括编译qt的makefile文件以及examples、demos、tools等的makefiles文件）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>三、编译QT</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">在QT的解压目录下执行nmake（确保configure.exe运行成功，configure会在QT的解压目录下生成一个Makefile文件）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">为了缩短编译时间，我们可以现将examples和demos目录转移（例如新建一个文件夹，然后将这2个目录移到该目录下），这样nmake在编译到examples和demos时会报错，然后退出编译过程</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">然后就是漫长的等待了~~~（编译的时候就去干点别的吧，运动运动<img src="http://img.baidu.com/hi/jx/j_0028.gif" />）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">
																<u>
																		<font color="#0000ff">按照我上面的操作，编译完成qt大概需要1个小时；占用硬盘2G左右；如果完整的编译qt、examples、demos），那么大概需要4~6个小时，占用硬盘10G左右</font>
																</u>
																<img src="http://img.baidu.com/hi/jx/j_0016.gif" />）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>四、清理收尾工作</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">编译完成之后，要进行清理，不然那么多硬盘被占用了，太心疼了</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">运行" nmake confclean "（参见" install "文件），这样清理完成之后，整个qt解压目录大小约为770M左右</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>五、编译demos</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">将examples、demos目录移回原位，如果想要运行demos，可以通过命令行进入到demos目录下（保证环境变量已设置好），然后运行nmake（又是一段漫长的时间，1个小时左右）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">编译demos完成之后，在qt解压目录下的bin目录中有一个" qtdemo.exe "，运行</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">同样地，我们也要进行清理工作，进入到demos目录（同上，要保证环境变量已设置好），运行" nmake clean "</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">这样我们就能看到一部分的运行示例了（为什么是部分？因为qtdemo.exe不仅仅是包含demos目录中的例子，同样也包含examples目录中的例子，如果想要查看完整的qtdemo.exe，还需要编译examples，方法同demos）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>最后，将Qt路径添加到VC编译环境中。（参见</strong>
																<a href="http://blog.5d.cn/user43/JjYyBb/200810/502508.html" target="_blank">【转贴】VC 2005 下如何编译安装并开发 QT 4.4.0 应用程序 </a>
																<strong>）</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>工具-&gt;选项-&gt;项目和解决方案-&gt;VC++目录，</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>在包含文件一栏添加： E:\qt-win-opensource-src-4.5.0\include\QtGui；E:\qt-win-opensource-src-4.5.0\include\QtCore；E:\qt-win-opensource-src-4.5.0\include</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>在库文件一栏添加E:\qt-win-opensource-src-4.5.0\lib</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>将QT安装路径添加到Path系统环境变量中，例如：E:\qt-win-opensource-src-4.5.0\bin（这一步可以省略，在本文的“ <font size="4">二、设置环境变量</font> ”已经设置好了）</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<font size="5">
																		<strong>至此，QT和vc编译环境基本上配置完成了<img src="http://img.baidu.com/hi/ldw/w_0014.gif" /></strong>
																</font>
														</font>
												</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/erran/aggbug/118146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-18 10:18 <a href="http://www.cppblog.com/erran/archive/2010/06/18/118146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Qt-WinCE安装、开发及部署全解</title><link>http://www.cppblog.com/erran/archive/2010/06/18/118145.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 18 Jun 2010 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/18/118145.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118145.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/18/118145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118145.html</trackback:ping><description><![CDATA[
		<h1 id="subject_tpc">Qt-WinCE安装、开发及部署全解</h1>
		<div class="c">
		</div>
		<div id="mag_tpc">
				<blockquote class="blockquote block-img">
						<span class="s3">
								<b class="fl black">
										<a href="http://www.qtcn.org/bbs/u.php?action=show&amp;uid=41447" target="_blank">penguinx</a>
								</b>  发表于: 2008-07-31<br /><br />管理提醒: </span>本帖被 XChinux 从 Qt for Embedded Linux 移动到本区(2010-02-07) </blockquote>
		</div>
		<div class="tpc_content">
				<div class="c" id="p_tpc">
				</div>
				<div class="f14" id="read_tpc">
						<div align="center">
								<font face="新宋体 ">Qt-WinCE</font>
								<font face="新宋体 ">全解<br /></font>
						</div>
						<font face="新宋体 ">声明：</font>
						<font face="新宋体 ">花费了三天时间，周转各大网站，终于在今天将自己的第一个</font>
						<font face="新宋体 ">
								<font face="times ">Qt</font>
						</font>
						<font face="新宋体 ">程序在“小</font>
						<font face="新宋体 ">
								<font face="times ">I(SAMSUNG i718+)</font>
						</font>
						<font face="新宋体 ">”上跑了起来！<br /></font>
						<br />
						<font face="新宋体 ">
								<br />
						</font>
						<br />
						<div align="center">
								<font face="新宋体 ">一、</font>
								<font face="新宋体 ">
										<font face="times ">Qt</font>
								</font>
								<font face="新宋体 ">
								</font>
								<font face="新宋体 ">嵌入式环境的搭建<br /></font>
						</div>
						<font face="times ">
								<font face="times ">a)        </font>
						</font>
						<font face="新宋体 ">首先，下载</font>
						<font face="新宋体 ">
								<font face="times ">Qt</font>
						</font>
						<font face="新宋体 ">的嵌入式开发包</font>
						<font face="times ">
								<font face="新宋体 ">qt-embedded-wince-opensource-src-4.4.0.zip</font>
								<br />
						</font>
						<br />
						<font face="times ">
								<font face="times ">b)        </font>
						</font>
						<font face="宋体 ">然后，下载</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">。</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">c)        </font>
						</font>
						<font face="宋体 ">最后，下载一个嵌入式开发的</font>
						<font face="times ">SDK</font>
						<font face="宋体 ">，如</font>
						<font face="times ">Windows Mobile 5.0 Pocket PC SDK,</font>
						<font face="宋体 ">可以在微软的官方网站上下载到！</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">d)        </font>
						</font>
						<font face="宋体 ">还有一个是同步的软件</font>
						<font face="times ">Microsoft ActiveSync4.5</font>
						<font face="宋体 ">中文简体版。</font>
						<br />
						<br />
						<font face="times ">------------------------------------------</font>
						<font face="宋体 ">安</font>
						<font face="times ">----</font>
						<font face="宋体 ">装</font>
						<font face="times ">----------------------------------</font>
						<br />
						<font face="times ">
								<font face="times ">e)        </font>
						</font>
						<font face="宋体 ">首先安装</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">，很简单，按照向导来，在自定义安装中务必选择“智能设备开发”。</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">f)          </font>
						</font>
						<font face="宋体 ">关于</font>
						<font face="times ">Microsoft ActiveSync4.5</font>
						<font face="宋体 ">的安装更是“</font>
						<font face="times ">straightforward</font>
						<font face="宋体 ">”。在此不再多说！</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">g)        </font>
						</font>
						<font face="宋体 ">然后，安装</font>
						<font face="times ">Windows Mobile</font>
						<font face="宋体 ">或是其它版本的</font>
						<font face="times ">SDK</font>
						<font face="宋体 ">，可以用自定义的</font>
						<font face="times ">SDK!</font>
						<font face="宋体 ">简单</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">h)        </font>
						</font>
						<font face="宋体 ">比较麻烦的就是</font>
						<font face="新宋体 ">
								<font face="times ">qt-embedded-wince</font>
						</font>
						<font face="新宋体 ">的安装。参照下面的步骤：①、解压，将解压后的文件夹放到一个不含空格的路径中，如我的：</font>
						<font face="times ">f:\penguinx\qt_wince</font>
						<font face="宋体 ">，</font>
						<font face="times ">qt_wince</font>
						<font face="宋体 ">即为此文件夹。然后设置环境变量：右键“我的电脑”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“属性”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">点“高级”标签－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“环境变量”选项－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">在</font>
						<font face="times ">"PATH"</font>
						<font face="宋体 ">中添加路径“</font>
						<font face="times ">f:\penguinx\qt_wince \ bin</font>
						<font face="宋体 ">”。</font>
						<font face="times ">OK</font>
						<font face="宋体 ">！②编译前戏。首先，配置编译选项，进行</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">的命令行中，进入解压的文件夹，然后执行如下：</font>
						<font face="times ">configure -platform win32-msvc2005 -xplatform wince50standard-armv4i-msvc2005</font>
						<font face="宋体 ">可以根据自己的板子及手机配置来选择其它的嵌入式的</font>
						<font face="times ">xplatfrom</font>
						<font face="宋体 ">。这个过程可能需要十几分钟。执行完后，再次在</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">中设置临时的环境变量，编译时要用到：如下：</font>
						<br />
						<br />
						<font face="times ">      set INCLUDE=D:\Program Files\Microsoft Visual Studio 8\VC\ce\include;D:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Include\Armv4i<br /></font>
						<br />
						<font face="times ">
						</font>
						<br />
						<br />
						<font face="times ">      set LIB=D:\Program Files\Microsoft Visual Studio 8\VC\ce\lib\armv4i;D:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Lib\ARMV4I<br /></font>
						<br />
						<font face="times ">
						</font>
						<br />
						<br />
						<font face="times ">      set PATH=D:\Program Files\Microsoft Visual Studio 8\VC\ce\bin\x86_arm;%PATH%<br /></font>
						<br />
						<div align="left">
								<font face="times ">              </font>
								<font face="宋体 ">在此我期望能根据自己的软件安装情况将上面的目录“拿来主义”一下。设</font>
								<font face="times ">
								</font>
								<font face="宋体 ">置完后，执行</font>
								<font face="times ">nmake</font>
								<font face="宋体 ">，过两、三个钟头后，你就可以</font>
								<font face="times ">Enjoy your journey. <br /></font>
						</div>
						<font face="新宋体 ">最后，执行nmake，安装完毕！我的Qt-WinCE安装在　</font>
						<font face="times ">f:\penguinx\qt_wince<br /></font>
						<br />
						<font face="新宋体 ">
								<br />
						</font>
						<br />
						<div align="center">
								<font face="新宋体 ">二、编译Qt-WinCE程序<br /></font>
						</div>
						<font face="宋体 ">命令行法</font>
						<font face="times ">(</font>
						<font face="宋体 ">不用</font>
						<font face="times ">IDE)</font>
						<font face="宋体 ">：</font>
						<br />
						<br />
						<font face="宋体 ">首先、用</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行进入要编译的程序目录</font>
						<font face="times ">(</font>
						<font face="宋体 ">此目录最好就在安装目录</font>
						<font face="times ">f:\penguinx\qt_wince</font>
						<font face="宋体 ">下</font>
						<font face="times ">)</font>
						<font face="宋体 ">，执行</font>
						<font face="times ">&lt;<font size="3"> f:\penguinx\qt_wince</font> &gt;bin\qmake.exe –project –o example.pro  </font>
						<font face="宋体 ">其中，</font>
						<font face="times ">Install Qt Path</font>
						<font face="宋体 ">为你的</font>
						<font face="times ">Qt-WinCE</font>
						<font face="宋体 ">的安装目录。这个时候，可以产生</font>
						<font face="times ">example.pro</font>
						<font face="宋体 ">文件。</font>
						<br />
						<br />
						<font face="宋体 ">然后、就是产生</font>
						<font face="times ">Makefile</font>
						<font face="宋体 ">的时候：在</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行下输入：</font>
						<br />
						<br />
						<font face="times ">f:\penguinx\qt_wince\bin\qmake -spec ..\mkspecs\wince50standard-armv4i-msvc2005 -win32 -o Makefile example.pro </font>
						<font face="宋体 ">此时，恭喜你，</font>
						<font face="times ">Makefile</font>
						<font face="宋体 ">文件已经产生。</font>
						<br />
						<br />
						<font face="times ">      </font>
						<font face="宋体 ">最后，就是用</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">来编译和链接程序了。先将安装时的环境变量</font>
						<font face="times ">(</font>
						<font face="宋体 ">三个</font>
						<font face="times ">set)</font>
						<font face="宋体 ">在当前</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行下重新执行一遍。否则会出现如下错误：</font>
						<br />
						<br />
						<font face="times ">cl: </font>
						<font face="宋体 ">命令行</font>
						<font face="times ">warning D9002 :</font>
						<font face="宋体 ">忽略未知选项“</font>
						<font face="times ">-QRarch4T</font>
						<font face="宋体 ">”</font>
						<br />
						<br />
						<font face="times ">cl: </font>
						<font face="宋体 ">命令行</font>
						<font face="times ">warning D9002 :</font>
						<font face="宋体 ">忽略未知选项“</font>
						<font face="times ">-QRinterwork-return</font>
						<font face="宋体 ">”</font>
						<br />
						<br />
						<font face="times ">main.cpp<br /></font>
						<br />
						<font face="times ">mainwindow.cpp<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : error C2<br /></font>
						<br />
						<font face="times ">146: </font>
						<font face="宋体 ">语法错误</font>
						<font face="times ">: </font>
						<font face="宋体 ">缺少“</font>
						<font face="times ">;</font>
						<font face="宋体 ">”</font>
						<font face="times ">(</font>
						<font face="宋体 ">在标识符“</font>
						<font face="times ">wceMenu</font>
						<font face="宋体 ">”的前面</font>
						<font face="times ">)<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : error C4<br /></font>
						<br />
						<font face="times ">430: </font>
						<font face="宋体 ">缺少类型说明符</font>
						<font face="times ">- </font>
						<font face="宋体 ">假定为</font>
						<font face="times ">int</font>
						<font face="宋体 ">。注意</font>
						<font face="times ">: C++ </font>
						<font face="宋体 ">不支持默认</font>
						<font face="times ">int<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : error C4<br /></font>
						<br />
						<font face="times ">430: </font>
						<font face="宋体 ">缺少类型说明符</font>
						<font face="times ">- </font>
						<font face="宋体 ">假定为</font>
						<font face="times ">int</font>
						<font face="宋体 ">。注意</font>
						<font face="times ">: C++ </font>
						<font face="宋体 ">不支持默认</font>
						<font face="times ">int<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : warning<br /></font>
						<br />
						<font face="times ">C4183: </font>
						<font face="宋体 ">“</font>
						<font face="times ">wceMenu</font>
						<font face="宋体 ">”</font>
						<font face="times ">: </font>
						<font face="宋体 ">缺少返回类型；假定为返回“</font>
						<font face="times ">int</font>
						<font face="宋体 ">”的成员函数。</font>
						<br />
						<br />
						<font face="宋体 ">然后，执行</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">，看着一行的白银流失完后，就是金子</font>
						<font face="times ">(</font>
						<font face="宋体 ">你的</font>
						<font face="times ">exe</font>
						<font face="宋体 ">文件</font>
						<font face="times ">)</font>
						<font face="宋体 ">了。</font>
						<br />
						<br />
						<font face="宋体 ">注意：在执行</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">的时候，可能会看到如下错误信息：</font>
						<br />
						<br />
						<font face="times ">        link /LIBPATH:"f:\penguinx\qt_wince\lib" /LIBPATH:"f:\penguinx\qt_wince\<br /></font>
						<br />
						<font face="times ">lib" /NOLOGO /NODEFAULTLIB:OLDNAMES.LIB /DEBUG /SUBSYSTEM:WINDOWSCE,5.00 /MACHIN<br /></font>
						<br />
						<font face="times ">E:THUMB /OUT:debug\node.exe @C:\DOCUME~1\User\LOCALS~1\Temp\nm6B3.tmp<br /></font>
						<br />
						<font face="times ">tmp\obj\debug_shared\main.obj : fatal error LNK1112: </font>
						<font face="宋体 ">模块计算机类型“</font>
						<font face="times ">X</font>
						<font face="times ">86</font>
						<font face="宋体 ">”</font>
						<font face="宋体 ">与目标</font>
						<br />
						<br />
						<font face="宋体 ">计算机类型“</font>
						<font face="times ">THUMB</font>
						<font face="宋体 ">”冲突</font>
						<br />
						<br />
						<font face="times ">NMAKE : fatal error U1077: “"D:\Program Files\Microsoft Visual Studio 8\VC\ce\b<br /></font>
						<br />
						<font face="times ">in\x86_arm\link.EXE"</font>
						<font face="宋体 ">”</font>
						<font face="times ">: </font>
						<font face="宋体 ">返回代码“</font>
						<font face="times ">0x</font>
						<font face="times ">458</font>
						<font face="宋体 ">”</font>
						<br />
						<br />
						<font face="times ">      </font>
						<font face="宋体 ">这种错误搞的我很无奈，我不执行</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">，直接执行</font>
						<font face="times ">nmake release</font>
						<font face="宋体 ">就没有这种错误？这种错误可能是因为“环境变量”中“</font>
						<font face="times ">PATH</font>
						<font face="宋体 ">”中设置了“</font>
						<font face="times ">f:\penguinx\qt_wince\bin</font>
						<font face="宋体 ">”。在我把这个变量去掉后，重新打开</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行</font>
						<font face="times ">(</font>
						<font face="宋体 ">因为得重新读取</font>
						<font face="times ">PATH</font>
						<font face="宋体 ">变量</font>
						<font face="times ">)</font>
						<font face="宋体 ">。然后按照上面的步骤做下来，最后用</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">重新执行一遍，很好很流畅！</font>
						<br />
						<br />
						<div align="center">
								<font face="宋体 ">三、</font>
								<font face="times ">Qt –WinCE</font>
								<font face="宋体 ">程序的部署（非打包）</font>
								<font face="新宋体 ">
										<br />
								</font>
						</div>
						<font size="3">
								<font face="times ">      </font>
								<font face="宋体 ">可以直接把上面开发的</font>
						</font>
						<font face="times ">*.exe</font>
						<font face="宋体 ">文件和其需要的</font>
						<font face="times ">*.dll</font>
						<font face="宋体 ">一起</font>
						<font face="times ">CP</font>
						<font face="宋体 ">到一个目录中，这些</font>
						<font face="times ">dll</font>
						<font face="宋体 ">一般有：</font>
						<br />
						<br />
						<font face="times ">D:\Program Files\Microsoft Visual Studio 8\VC\ce\Dll\armv4i\ msvcr80.dll<br /></font>
						<br />
						<font face="times ">F:\penguinx\wince_vs2005\lib\ QtCore4.dll<br /></font>
						<br />
						<font face="times ">F:\penguinx\wince_vs2005\lib\QtGui4.dll<br /></font>
						<br />
						<font face="宋体 ">其它的根据自己项目的需要</font>
						<font face="times ">CP</font>
						<font face="宋体 ">下，就行了。</font>
						<br />
						<br />
						<font face="times ">      </font>
						<font face="宋体 ">如果想将程序部署成</font>
						<font face="times ">*.cab</font>
						<font face="宋体 ">形式的，在上面的“解决方案”中，点“文件”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“新建”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“项目”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">点“其它”，其中有关于智能设备部署的，就它了</font>
						<font face="times ">(</font>
						<font face="宋体 ">我在实验室机子上开发的，回来写手记，所以具体的操作记的不是非常清楚，将就！</font>
						<font face="times ">)</font>
						<font face="宋体 ">。根据向导建立后，在新建的</font>
						<font face="times ">cab</font>
						<font face="宋体 ">项目中点“属性”，最后，生成就行了。</font>
						<font face="times ">CP</font>
						<font face="宋体 ">到板子就可以运行了。</font>
						<br />
						<br />
						<font face="宋体 ">注意：所有的</font>
						<font face="times ">CP</font>
						<font face="宋体 ">都是用</font>
						<font face="times ">ActiveSync</font>
						<font face="宋体 ">软件通过</font>
						<font face="times ">USB</font>
						<font face="宋体 ">传输的，当然可以用其它传输手段，最终能上板子就行。</font>
						<br />
						<br />
						<font face="times ">-Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189<br /></font>
						<br />
						<font face="宋体 ">注意在</font>
						<font face="times ">WinCE</font>
						<font face="宋体 ">部署时的版本，如果设备上的</font>
						<font face="times ">WinCE</font>
						<font face="宋体 ">版本比开发用的版本低的话，将显示“</font>
						<font face="times ">****, </font>
						<font face="宋体 ">需要更新的</font>
						<font face="times ">Windows</font>
						<font face="宋体 ">版本”云云。</font>
						<br />
						<br />
						<font face="times ">/SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB<br /></font>
						<br />
						<font face="times ">/SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB<br /></font>
						<br />
						<font face="times ">
						</font>
						<br />
						<br />
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/118145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-18 10:16 <a href="http://www.cppblog.com/erran/archive/2010/06/18/118145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> root默认密码忘记后的解决方法</title><link>http://www.cppblog.com/erran/archive/2010/06/17/118055.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Thu, 17 Jun 2010 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/17/118055.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118055.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/17/118055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118055.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118055.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">
				<b>一. lilo引导</b>
		</p>
		<p style="TEXT-INDENT: 2em">1. 在出现 lilo: 提示时键入 linux single </p>
		<p style="TEXT-INDENT: 2em">Boot: linux single </p>
		<p style="TEXT-INDENT: 2em">2. 回车可直接进入linux单用户模式 </p>
		<p style="TEXT-INDENT: 2em">3. vi /etc/passwd </p>
		<p style="TEXT-INDENT: 2em">删除root项中的密码 </p>
		<p style="TEXT-INDENT: 2em">(这里也可以直接使用passwd命令重新设置root的密码) </p>
		<p style="TEXT-INDENT: 2em">4. reboot重启，root密码为空 </p>
		<p style="TEXT-INDENT: 2em">
				<b>二. grub引导</b>
		</p>
		<p style="TEXT-INDENT: 2em">1. 在出现grub画面时，选择linux引导项，然后按e键 </p>
		<p style="TEXT-INDENT: 2em">
				<span id="ad">2. 选择以kernel开头的一行，再按e 键，在此行的末尾，按空格键后输入single，以回车键来退出<a class="vLink9999" id="vad_3" onmouseover="if(typeof(showTitle)!='undefined'){this.title='';window.clearTimeout(hideTO);showTitle(event, this, 3,'');}" title="" style="FONT-SIZE: 1em" onclick="" onmouseout="if(typeof(showTitle)!='undefined'){mouseIsOverLayer = false; mouseOverWhileLoad = false; hideTO = window.setTimeout('checkIfMouseOverLayer()',500);}" href="http://action.utops.cc/click.jsp?adsId=412&amp;adsLeagueId=5&amp;adsUserId=1&amp;siteId=657&amp;siteLeagueId=5&amp;siteUserId=564&amp;scId=2&amp;adsType=98&amp;prices=1.51&amp;checkCode=d2bdf13ee9d8c17e047efcdff7d7a4c9_222.73.161.245&amp;click=1&amp;url=http%3A//www.foho.cc/totole/index.html&amp;v=0&amp;keyword=%u7F16%u8F91&amp;s=http%3A//www.linuxidc.com/Linux/2007-03/2789.htm&amp;rn=604818---2010-6-17-10:27:26" target="_blank">编辑</a>模式； </span>
		</p>
		<p style="TEXT-INDENT: 2em">
				<span id="ad">3. 回车返回，然后按b键<a class="vLink9999" id="vad_2" onmouseover="if(typeof(showTitle)!='undefined'){this.title='';window.clearTimeout(hideTO);showTitle(event, this, 2,'');}" title="%u9E21%u7CBE%u5347%u7EA7%u7248 @utops.cc" style="FONT-SIZE: 1em" onclick="" onmouseout="if(typeof(showTitle)!='undefined'){mouseIsOverLayer = false; mouseOverWhileLoad = false; hideTO = window.setTimeout('checkIfMouseOverLayer()',500);}" href="http://action.utops.cc/click.jsp?adsId=426&amp;adsLeagueId=5&amp;adsUserId=1&amp;siteId=657&amp;siteLeagueId=5&amp;siteUserId=564&amp;scId=2&amp;adsType=98&amp;prices=1.51&amp;checkCode=4028d89b967eab8c643fd3ec95287239_222.73.161.245&amp;click=1&amp;url=http%3A//www.totole.com.cn&amp;v=0&amp;keyword=%u542F%u52A8&amp;s=http%3A//www.linuxidc.com/Linux/2007-03/2789.htm&amp;rn=682334---2010-6-17-10:27:26" target="_blank">启动</a>，即可直接进入linux单用户模式 </span>
		</p>
		<p style="TEXT-INDENT: 2em">4. vi /etc/passwd </p>
		<p style="TEXT-INDENT: 2em">删除root项中的密码 </p>
		<p style="TEXT-INDENT: 2em">(这里也可以直接使用passwd命令重新设置root的密码) </p>
		<p style="TEXT-INDENT: 2em">5、reboot重启，root密码为空 </p>
		<p style="TEXT-INDENT: 2em">
				<b>三、可以使用linux启动软盘引导</b>
		</p>
		<p style="TEXT-INDENT: 2em">出现boot后，输入linux single </p>
		<p style="TEXT-INDENT: 2em">可进入单用户模式； </p>
		<p style="TEXT-INDENT: 2em">修改或删除root密码；<br /></p>
		<p style="TEXT-INDENT: 2em">
				<b>四、使用Linux 系统安装盘 </b>
		</p>
		<p style="TEXT-INDENT: 2em">
				<span id="ad">如果你既没做系统启动软盘，同时多系统的引导LILO 和GRUB 又被删除，那么只能<a class="vLink9999" id="vad_0" onmouseover="if(typeof(showTitle)!='undefined'){this.title='';window.clearTimeout(hideTO);showTitle(event, this, 0,'');}" title="%u9C9C%u8D1D%u9732 @utops.cc" style="FONT-SIZE: 1em" onclick="" onmouseout="if(typeof(showTitle)!='undefined'){mouseIsOverLayer = false; mouseOverWhileLoad = false; hideTO = window.setTimeout('checkIfMouseOverLayer()',500);}" href="http://action.utops.cc/click.jsp?adsId=428&amp;adsLeagueId=5&amp;adsUserId=1&amp;siteId=657&amp;siteLeagueId=5&amp;siteUserId=564&amp;scId=2&amp;adsType=98&amp;prices=1.51&amp;checkCode=9d06b3d8ec57221f7c3a81014b765b3b_222.73.161.245&amp;click=1&amp;url=http%3A//www.totole.com.cn&amp;v=0&amp;keyword=%u4F7F%u7528&amp;s=http%3A//www.linuxidc.com/Linux/2007-03/2789p2.htm&amp;rn=994363---2010-6-17-10:38:9" target="_blank">使用</a>Linux 系统安装盘来恢复root的密码。 </span>
		</p>
		<p style="TEXT-INDENT: 2em">用第一张Linux 系统安装盘启动，出现boot 提示符后输入： </p>
		<p style="TEXT-INDENT: 2em">oot: linux rescue </p>
		<p style="TEXT-INDENT: 2em">此时系统进入救援模式，然后根据提示完成： </p>
		<p style="TEXT-INDENT: 2em">1.选择语言和键盘格式； </p>
		<p style="TEXT-INDENT: 2em">2.选择是否配置网卡，一般系统因网络不需要，所以可以选择否跳过网卡配置； </p>
		<p style="TEXT-INDENT: 2em">3.选择是否让系统查找硬盘上的<a title="RedHat" href="http://www.linuxidc.com/topicnews.aspx?tid=10">RedHat</a> Linux 系统，选择继续； </p>
		<p style="TEXT-INDENT: 2em">4.系统显示硬盘上的系统已经被找到，并挂载在/mnt/sysimage 下； </p>
		<p style="TEXT-INDENT: 2em">5.进入拯救状态，可重新设置root 的密码： </p>
		<p style="TEXT-INDENT: 2em"># chroot/mnt/sysimage (让系统成为根环境) </p>
		<p style="TEXT-INDENT: 2em"># cd /mnt/sysimage </p>
		<p style="TEXT-INDENT: 2em"># passwd root </p>
		<p style="TEXT-INDENT: 2em">
				<b>五、卸下硬盘挂到别的机器上更改</b>
		</p>
		<p style="TEXT-INDENT: 2em">如果不怕麻烦的话，还可以把安装linux的硬盘卸下后挂到其他系统环境下同样是去修改/etc/passwd文件，修改过后保存即可； </p>
		<p style="TEXT-INDENT: 2em">注： </p>
		<p style="TEXT-INDENT: 2em">1、在不同的linux系统下输入single的方式和方法可能有区别，希望能自己去尝试； </p>
		<p style="TEXT-INDENT: 2em">2、除了需要修改/etc/passwd文件外，可能也需要修改/etc/shadow文件，这是/etc/passwd密码文件的投影文件。</p>
<img src ="http://www.cppblog.com/erran/aggbug/118055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-17 10:40 <a href="http://www.cppblog.com/erran/archive/2010/06/17/118055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ARM &amp; DSP 。。。。。。。。。</title><link>http://www.cppblog.com/erran/archive/2008/07/20/56671.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sun, 20 Jul 2008 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2008/07/20/56671.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/56671.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2008/07/20/56671.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/56671.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/56671.html</trackback:ping><description><![CDATA[ <br />想买套嵌入式的硬件玩玩，查了很长时间的资料，确定了两个方面arm，dsp。公司做的东西主要用到的是dsp，惭愧的做软件的没什么机会接触那些。<br /><br />看了arm和dsp的比较，arm对操作系统的支持很好，控制性能很好，dsp的数据处理能力......<br /><br />想先买个arm板试试，考虑了很久最后还是决定买周立功的，虽然价格贵了点，资料全些。 MagicARM2410没查到价钱，估计在5k以上吧，没法接受..... smartArm2200不到2k，勉强还行。。<br /><br />今天是星期日，打他们代理电话，说只能周一到周五才能买到，晕死，周立功不会这么牛吧......还有这样做生意的。。。。。<br /><br />《打听到的DSP价格 SEED-XDSusbUSB2.0（1.7k含税公司采购价） SEED-DPS2812/Kit（1.5k左右吧） 》<br /><br /><br />这里应该有很多是做这个的吧，毕竟是Cpp blog， o(∩_∩)o... 恳请给点建议....<br /><br />《《《不好意思，我发到了“首页原创区”，谅解啊 o(∩_∩)o...》》》》<br /><img src ="http://www.cppblog.com/erran/aggbug/56671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2008-07-20 11:41 <a href="http://www.cppblog.com/erran/archive/2008/07/20/56671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：字节对齐详解</title><link>http://www.cppblog.com/erran/archive/2007/10/16/34383.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Tue, 16 Oct 2007 14:56:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2007/10/16/34383.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/34383.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2007/10/16/34383.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/34383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/34383.html</trackback:ping><description><![CDATA[
		<br />看了这篇（http://www.cppblog.com/Randy/archive/2007/10/15/34288.aspx）关于字节对其的随笔，觉得迷迷糊糊的，脑袋里只有字节对其这个概念，具体都忘的差不多了，又另外找了篇细读了下，总算理解了。<br /><br />来源：http://www.yuanma.org/data/2006/0723/article_1213.htm<br /><h3>一.什么是字节对齐,为什么要对齐?</h3><p>   
现代计算机中内存空间都是按照byte划分的，从理论上讲似乎对任何类型的变量的访问可以从任何地址开始，但实际情况是在访问特定类型变量的时候经常在特
定的内存地址访问，这就需要各种类型数据按照一定的规则在空间上排列，而不是顺序的一个接一个的排放，这就是对齐。<br />   
对齐的作用和原因：各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问
一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况，但是最常见的是如果不按照适合其平台要求对
数据存放进行对齐，会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始，如果一个int型（假设为32位系统）如果存放在偶地址开始的地方，那
么一个读周期就可以读出这32bit，而如果存放在奇地址开始的地方，就需要2个读周期，并对两次读出的结果的高低字节进行拼凑才能得到该32bit数
据。显然在读取效率上下降很多。</p><h3>二.字节对齐对程序的影响:</h3><p>    先让我们看几个例子吧(32bit,x86环境,gcc编译器):<br />设结构体如下定义：<br />struct A<br />{<br />    int a;<br />    char b;<br />    short c;<br />};<br />struct B<br />{<br />    char b;<br />    int a;<br />    short c;<br />};<br />现在已知32位机器上各种数据类型的长度如下:<br />char:1(有符号无符号同)    <br />short:2(有符号无符号同)    <br />int:4(有符号无符号同)    <br />long:4(有符号无符号同)    <br />float:4    double:8<br />那么上面两个结构大小如何呢?<br />结果是:<br />sizeof(strcut A)值为8<br />sizeof(struct B)的值却是12</p><p>结构体A中包含了4字节长度的int一个，1字节长度的char一个和2字节长度的short型数据一个,B也一样;按理说A,B大小应该都是7字节。<br />之所以出现上面的结果是因为编译器要对数据成员在空间上进行对齐。上面是按照编译器的默认设置进行对齐的结果,那么我们是不是可以改变编译器的这种默认对齐设置呢,当然可以.例如:<br />#pragma pack (2) /*指定按2字节对齐*/<br />struct C<br />{<br />    char b;<br />    int a;<br />    short c;<br />};<br />#pragma pack () /*取消指定对齐，恢复缺省对齐*/<br />sizeof(struct C)值是8。<br />修改对齐值为1：<br />#pragma pack (1) /*指定按1字节对齐*/<br />struct D<br />{<br />    char b;<br />    int a;<br />    short c;<br />};<br />#pragma pack () /*取消指定对齐，恢复缺省对齐*/<br />sizeof(struct D)值为7。<br />后面我们再讲解#pragma pack()的作用.</p><h3>三.编译器是按照什么样的原则进行对齐的?</h3><p>    先让我们看四个重要的基本概念：<br /><font color="#0000ff">1.数据类型自身的对齐值：<br /></font>  对于char型数据，其自身对齐值为1，对于short型为2，对于int,float,double类型，其自身对齐值为4，单位字节。<br /><font color="#3300ff">2.结构体或者类的自身对齐值：</font>其成员中自身对齐值最大的那个值。<br /><font color="#0000ff">3.指定对齐值</font>：#pragma pack (value)时的指定对齐值value。<br /><font color="#0000ff">4.数据成员、结构体和类的有效对齐值：</font>自身对齐值和指定对齐值中小的那个值。<br />有
了这些值，我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值，最重要。有效对齐N，就是
表示“对齐在N上”，也就是说该数据的"存放起始地址%N=0".而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是数
据结构的起始地址。结构体的成员变量要对齐排放，结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整数
倍，结合下面例子理解)。这样就不能理解上面的几个例子的值了。<br />例子分析：<br />分析例子B；<br />struct B<br />{<br />    char b;<br />    int a;<br />    short c;<br />};<br />假
设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值，在笔者环境下，该值默认为4。第一个成员变量b的自身对齐值是1，比指定或者默认指定
对齐值4小，所以其有效对齐值为1，所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a，其自身对齐值为4，所以有效对齐值也为4，
所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中，复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐值为
2，所以有效对齐值也是2，可以存放在0x0008到0x0009这两个字节空间中，符合0x0008%2=0。所以从0x0000到0x0009存放的
都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b）所以就是4，所以结构体的有效对齐值也是4。根据结构体圆整的要求，
0x0009到0x0000=10字节，（10＋2）％4＝0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B
共有12个字节,sizeof(struct B)=12;<font color="#3300ff">其实如果就这一个就来说它已将满足字节对齐了,
因为它的起始地址是0,因此肯定是对齐的,之所以在后面补充2个字节,是因为编译器为了实现结构数组的存取效率,试想如果我们定义了一个结构B的数组,那
么第一个结构起始地址是0没有问题,但是第二个结构呢?按照数组的定义,数组中所有元素都是紧挨着的,如果我们不把结构的大小补充为4的整数倍,那么下一
个结构的起始地址将是0x0000A,这显然不能满足结构的地址对齐了,因此我们要把结构补充成有效对齐大小的整数倍.其实诸如:对于char型数据，其
自身对齐值为1，对于short型为2，对于int,float,double类型，其自身对齐值为4，这些已有类型的自身对齐值也是基于数组考虑的,只
是因为这些类型的长度已知了,所以他们的自身对齐值也就已知了.<br /></font>同理,分析上面例子C：<br />#pragma pack (2) /*指定按2字节对齐*/<br />struct C<br />{<br />    char b;<br />    int a;<br />    short c;<br />};<br />#pragma pack () /*取消指定对齐，恢复缺省对齐*/<br />第
一个变量b的自身对齐值为1，指定对齐值为2，所以，其有效对齐值为1，假设C从0x0000开始，那么b存放在0x0000，符合0x0000%1=
0;第二个变量，自身对齐值为4，指定对齐值为2，所以有效对齐值为2，所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续
字节中，符合0x0002%2=0。第三个变量c的自身对齐值为2，所以有效对齐值为2，顺序存放<br />在0x0006、0x0007中，符合
0x0006%2=0。所以从0x0000到0x00007共八字节存放的是C的变量。又C的自身对齐值为4，所以C的有效对齐值为2。又8%2=0,C
只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8.</p><h3>四.如何修改编译器的默认对齐值?</h3><p>1.在VC IDE中，可以这样修改：[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改，默认是8字节。<br />2.在编码时，可以这样动态修改：#pragma pack .<font color="#ff0000">注意:是pragma而不是progma.</font></p><h3>五.针对字节对齐,我们在编程中如何考虑?</h3><p><br />   
如果在编程的时候要考虑节约空间的话,那么我们只需要假定结构的首地址是0,然后各个变量按照上面的原则进行排列即可,基本的原则就是把结构中的变量按照
类型大小从小到大声明,尽量减少中间的填补空间.还有一种就是为了以空间换取时间的效率,我们显示的进行填补空间进行对齐,比如:有一种使用空间换时间做
法是显式的插入reserved成员：<br />         struct A{<br />           char a;<br />           char reserved[3];//使用空间换时间<br />           int b;<br />}<br /><br />reserved成员对我们的程序没有什么意义,它只是起到填补空间以达到字节对齐的目的,当然即使不加这个成员通常编译器也会给我们自动填补对齐,我们自己加上它只是起到显式的提醒作用.</p><h3>六.字节对齐可能带来的隐患:</h3><p>    代码中关于对齐的隐患，很多是隐式的。比如在强制类型转换的时候。例如：<br />unsigned int i = 0x12345678;<br />unsigned char *p=NULL;<br />unsigned short *p1=NULL;</p><p>p=&amp;i;<br />*p=0x00;<br />p1=(unsigned short *)(p+1);<br />*p1=0x0000;<br />最后两句代码，从奇数边界去访问unsignedshort型变量，显然不符合对齐的规定。<br />在x86上，类似的操作只会影响效率，但是在MIPS或者sparc上，可能就是一个error,因为它们要求必须字节对齐.</p><h3>七.如何查找与字节对齐方面的问题:</h3><p>如果出现对齐或者赋值问题首先查看<br />1. 编译器的big little端设置<br />2. 看这种体系本身是否支持非对齐访问<br />3. 如果支持看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来标志其特殊访问操作。</p><p>八.相关文章:转自<a href="http://blog.csdn.net/goodluckyxl/archive/2005/10/17/506827.aspx"><u>http://blog.csdn.net/goodluckyxl/archive/2005/10/17/506827.aspx</u></a></p><quote></quote><p> ARM下的对齐处理 <br />from DUI0067D_ADS1_2_CompLib </p><p>3.13 type  qulifiers </p><p>有部分摘自ARM编译器文档对齐部分</p><p>对齐的使用:<br />1.__align(num)<br />   这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时<br />   就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。<br />   这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节<br />   对齐,但是不能让4字节的对象2字节对齐。<br />   __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。<br />   <br />2.__packed <br />  __packed是进行一字节对齐<br />  1.不能对packed的对象进行对齐<br />  2.所有对象的读写访问都进行非对齐访问<br />  3.float及包含float的结构联合及未用__packed的对象将不能字节对齐<br />  4.__packed对局部整形变量无影响<br />  5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定<br />  义为packed。<br />     __packed int* p;  //__packed int 则没有意义<br />  6.对齐或非对齐读写访问带来问题<br />  __packed struct STRUCT_TEST<br /> {<br />  char a;<br />  int b;<br />  char c;<br /> }  ;    //定义如下结构此时b的起始地址一定是不对齐的<br />         //在栈中访问b可能有问题,因为栈上数据肯定是对齐访问[from CL]<br />//将下面变量定义成全局静态不在栈上 <br />static char* p;<br />static struct STRUCT_TEST a;<br />void Main()<br />{<br /> __packed int* q;  //此时定义成__packed来修饰当前q指向为非对齐的数据地址下面的访问则可以</p><p> p = (char*)&amp;a;          <br /> q = (int*)(p+1);      <br /> <br /> *q = 0x87654321; <br />/*   <br />得到赋值的汇编指令很清楚<br />ldr      r5,0x20001590 ; = #0x12345678<br />[0xe1a00005]   mov      r0,r5<br />[0xeb0000b0]   bl       __rt_uwrite4  //在此处调用一个写4byte的操作函数 <br />      <br />[0xe5c10000]   strb     r0,[r1,#0]   //函数进行4次strb操作然后返回保证了数据正确的访问<br />[0xe1a02420]   mov      r2,r0,lsr #8<br />[0xe5c12001]   strb     r2,[r1,#1]<br />[0xe1a02820]   mov      r2,r0,lsr #16<br />[0xe5c12002]   strb     r2,[r1,#2]<br />[0xe1a02c20]   mov      r2,r0,lsr #24<br />[0xe5c12003]   strb     r2,[r1,#3]<br />[0xe1a0f00e]   mov      pc,r14<br />*/</p><p>/*<br />如果q没有加__packed修饰则汇编出来指令是这样直接会导致奇地址处访问失败<br />[0xe59f2018]   ldr      r2,0x20001594 ; = #0x87654321<br />[0xe5812000]   str      r2,[r1,#0]<br />*/</p>//这样可以很清楚的看到非对齐访问是如何产生错误的<br />//以及如何消除非对齐访问带来问题<br />//也可以看到非对齐访问和对齐访问的指令差异导致效率问题<br />}<br /><img src ="http://www.cppblog.com/erran/aggbug/34383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2007-10-16 22:56 <a href="http://www.cppblog.com/erran/archive/2007/10/16/34383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：一个老工程师的话</title><link>http://www.cppblog.com/erran/archive/2007/10/14/34191.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Sat, 13 Oct 2007 16:55:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2007/10/14/34191.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/34191.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2007/10/14/34191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/34191.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/34191.html</trackback:ping><description><![CDATA[ 诸位，咱当电子工程师也是十余年了，不算有出息，环顾四周，也没有看见几个有出息的！回顾工程师生涯，感慨万千，愿意讲几句掏心窝子的话，也算给咱们师弟师妹们提个醒，希望他们比咱们强！<br /> <br />[1]
好好规划自己的路，不要跟着感觉走！根据个人的理想决策安排，绝大部分人并不指望成为什么院士或教授，而是希望活得滋润一些，爽一些。那么，就需要慎重安
排自己的轨迹。从哪个行业入手，逐渐对该行业深入了解，不要频繁跳槽，特别是不要为了一点工资而转移阵地，从长远看，这点钱根本不算什么，当你对一个行业
有那么几年的体会，以后钱根本不是问题。频繁地动荡不是上策，最后你对哪个行业都没有摸透，永远是新手！<br /> <br />[2]可以做技术，切不可沉湎于技术。千万不可一门心思钻研技术！给自己很大压力，如果你的心思全部放在这上面，那么注定你将成为孔乙己一类的人物！适可而止为之，因为技术只不过是你今后前途的支柱之一，而且还不是最大的支柱。<br /> <br />[3]
不要去做技术高手，只去做综合素质高手！在企业里混，我们时常瞧不起某人，说他“什么都不懂，凭啥拿那么多钱，凭啥升官！”这是普遍的典型的工程师的迂腐
之言。8051很牛吗？人家能上去必然有他的本事，而且是你没有的本事。你想想，老板搞经营那么多年，难道见识不如你这个新兵？人家或许善于管理，善于领
会老板意图，善于部门协调等等。因此务必培养自己多方面的能力，包括管理，亲和力，察言观色能力，攻关能力等，要成为综合素质的高手，则前途无量，否则只
能躲在角落看示波器！技术以外的技能才是更重要的本事！！从古到今，美国日本，一律如此！<br /> <br />[4]多交社会三教九流的朋友！不要只和工程
师交往，认为有共同语言，其实更重要的是和其他类人物交往，如果你希望有朝一日当老板或高层管理，那么你整日面对的就是这些人。了解他们的经历，思维习
惯，爱好，学习他们处理问题的模式，了解社会各个角落的现象和问题，这是以后发展的巨大的本钱。<br /> <br />[6]抓住时机向技术管理或市场销售方
面的转变！要想有前途就不能一直搞开发，适当时候要转变为管理或销售，前途会更大，以前搞技术也没有白搞，以后还用得着。搞管理可以培养自己的领导能力，
搞销售可以培养自己的市场概念和思维，同时为自己以后发展积累庞大的人脉！应该说这才是前途的真正支柱！<br /> <br />[7]逐渐克服自己的心里弱点
和性格缺陷！多疑，敏感，天真（贬义，并不可爱），犹豫不决，胆怯，多虑，脸皮太薄，心不够黑，教条式思维。。。这些工程师普遍存在的性格弱点必须改变！
很难吗？只在床上想一想当然不可能，去帮朋友守一个月地摊，包准有效果，去实践，而不要只想！不克服这些缺点，一切不可能，甚至连项目经理都当不好--尽
管你可能技术不错！<br /> <br />[8]工作的同时要为以后做准备！建立自己的工作环境！及早为自己配置一个工作环境，装备电脑，示波器（可以买个二
手的），仿真器，编程器等，业余可以接点活，一方面接触市场，培养市场感觉，同时也积累资金，更重要的是准备自己的产品，咱搞技术的没有钱，只有技术，技
术的代表不是学历和证书，而是产品，拿出象样的产品，就可技术转让或与人合作搞企业！先把东西准备好，等待机会，否则，有了机会也抓不住！<br /> <br />[9]
要学会善于推销自己！不仅要能干，还要能说，能写，善于利用一切机会推销自己，树立自己的品牌形象，很必要！要创造条件让别人了解自己，不然老板怎么知道
你能干？外面的投资人怎么相信你？提早把自己推销出去，机会自然会来找你！搞个个人主页是个好注意！！特别是培养自己在行业的名气，有了名气，高薪机会自
不在话下，更重要的是有合作的机会...... <br /><br />[10]该出手时便出手！永远不可能有100%把握！！！条件差不多就要大胆去干，去闯出自己的事业，不要犹豫，不要彷徨，干了不一定成功，但至少为下一次冲击积累了经验，不干永远没出息，而且要干成必然要经历失败。不经历风雨，怎么见彩虹，没有人能随随便便成功！<img src ="http://www.cppblog.com/erran/aggbug/34191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2007-10-14 00:55 <a href="http://www.cppblog.com/erran/archive/2007/10/14/34191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>