<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[缪缪人生]]></title>
<link>http://blog.pfan.cn/miaowei</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[退出编程爱好者博客]]></title>
		<link>http://blog.pfan.cn/miaowei/53336.html</link>
		<description><![CDATA[今天，我要正式的退出编程爱好者博客了。告别这个陪伴我三年的博客了。
编程爱好者博客，再见了]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2012-03-03 22:33:00</pubDate>
		</item>
				<item>
		<title><![CDATA[HTS&nbsp;语音合成方法&nbsp;简述]]></title>
		<link>http://blog.pfan.cn/miaowei/53323.html</link>
		<description><![CDATA[这里，想要写一些关于HTS语音合成系统的东西。其实也就是想说说HTS语音合成系统是个啥玩意，它的基本思想和基本流程是什么？而不是用一个什么简图了事的那种。
总的来说，HTS语音合成系统，和HTK语音识别系统思想和流程基本相同，为什么这么说？那么我们就从流程上来说一条条分析。
1. 训练模型。两者都需要对语音基本单元（音素，半音节，音节）进行训练HMM模型。且训练模型使用的参数也是那些语音的acoustic参数，如MFCC， LSF, F0等。
2. 模型细化。 以音素模型为例，一般我们喜欢用di-phone 或 tri-phone来表征上下文相关的模型。但是这意味着对训练数据量的需求就更大，这时，我们一般需要做一些特殊处理，如状态绑定，对那些数据稀疏的状态，将他绑定在其他和它相似的状态上。对HTS， 可能采用基本分类树的方法来克服数据稀疏的问题。
3. 解码过程。在解码阶段，HTS语音合成和HTK语音识别刚好是一对可逆的过程。 在HTK语音识别中，给定的是每个音素的HMM模型和观察序列（如MFCC， F0序列，从输入语音中提取出来的），要求的是这些观察序列属于哪个模型。&nbsp; 而在HTS语音合成中，给定的是每个音素的HMM模型，以及由这些模型解码的结果（即输入的文本信息，经过处理后的音素序列），要求的是观察序列（这里得到的观察序列是指每一帧的MFCC，F0等特征）。
&nbsp;
至此，HTK语音识别的过程就完成了。但是，HTS语音合成系统还有一个过程，那就是语音合成器。
所谓语音合成器，就是给定MFCC和F0特征，产生实际的语音数据。
这里，我们一般根据人的发音方式，即根据假设人的发生是通过一个声波(由声带振动产生)， 经过声带共振（相当于一个滤波器），然后到达口鼻辐射出去。 这里，这个声波的产生过程是，对于浊音，用一个周期脉冲（其频率就是前面得到的F0）代替，对于清音，则用一个高斯白噪声代替。 而声带共振调制过程，这个滤波器的主要参数就是前面得到的MFCC参数。最后，经过一个辐射模型就可以得到所要的合成语音了。
&nbsp;
可见，HTS语音合成的方法是严重的依赖于HTK的。所以，欲练此功，必先学习HTK。 此外，如果你已经掌握了HTK，那么，我觉得在这整个过程中，还有几个问题需要注意及好好解决。
（1） 对基频F0的建模。 因为对于]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2012-02-23 16:28:00</pubDate>
		</item>
				<item>
		<title><![CDATA[销毁一个对话框流程]]></title>
		<link>http://blog.pfan.cn/miaowei/53125.html</link>
		<description><![CDATA[点击标题栏中的“X”后，
调用OnClose()，&nbsp; ---&gt;
在CDialog::OnClose()中会自动调用OnCancel()； ----&gt;
在CDialog::OnCancel()中会自动调用EndDialog()； -----&gt;
在正式消毁对话框对象之前，会自动调用OnDestroy()。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2012-01-04 10:36:00</pubDate>
		</item>
				<item>
		<title><![CDATA[销毁一个对话框流程]]></title>
		<link>http://blog.pfan.cn/miaowei/53124.html</link>
		<description><![CDATA[点击标题栏中的“X”后，
调用OnClose()，&nbsp; ---&gt;
在CDialog::OnClose()中会自动调用OnCancel()； ----&gt;
在CDialog::OnCancel()中会自动调用EndDialog()； -----&gt;
在正式消毁对话框对象之前，会自动调用OnDestroy()。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2012-01-04 10:26:00</pubDate>
		</item>
				<item>
		<title><![CDATA[销毁一个对话框流程]]></title>
		<link>http://blog.pfan.cn/miaowei/53123.html</link>
		<description><![CDATA[点击标题栏中的“X”后，
调用OnClose()，&nbsp; ---&gt;
在CDialog::OnClose()中会自动调用OnCancel()； ----&gt;
在CDialog::OnCancel()中会自动调用EndDialog()； -----&gt;
在正式消毁对话框对象之前，会自动调用OnDestroy()。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2012-01-04 10:25:00</pubDate>
		</item>
				<item>
		<title><![CDATA[音高于基频]]></title>
		<link>http://blog.pfan.cn/miaowei/52959.html</link>
		<description><![CDATA[&nbsp;
音高(Pitch)和基频(F0)是两个非常接近的概念，
尽管它们有所不同，但通常并不区分。
&nbsp;
音高和基频的关系最早在音乐界被发现，
通常认为，音高增高八度音程相当于基频翻倍。
在1000Hz以下，基频翻倍略小于音高的八度音程；
而在1000－5000Hz范围，基频翻倍略大于音高的八度音程。
John M. Eargle. Music, Sound and Technology. Van Nostrand Reinhold, Toronto, 1995.
Stephen Handel. Listening. MIT Press, Cambridge, 1989.
&nbsp;
在3000Hz以上，保持基频不变，音强增强能使得音高增加；
在2000Hz以下，保持基频不变，音强增强却使得音高降低。
Stanley Coren, Lawrence M. Ward, and James T. Enns. Sensation and Perception.
Harcourt Brace College Publishers, Toronto, 1994.
&nbsp;
以上是来自于正弦波实验的结论，而实际上，人声的谐波结构也会影响音高感知。
目前的基频提取算法很多，但是并没有一个基频提取算法在各种条件下都工作得很好。
通常一个算法离开了特定领域，性能就会变差。提取音乐基频和语音基频的算法就有所差异。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-11-23 09:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[CRF++详解（二）]]></title>
		<link>http://blog.pfan.cn/miaowei/52949.html</link>
		<description><![CDATA[如果你只是想要简单的如何使用CRF++， 建议阅读
&nbsp;http://blog.csdn.net/Felomeng/article/details/4288492&nbsp;。
这里以一个具体的例子介绍CRF++的一些思想和代码的实现过程。就加入我们想利用CRF++来进行分词。
一. 数据及其格式介绍
Train.data
中&nbsp;F1 B-NP
华&nbsp;F2 I-NP
人&nbsp;F3 B-NP
民&nbsp;F4 I-NP
共&nbsp;F5 B-NP
和&nbsp;F6 M-NP
国&nbsp;F7 I-NP
国&nbsp;F8 B-NP
家&nbsp;F9 I-NP
主&nbsp;F10 B-NP
席&nbsp;F11 I-NP
&nbsp;
Template:
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U12:%x[0,1]
# Bigram
B
根据给定的template 和训练数据，需要得到一个CRF模型。
这里先对数据进行一个简单的介绍，
Train.data:
中&nbsp;F1 B-NP
华&nbsp;F2 I-NP
人&nbsp;F3 B-NP
对于输入的一句话，最基本的单元是一个个的字。所以我们处理的单元是字。我们的任务是判断每个字到底是词首，词中还是词尾。 在训练数据中，我们用B-NP, M_NP, I_NP分别表示词首，词中，词尾。&nbsp;&nbsp;训练数据的最后一列表示训练集中每个字属于哪一类。 而F1， F2， F3..... 则是表示每个字的其他特征，比如词性，频率等。为了方便，这里假设这一列是词性列。你可以为它任意添加新的特征，这也是CRF的优势之一。但是一般来说，你如果在训练集中定义了新特征，那么你在 template 中必须想办法用上。
Template:
U00:%x[-2,0]
U01:%x[-1,0]
U12:%x[0,1]
表示什么意思，U00代表模板的名字， -2 代表当行，意思是和当前字的位置，-2表示当前字的前面第2个字，比如]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-11-18 16:57:00</pubDate>
		</item>
				<item>
		<title><![CDATA[CRF++详解]]></title>
		<link>http://blog.pfan.cn/miaowei/52948.html</link>
		<description><![CDATA[最近想利用条件随机场做一些实验。理论基础知识花了我一个星期时间。然后下载了CRF++的代码看看，又花了差不多一个星期。总算是把算法描述的东西和程序里的描述对应起来。
但是，这次学习的过程给我最大的感受就是网上关于这方面的知识还是偏少，尤其是关于CRF++代码的解释就更少了。由于CRF++本身的代码没有任何的注释，而很多函数动辄十几个参数，刚开始连参数代表什么意思，对应到算法描述中的什么变量都不知道。
这里，为了给这次学习过程一个总结，也为了给后面学习CRF，特别是使用CRF++代码的朋友们一个方便。
本文分两部分来描述，第一部分介绍算法原理，这里介绍的原理就是CRF++中用到的算法。 第二部分就是分析CRF++代码，介绍如何通过代码来实现这些算法。
&nbsp;
一。 CRF原理
1．无约束最优化
　　对无约束最优化不熟悉的读者也许要问，什么是无约束最优化。这里以一个例子来说明该问题。
　　
　　上图所示为一元函数f(x)的图像，无约束最优化问题，即不对定义域或值域做任何限制的情况下，求解函数f(x)的最小值，上面显示两个最小值点：一个为全局最小值点，另一个为局部最小值点。受限于算法复杂度等问题，目前大部分无约束最优化算法只能保证求取局部最小值点。这时读者不免要问，既然只能求取局部最小值点，那为什么这类算法还能应用呢。这是因为实际应用中，许多情形被抽象为函数形式后均为凸函数，对于凸函数来说局部最小值点即为全局最小值点，因此只要能求得这类函数的一个最小值点，该点一定为全局最小值点。
　　理解了上面的无约束最优化问题之后，我们就可以开始介绍无约束最优化的求解过程了，对于无约束最优化的求解首先我们需要选择一个初始点x_0，如下所示：
　　
　　初始点选择好之后，就可以按照各种不同的无约束最优化求解算法，求解最小值点了。求解过程中主要涉及两个概念，即从初始点开始沿“哪个方向”以及“走多远”到达下一个点处。所谓“走多远”即之前提的“步长”的概念，“哪个方向”即方向概念。
&nbsp;
2．Line Search
　　Line search主要用于解决之前提到的步长的概念，即方向确定好之后，需要确定从当前点x_k沿着该方向走多远，以便走到下一个合适的点x_k+1。若用p_k代表从第k个点走向第k+1点的方向，x_k代表当前点，x_k+1代表下一个点]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-11-18 15:39:00</pubDate>
		</item>
				<item>
		<title><![CDATA[拟牛顿法及其相关解法]]></title>
		<link>http://blog.pfan.cn/miaowei/52925.html</link>
		<description><![CDATA[最近在看条件随机场中的优化算法。其中就设计到了无约束化的最优化方法，也就是牛顿法。 在CRF（conditional random field）中，使用的是L-BFGS法。费了好大的劲把算法的原理及推导算是看明白了，可是到了具体实现上，又碰到问题了，比如在求搜索方向的时候，使用
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
但是程序中如何实现呢？ 
&nbsp;
现在转载一篇文章，看过之后，会非常受益。
使用导数的最优化算法中，拟牛顿法是目前为止最为行之有效的一种算法，具有收敛速度快、算法稳定性强、编写程序容易等优点。在现今的大型计算程序中有着广泛的应用。本文试图介绍拟牛顿法的基础理论和若干进展。
牛顿法 (Newton Method)
牛顿法的基本思想是在极小点附近通过对目标函数做二阶Taylor展开，进而找到的极小点的估计值[1]。一维情况下，也即令函数为

则其导数满足

因此
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)
将作为极小点的一个进一步的估计值。重复上述过程，可以产生一系列的极小点估值集合。一定条件下，这个极小点序列收敛于的极值点。
将上述讨论扩展到维空间，类似的，对于维函数有

其中和分别是目标函数的的一阶和二阶导数，表现为维向量和  矩阵，而后者又称为目标函数在处的Hesse矩阵。 设可逆，则可得与方程(1)类似的迭代公式：
&nbsp;&nbsp;&nbsp;&nbsp; (2)
这就是原始牛顿法的迭代公式。
原始牛顿法虽然具有二次终止性（即用于二次凸函数时，经有限次迭代必达极小点），但是要求初始点需要尽量靠近极小点，否则有可能不收敛。因此人们又提出了阻尼牛顿法[1]。这种方法在算法形式上等同于所有流行的优化方法，即确定搜索方向，再沿此方向进行一维搜索，找出该方向上的极小点，然后在该点处重新确定搜索方向，重复上述过程，直至函数梯度小于预设判据。具体步骤列为算法1。
&nbsp;
算法1：
(1)&nbsp;&nbsp;给定初始点，设定收敛判据，.
(2)&nbsp; 计算和.
(3)&nbsp; 若 &lt; ，则停止迭代，否则确定搜索方向.
(4)&nbsp; 从出发，沿做一维搜索，

令.
(5)&nbsp; 设，转步骤(2).]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-11-15 11:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[马尔科夫随机场的经典解释]]></title>
		<link>http://blog.pfan.cn/miaowei/52909.html</link>
		<description><![CDATA[　马尔可夫随机场（Markov Random Field），也有人翻译为马尔科夫随机场，它包含两层意思：一是什么是马尔可夫，二是什么是随机场。 [1] 
　　马尔可夫一般是马尔可夫性质的简称。它指的是一个随机变量序列按时间先后关系依次排开的时候，第N+1时刻的分布特性，与N时刻以前的随机变量的取值无关。拿天气来打个比方。如果我们假定天气是马尔可夫的，其意思就是我们假设今天的天气仅仅与昨天的天气存在概率上的关联，而与前天及前天以前的天气没有关系。其它如传染病和谣言的传播规律，就是马尔可夫的。 
　　随机场包含两个要素：位置（site），相空间（phase space）。当给每一个位置中按照某种分布随机赋予相空间的一个值之后，其全体就叫做随机场。我们不妨拿种地来打个比方。“位置”好比是一亩亩农田；“相空间”好比是种的各种庄稼。我们可以给不同的地种上不同的庄稼，这就好比给随机场的每个“位置”，赋予相空间里不同的值。所以，俗气点说，随机场就是在哪块地里种什么庄稼的事情。 
　　好了，明白了上面两点，就可以讲马尔可夫随机场了。还是拿种地打比方，如果任何一块地里种的庄稼的种类仅仅与它邻近的地里种的庄稼的种类有关，与其它地方的庄稼的种类无关，那么这些地里种的庄稼的集合，就是一个马尔可夫随机场。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-11-03 16:37:00</pubDate>
		</item>
				<item>
		<title><![CDATA[waveOut&nbsp;waveWrite播放声音需注意的一点]]></title>
		<link>http://blog.pfan.cn/miaowei/52898.html</link>
		<description><![CDATA[最近用windows底层API函数作为我播放声音的函数。程序开发好后，给别人使用。不就就反馈说在使用一段时间（大概30分钟）后，就会跳出 waveOut或者wavePrepare, waveUnprepare等API函数就不正常了。导致不能正常的播放声音了。思来想去，检查程序多次，没有发现什么问题。
&nbsp;
今天，在看网上房子装修效果图的时候，一同事突然说了句，好整齐呀，两边对的非常齐整。真是一句话点醒梦中人。没错，就是这个问题，没有对齐的问题。 现在网上有很多的使用wave&nbsp;底层API函数录音和放音的程序，但都忽略了这个细节。那就是，一般来说，播放一个语音文件，有3步，结束播放一个语音文件，也有3步。 这两个3步必须对齐。具体如下
&nbsp;
播放语音文件3部曲
waveOutOpen
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waveOutPrepareHeader
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waveOutWrite
&nbsp;
结束播放3部曲
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waveOutReset
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waveOutUnprepareHeader
waveOutClose
&nbsp;
播放3部曲和结束3部曲不能颠倒。 其中 waveOutWrite 和 waveOutReset 对应。 waveOutPrepareHeader和waveOutUnprepareHeader对应， waveOutOpen 和 waveOutClose 对应。
关系和位置不要颠倒了。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-11-02 15:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C++一个经典的超前问题]]></title>
		<link>http://blog.pfan.cn/miaowei/52886.html</link>
		<description><![CDATA[今天遇到了这样的错误：error C2079: 'xxx' uses undefined class 'yyy'
不得不承认自己有土鳖的基因。本来是很普通的一件事情。
自己居然不知道。
刚好碰到网上一个达人的分析文章，觉得非常经典的分析了这个经典的问题。固转载如下：
&nbsp;
比如说，我们先定义一个b类再定义一个a类，a的一个成员就是b，如下：
class b{
int i;
};
class a {
b val ;
};
这显然是可以的。
如果这个时候，要把b的定义放到后面去，大家都知道在前面先声明b，那么：
class b;
class a {
b val ;
};
class b{
int i;
};
这段对不对呢？如果不编译，直观感觉，我以前总以为是可以的。。
但其实是通过不了编译的。那么再改，把val换成对b的指针，这样：
class b;
class a {
b * val ;
};
class b{
int i;
};
然后就可以了。
那么，直接给出一条重要的结论：
超前引用不可使用类名来定义变量和函数的变量参数，只可用来定义引用或者指针。
要解释其实是很简单的，因为编译器在处理类的时候，要为他的成员分配空间。
如果我们用指针，那么直接分配4个字节就可以了，就像：
class b;
class a;
class a {
b *val ;
};
class b{
a *val ;
};
但是，如果成员变量是类呢？？
class b;
class a;
class a {
b val ;
};
class b{
a val ;
};
这种情况下，就好比把两面镜子对着放置一样。。
当处理到a的val的时候，发现是个b，那么给b留出空间，
为了知道给b留出多少空间，再看b，发现b的val是a，
那么又需要再知道该给a多少空间。。。
这个道理其实是很显然的。
所以，VC编译的时候说'xxx' uses undefined class 'yyy' 。
也许你觉得这些是很显然的事情，自己写的时候不会犯这种傻。
那么要小心的就是STL了。比如说你list &lt;myClass&gt;。
而这个时候myClass是处于已定义状态，则没有问题。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-10-24 15:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[重回我的博客]]></title>
		<link>http://blog.pfan.cn/miaowei/52838.html</link>
		<description><![CDATA[在微博盛行的今日，我重返我的博客生活了。
经历了2010年10月份的跳槽到现在已经一年的时间了，我又回到了我的博客来。
以后我将专注于发布一些语音相关的内容。
谢谢大家关注。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2011-10-10 15:50:00</pubDate>
		</item>
				<item>
		<title><![CDATA[VC&nbsp;中启动另外一个应用程序的方法]]></title>
		<link>http://blog.pfan.cn/miaowei/52069.html</link>
		<description><![CDATA[转至：
http://hi.baidu.com/superacacia/blog/item/27e4e58237a793d5bd3e1e7e.html
&nbsp;
最近在做一个文档管理的软件时需要在程序中打开一个其他格式的文件，需要在文档管理里面点击链接使用特定的应用程序打开；这时就要用到 WinExec、ShellExecute和CreateProcess等方法了；
比如需要打开excel需要使用：
ShellExecute(NULL, &nbsp; "Open", &nbsp; "c:\\books.xsl", &nbsp;NULL, &nbsp; NULL, &nbsp; SW_SHOWNOACTIVATE); &nbsp;&nbsp;
其他方法引用网上的文章：

Q:&nbsp;&nbsp;&nbsp;&nbsp;如何打开一个应用程序？&nbsp;
A:&nbsp;&nbsp;&nbsp;&nbsp; ShellExecute(this-&gt;m_hWnd,"open","calc.exe","","", SW_SHOW );&nbsp;
或 ShellExecute(this-&gt;m_hWnd,"open","notepad.exe",&nbsp;"c:\\MyLog.log","",SW_SHOW );&nbsp;
正如您所看到的，我并没有传递程序的完整路径。&nbsp;

Q:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如何打开一个同系统程序相关连的文档？&nbsp;
A:&nbsp;&nbsp;&nbsp; ShellExecute(this-&gt;m_hWnd,"open",&nbsp;&nbsp;"c:\\abc.txt","","",SW_SHOW );&nbsp;

Q:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如何打开一个网页？&nbsp;
A:&nbsp;&nbsp;&nbsp; ShellExecute(this-&gt;m_hWnd,"open",&nbsp;&nbsp;&nbsp;"&nbsp;http://www.google.com","","",&nbsp;SW_SHOW );&nbsp;

Q:&nbsp;&nbsp;&nbsp;&nbsp;&]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-12-07 14:30:00</pubDate>
		</item>
				<item>
		<title><![CDATA[const&nbsp;用法大全]]></title>
		<link>http://blog.pfan.cn/miaowei/51977.html</link>
		<description><![CDATA[哎，今天又要普及基本知识了。可是这个const的用法确实是很多C/C++程序员很容易混淆的东西。今天好好整理一番，以供大家参考。
const主要是为了程序的健壮型,减少程序出错.
最基本的用法:
const int a=100; b的内容不变,b只能是100也就是声明一个int类型的常量(#define b =100)
int const b=100; //和上面作用一样&nbsp; 

const指针和引用一般用在函数的参数中
int* m = &amp;a; //出错,常量只能用常指针
int c= 1;const int*pc = &amp;c;//常指针可指向常量&nbsp; 

const int* pa = &amp;a; //指针指向的内容为常量(就是b的值不变)
int const *a = &amp;b; //指针指向的内容为常量(就是b的值不变)*p=3//error
int* const a = &amp;b; //指针为常量,不能更改指针了如 a++但可以改值*p=3;&nbsp; 

从这可以看出const放在*左侧修饰的是指针的内容,const放在*右侧修饰的是指针
本身.&nbsp; 

const引用的用法和指针一样
int const &amp; a=b; 和指针一样
const int&amp; a=b; 和指针一样
但没有 int&amp; const a=b 的用法因为引用不能做移位运算，但只是出个warning&nbsp; 

const int* const a = &amp;b; //综合应用,一般用来传递多维的数组
类如：char* init[] = {"Paris","in the","Spring"};
void fun(const int* const a){}
fun(init)//保护参数不被修改&nbsp; 

int A(int)const; //是常函数，只能用在类中，调用它的对象不能改改变成员值
const int A(); //返回的是常量,所以必须这么调用 cosnt int a=A();
int A(const int); //参数不能改值,可用在任意函数
int A(const int*);
....
int height() c]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-11-04 10:30:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C语言中的位运算]]></title>
		<link>http://blog.pfan.cn/miaowei/51971.html</link>
		<description><![CDATA[在此特别声明，此文转载至http://www.cnblogs.com/911/archive/2008/05/20/1203477.html。
如果您此前参考过这篇文章了，那么这里道歉，害您又一次进入。
&nbsp;
不过，之后，我将再写一篇关于16进制一起其他进制的数据如何直接进行位运算，以作补偿。
&nbsp;
位运算是指按二进制进行的运算。在系统软件中，常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数，即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表：
运算符&nbsp;含义&nbsp;描述
&amp;&nbsp;按位与&nbsp;如果两个相应的二进制位都为1，则该位的结果值为1，否则为0
|&nbsp;按位或&nbsp;两个相应的二进制位中只要有一个为1，该位的结果值为1
^&nbsp;按位异或&nbsp;若参加运算的两个二进制位值相同则为0，否则为1
~&nbsp;取反&nbsp;~是一元运算符，用来对一个二进制数按位取反，即将0变1，将1变0
&lt;&lt;&nbsp;左移&nbsp;用来将一个数的各二进制位全部左移N位，右补0
&gt;&gt;&nbsp;右移&nbsp;将一个数的各二进制位右移N位，移到右端的低位被舍弃，对于无符号数，高位补0
1、“按位与”运算符（&amp;）
&nbsp;&nbsp;&nbsp; 按位与是指：参加运算的两个数据，按二进制位进行“与”运算。如果两个相应的二进制位都为１，
则该位的结果值为1；否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其
实与逻辑上“与”的运算规则一致。逻辑上的“与”，要求运算数全真，结果才为真。若，
A=true,B=true,则A∩B=true 例如：3&amp;5 3的二进制编码是11(2)。（为了区分十进制和其他进制，本文规
定，凡是非十进制的数据均在数据后面加上括号，括号中注明其进制，二进制则标记为2）内存储存数据
的基本单位是字节（Byte），一个字节由8个位（bit)所组成。位是用以描述电脑数据量的最小单位。二
进制系统中，每个0或1就是一个位。将11（2）补足成一个字节，则是00000011（2）。5的二进制编码是]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-11-03 15:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C语言下求每种变量类型的最大值]]></title>
		<link>http://blog.pfan.cn/miaowei/51949.html</link>
		<description><![CDATA[以前总是需要人工的写上如果某个short型数据是否大于 32767。总是觉得程序很难看，每次需要输入数字总是很烦。
下面介绍一种求每种变量类型的最大数值和最小数值的简便方法。
假如是要求 int 型的最大值和最小值，可以按照如下求。
unsigned int a;
int b;
a = (unsigned int) -1; //获得unsigned int 的最大值，最小值为0
b = ((unsigned int)-1) &gt;&gt;1;&nbsp; //获得 int 的最大值
b = ~(((unsigned int)-1) &gt;&gt;1); //获得int的最小值&nbsp;
&nbsp;
其他类型也是类推
&nbsp;]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-10-29 17:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Linux下&nbsp;UTF16转&nbsp;UTF8]]></title>
		<link>http://blog.pfan.cn/miaowei/51666.html</link>
		<description><![CDATA[int UTF16ToUTF8(unsigned char *out, int *outlen, const unsigned char *inb, int *inlenb)
{
&nbsp;&nbsp;&nbsp; unsigned char* outstart = out;
&nbsp;&nbsp;&nbsp; const unsigned char* processed = inb;
&nbsp;&nbsp;&nbsp; unsigned char* outend = out + *outlen;
&nbsp;&nbsp;&nbsp; unsigned short* in = (unsigned short*) inb;
&nbsp;&nbsp;&nbsp; unsigned short* inend;
&nbsp;&nbsp;&nbsp; unsigned int c, d, inlen;
&nbsp;&nbsp;&nbsp; unsigned char *tmp;
&nbsp;&nbsp;&nbsp; int bits;
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; int isLittleEndian = 1;

&nbsp;&nbsp;&nbsp; if((*inlenb % 2) == 1) (*inlenb)--;
&nbsp;&nbsp;&nbsp; inlen = *inlenb / 2;
&nbsp;&nbsp;&nbsp; inend = in + inlen;
&nbsp;&nbsp;&nbsp; while((in &lt; inend) &amp;&amp; (out - outstart + 5 &lt; *outlen))
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(isLittleEndian)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c= *in++;
&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-08-17 13:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C2059和C2733同时出现的错误解决]]></title>
		<link>http://blog.pfan.cn/miaowei/51535.html</link>
		<description><![CDATA[症状&nbsp;
&nbsp;在 Microsoft Visual Studio 2005 中创建一个 c + + 应用程序。 您定义 _CRTDBG_MAP_ALLOC，然后编译的时候会出现 C2059和C2733的错误。


&nbsp;
例如对于假定 c + + 应用程序中包含下面的代码 
#define _CRTDBG_MAP_ALLOC
#include &lt;malloc.h&gt;
#include &lt;crtdbg.h&gt;
#include &lt;stdlib.h&gt;

在此的示例编译 c + + 应用程序时您会收到以下编译器错误消息： 

错误 C2059： 语法错误： 常量




错误 C2733： 第二个重载函数 _dupenv_s_dbg 不允许使用的 C 链接




解决方法 要变通解决此问题，请按照下列步骤操作： 启动 Visual Studio 2005。 在 文件 菜单上指向 打开，然后单击 项目/解决方案。 找到该项目或您要打...


要变通解决此问题，请按照下列步骤操作： 
启动 Visual Studio 2005。 在 文件 菜单上指向 打开，然后单击 项目/解决方案。 找到该项目或您要打开，该解决方案，然后单击 打开。 复制并粘贴以下代码在代码窗口中。下面代码应该黏贴在 # include &lt;stdlib.h&gt; 语句 前。
#pragma push_macro("_dupenv_s")
#pragma push_macro("_wdupenv_s")
#undef _dupenv_s
#undef _wdupenv_s

复制并粘贴以下代码在代码窗口中。该代码应粘贴在 # include &lt;stdlib.h&gt; 语句&nbsp; 之后。
#pragma pop_macro("_dupenv_s")
#pragma pop_macro("_wdupenv_s")

在 生成 菜单上单击 生成解决方案。

该代码应类似于下面的代码示例 
#define _CRTDBG_MAP_ALLOC
#include &lt;malloc.h&gt;
#include &lt;crtdbg.h&gt;

#pr]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-07-27 13:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于视音频信号处理编程的深入要求]]></title>
		<link>http://blog.pfan.cn/miaowei/51210.html</link>
		<description><![CDATA[不知不觉，我已经用C语言编程达5年了。在这中间，从最基本的 Ansi C 开始，控制台下一行行的代码敲入开始，到中间面向对象的C++，知道了原来还可以利用C++以达到面向对象，以及代码包装和模块化功能。后来开始接触MFC，知道原来可以把自己的东西通过UI形式向别人展示，太好了。再到后来，觉得MFC非常傻，C#是那么的聪明和简单。
这中间，我有过疯狂的迷恋某一种方式的编程，也有过很痛恨某一种方式的编程。现在回过头来看，其实最本质，最基本的还是基本C。 可以这么说，没几个人感声称自己很精通C，其实标准C还是很博大精深的，以至于我现在还会经常性的阅读一些关于标准C方面的基本资料来加深我对标准C的了解。
由于我是做音视频处理的，所以我这里要补充一些内容。 光掌握上述编程技能对音视频 处理只能说是个入门。要想深入熟悉音视频编程的话，我觉得应该掌握如下一些基本编程技术。这也是我所要努力的方向。
1. STL， 这里面把数组，列表等基本数据结构和算法都包装的很好，用起来很方便，也很简捷。
2. OpenCV， 这个对快速图像和视频编程绝对是个好东西，像图像读入，显示，变换，转换等都非常方便，可以使用户可以专心与处理上，而不是专心在图像编程上。
3. DirectShow，这个主要是对音视频编程，特别是游戏编程非常方便也快速。以至于原来一直是游戏编程必不可少的工具。
此外，一些类似信号处理的工具箱，图像处理工具箱也是非常有用的。如CxImage, HTK等等。]]></description>
		<author><![CDATA[miaoweiletter]]></author>
		<pubDate>2010-05-26 11:41:00</pubDate>
		</item>
		</channel>
</rss>