• 3
  • 11月

话说,C语言中最精髓的就是指针的操作了。当然,本文不对C语言的指针做详细的描述。Hanny在这里只想小结一下KeilC中的指针类型。

在KeilC中,我们会常见到下述的指针定义方式:
char *ptr1;<br />
char code *ptr2;<br />
char data *ptr3;<br />
char xdata *ptr4;<br />
char *data ptr5;<br />
char code *data ptr6;<br />
char data *data ptr7;<br />
char xdata *data ptr8;<br />
char *xdata ptr9;<br />
char code *xdata ptr10;<br />
char data *xdata ptr11;<br />
char xdata *xdata ptr12;


看到这里,可能会有人有点乱了吧。其实要理清上面这一堆东西很简单。

首先,我们需要了解51的内存结构。简单地说,就是51包括data/idata、xdata、code三大块。定义指针时,*后面的修饰符是用来表示指针的存储位置。如:ptr5、ptr6、ptr7、ptr8存储在data区中,ptr9、ptr10、ptr11、ptr12存储在xdata中。ptr1、ptr2、ptr3、ptr4的存储位置则取决于KeilC中的设置(使用内存的模式)。

*之前的修饰符,则是用来表示指针所指向的数据的存储位置,即指针类型。ptr2、ptr6、ptr10的指针,指向一个存储在code中的数据。ptr3、ptr7、ptr11的指针,指向一个存储在data中的数据。ptr4、ptr8、ptr12的指针,指向一个存储在xdata中的数据。

ptr1、ptr5、ptr9这三个指针有一点点特殊。没有修饰类型这表示这是一个通用指针,它将用3Byte来表示。其中第一字节表示指针类型,后两个指针存放指针地址。而类型中,0xff表示指针存放在code中,0x00表示data/idata,0x01表示xdata。

综上所述,若一个指针为char xdata * xdata,如ptr12,则该指针表示一个存放在xdata中的指针,并且该指针指向一个xdata的数据。

在使用过程中,只要注意到了这些类型,应该是不会出什么问题的。

  • 31
  • 10月

给自己安装了一个DokuWiki,用于资料的系统管理吧。

稍微把模板整合了一下,看起来一致一点。至于用户,反正就一个人用,也没去和Typecho做整合了。以后有考虑和别人一起使用再说。

那么,这个Doku和Blog会有什么区别呢?

我想,以后Blog会用来存放原创的,而Doku里面就主要是收集,并不一定是原创了吧。

  • 25
  • 10月

周末出去走走。还是穿着拖鞋,裤脚宽松的裤子。结果在横穿马路时,一个不幸,左脚的大拇趾勾进了右脚的裤管里,杯具就这么发生了。膝盖磨了一大块,肘和掌轻微蹭了一下。

本来以为这已经是杯具了。结果今天,拿东西撬核桃时,一用力,左手大拇指又被划了一道口子。

这两天,这是怎么啦?

  • 10
  • 10月

总算有点看懂wma2wav(ffmpeg)中的IMDCT算法了。只是有点看懂。

wma2wav,其实就是从ffmpeg中将wma解码的程序提取了出来。IMDCT是其中的一个重要部份吧。小结了一下该程序对IMDCT的计算流程。

先是将IMDCT的式子进行分段移位,利用cos函数的对称性,将2N个点的IMDCT转换成N个点的DCT-IV算法。

然后对这N个点进行处理,以偶序列为实部,奇序列的逆序列为虚部,先进行预处理,然后就转换成N/2个点的FFT。计算完后,再进行相关的后处理,即可得到。

整个算法和http://www.ee.columbia.edu/~marios/mdct/mdct_giraffe.html中提到的imdtc4差不多。

花了几天时间终于弄明白这个预处理和后处理的推导流程。其实预处理和后处理的目的就是为了把表达示转换成标准DFT,这样就可以用FFT来进行计算了。仅此而已。

在FFT计算过程中,ffmpeg用的是按时间抽取的FFT算法,也就是先按位逆序来打乱顺序,然后计算,结果就是顺序的了。

  • 8
  • 10月

好想弄一个微博插件。这样就不需要这个分类了。好,在Typecho下一个正式版出来之前(或之时),出一个微博插件。另:Magike Editor插件已更新。