自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 收藏
  • 关注

原创 将博客搬至CSDN

由于新浪博客功能上的缺陷,不适合发表技术博客,本人将停止在新浪博客发表技术博客。后续技术博客将会在csdn博客发表,地址为:http://blog.csdn.net/hexiaomin_1984   特此公告。

2014-02-24 15:05:01 448

原创 Eclipse + ADT(包括NDK Plugin) + CDT 搭建Android NDK开发环境

Android应用程序的开发环境比较容易搭建,下载完AndroidSDK,在Eclipse中安装ADT插件就好了。前段时间由于要在Android上做三维程序的开发,三维开发的资源(例如几何算法等)大多数都是C++写,如果想开发出高效的程序,那就必须用到NDK,一部分代码用C/C++编写,生成本地动态链接库libXXX.so,通过Android的JNI接口调用动态库中的本地方法。NDK实际上就是一

2014-02-24 15:04:59 552

原创 一个奇特的模版函数

templatevoid destroy(T* pointer){ pointer->~T();} //上面的模版函数在STL源码中使用非常频繁,是非常奇特的,即使是使用不含析构函数的int等类型去具化//这个模版函数,也是能够数据编译和运行通过,很显然,编译器对于~T()函数的调用进行了特殊的处理。

2014-02-24 15:04:57 439

原创 OSG控制帧率的方法

osg::ref_ptrviewer = new osgViewer::Viewer; osg::ref_ptrnode;    //申请一个定时器 osg::Timer* timer = new osg::Timer; osg::Timer_t start_frame_time = 0; osg::Timer_t end_frame_time = 0;    floatsta

2014-02-24 15:04:54 1495

原创 placement new体验

#include using namespace std;class A{public: A(); A(const A&); int i;};A::A(){ i = 0; cout <<"default"}A::A(const A&){ cout <<"copy"}void main(){ A a; a.i = 1; A b; b.i = 2; 

2014-02-24 15:04:52 400

原创 判断两个整数相加是否溢出的方法

对于C/C++语言来说,分为无符号整数和有符号整数两种,几乎在所有机器中他们都是用补码表示的,判断两个整数相加是否溢出的方法如下:(1)无符号整数相加int uadd_ok(unsigned x, unsigned y){   unsigned z = x + y;   if(z <x)     return 0;    return1;} (2) 有符号整数相加,这个

2014-02-24 15:04:50 2606

原创 OpenGL与Memory&nbsp;DC

//转载自http://www.programfan.com/blog/article.asp?id=40490  用GDI绘图时,双缓冲是经常采用的技术。其中关键的一步,就是要先把图形绘制到内存设备环境中,然后拷贝到屏幕上。   OpenGL本身已经有双缓冲的功能了。但是因为开发需要,在采用OpenGL的绘图程序中,我还是需要首先在内存设备环境上绘制一个物体,然后保存为bmp图像。但是采用类

2014-02-24 15:04:48 686

原创 OpenGL显示中文-Unicode版本

void GLFont::Print3DTextW(wchar_t *string, float z){ HDC hDC =wglGetCurrentDC();         HFONThOldFont=(HFONT)::SelectObject(hDC,m_hFont); int  nListNum;                   DWORDdwChar;     

2014-02-24 15:04:46 1019

原创 关于OpenGL纹理映射的一点体会

对于glColor制定的颜色和纹理贴图本身的颜色,如何形成最终的颜色呢,经过试验可以通过  glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_REPLACE);来制定,如果不指定,纹理颜色 将于glColor制定的颜色有一个乘法。当然这也不是最终的颜色,最终的颜色要看是否启用的混合,如果  启用了混合,还将与帧缓存中的颜色进行混合。

2014-02-24 15:04:44 396

原创 OpenGL三维混合

转自:http://www.cnblogs.com/jacktu/archive/2010/06/04/1751170.html也许你迫不及待的想要绘制一个三维的带有半透明物体的场景了。但是现在恐怕还不行,还有一点是在进行三维场景的混合时必须注意的,那就是深度缓冲。深度缓冲是这样一段数据,它记录了每一个像素距离观察者有多近。在启用深度缓冲测试的情况下,如果将要绘制的像素比原来的像素更近,则

2014-02-24 15:04:40 643

原创 操作系统实践之中断程序分析

%macro hwint_master 1        call save        in al, INT_M_CTLMASK        or al, (1 %1)        out INT_M_CTLMASK, al        mov al, 20h        out 20h, al        sti        push %1  

2014-02-24 15:04:27 493

原创 操作系统实践之设置中断

在保护模式下设置中断的步骤如下:  初始化8259A中断控制器,设置IDT的内容PUBLIC void init_8259A(){ out_byte(INT_M_CTL, 0x11);   // Master 8259, ICW1. out_byte(INT_S_CTL, 0x11);   // Slave  8259, ICW1. out_byte(INT_M_CTLMASK, 

2014-02-24 15:04:25 584

原创 操作系统实践之使用Makefile

通过命令行进行编译是在太麻烦,使用Makefile就方便多了,下面这个MakeFile将编译boot.bin(引导程序)loader.bin(加载程序)和Kernel.bin(操作系统内核),编写过程比较简单,需要主要的是编译命令前需要有一个Tab键作为空格,否则好像执行不了,比如 (这里是一个Tab键)$(ASM)$(ASMBFLAGS) -o $@ $# Makefile for os

2014-02-24 15:04:23 397

原创 操作系统实践之重置GDT

为了进入保护模式,首先需要在实模式下设置GDT,并用lgdt指令保存GDT的地址,这个地址实际上是线性地址,只是在实模式中线性地址就是物理地址;当控制权转到内核时需要将GDT重新设置一下,以便在内核中设置GDT,为了保证这一点需要在设置GDT之前,通过分页机制仍然能够找到原先的GDT,即线性地址要映射到相同的物理地址中,否则就找不到原来的GDT,无法进行拷贝。在本次操作系统实践中,分页机制非常简单

2014-02-24 15:04:21 704

原创 操作系统实践之内存布局

本次操作系统实践基本上是按照《自动动手写操作系统》一书依葫芦画瓢,内存布局如下:    ;              ┃                                    ┃    ;              ┃                 .                  ┃    ;              ┃                 . 

2014-02-24 15:04:19 548

原创 操作系统实践之加载程序

Loader程序主要作用是加载Kernel.bin到内存中,这一步与引导程序加载Loader.bin进入内存是类似的,Kernel.bin是在Linux下编译的,是ELF格式的。因此,Kernel.bin加载内存后,需要将其中的代码段拷贝到相应的位置,这个位置由Kernel.bin编译时指令的入口地址决定,这些是由InitKernel完成的。Loader还做了一些事情,就是设置GDT,进入保护

2014-02-24 15:04:16 596

原创 操作系统实践之开发环境

操作系统的内核希望在Linux下通过nasm、gcc等编译,但是又不想放弃Windows下的编辑环境,因此,比较理想的方式是在Windows下编辑,然后在Linux下编译,因此需要在Windows和Linux(虚拟机)下共享文件。比较常见的方法是在linux下搭建Samba来完成http://www.linuxsir.org/main/?q=node/158,这个方法比较好,但是要求Windows

2014-02-24 15:04:14 524

原创 操作系统实践之引导程序

引导程序在引导扇区中,只有512字节的大小,引导程序难以完成许多工作,比如进入保护模式,加载内核,因此引导程序需要将这个工作交给一个拥有更大空间的程序,那就是Loader,引导程序只需将Loader加载入内存就好了,剩下的事情就由Loader来完成了。在《Linux内核完全剖析中》中可以看到,bootsect.S就是引导程序,而Setup.S则充当了Loader的功能。无论是加载Loader还是内

2014-02-24 15:04:12 495

原创 Tiny语言编译器之代码生成

代码生成是Tiny编译器的最后一项工作,代码生成的基础是语法树和符号表,遍历语法树,生成能够被TM虚拟机执行的指令,其中if语句和repeat语句需要利用emitSkip、emitBackup进行代码回填,因为只有全部语句指令生成完成以后才知道跳转地址。代码生成的源代码如下:#include "globals.h"#include "symtab.h"#include "code.h"#i

2014-02-24 15:04:10 1007

原创 Tiny语言编译器之TM虚拟机接口

TM虚拟机接口用于生成TM指令,源代码如下://code.h//TM接口#ifndef _CODE_H_#define _CODE_H_#define pc 7 //程序寄存器#define mp 6 //指向数据区顶部#define gp 5 //指向数据区底部#define ac 0#define ac1 0//输出寄存器指令void emitRO(char

2014-02-24 15:04:08 760

原创 Tiny语言编译器之TM虚拟机开发

这里的虚拟机是是Tiny语言的运行环境,源代码如下:#include #include #include #include #ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif#define IADDR_SIZE 1024 //指令存储区大小#define DADDR_SIZE 1024 //数

2014-02-24 15:04:06 1775

原创 Tiny语言编译器之语义分析

Tiny语言的语义分析非常简单,第一步先遍历语法树建立符号表,但是这个符号表本身并没有太大的用处,只是为变量分配了内存的地址,为代码生成做准备;第二步是类型检查,主要对if语句、repeat语句的条件进行检查,必须是Boolean类型的,另外有些表达式要求是Integer类型,类型检查采用后序遍历的方式。语义分析的源代码如下:#include "globals.h"#include "symt

2014-02-24 15:04:04 1859

原创 Tiny语言编译器之符号表

Tiny语言编译器的符号表还是很简单的,主要的是写了一个简单的哈希表,共有211个桶,采用拉链法,用另外一个链表记录了一个符号所出现的所有行号,源代码如下:#include #include #include #include "symtab.h"#define SHIFT 4#define SIZE 211//哈希函数static int hash(char* key)

2014-02-24 15:04:02 689

原创 Dreamweaver中字符编码的问题

Dreamweaver中默认的字符编码是gb2312,因此,如果都使用Dreamweaver中“文件”->“新建”的方式创建html页和JavaScript页,网页不会有字符编码的问题。用Dreamweaver创建的html,中的会显示如下:<metahttp-equiv="Content-Type" content="text/html; charset=gb2312"/>   其中,

2014-02-24 15:03:59 1004

原创 利用Yacc生成LR语法分析器的关键点…

实际上利用Yacc生成LR语法分析器(一般是Lookahead分析方法)还是比较简单的,而且写一个文法满足Yacc的要求也非常容易,主要的工作量体现在一个产生式被识别后的动作如何编写,尤其是有时候需要在一个产生式中嵌入一个动作,这个动作产生的时机是什么,产生这个动作时当前的token是什么一定要非常清楚,通过这几天的研究,基本上对这个问题已经有了一个了解,这里做一些总结。 首先,Yacc中判

2014-02-24 15:03:57 1075

原创 Tiny语言编译器开发之语法分析(利…

采用自底向上的LR分析方法,Yacc输入文件yyparser.y如下:%{#define YYPARSER#include "globals.h"#include "util.h"#include "scan.h"#include "parse.h"#define YYSTYPE TreeNode *static char * savedName;static int saved

2014-02-24 15:03:55 753

原创 JavaScript滚动信息的CSS要点

如果用jQuery做滚动信息,在《锋利的jQuery》书中已经讲解得很详细啦,书中的源代码可以在网上下载的。但,其中,有一些关键的CSS要点,如果不使用的话,是不能达到很好的滚动效果的。   假如有很多信息,每时每刻要显示4行滚动信息,html如下:<divclass="scrollNews">            <ahref="#">甜美宽松毛衣金秋一定红。       

2014-02-24 15:03:53 345

原创 Tiny语言编译器开发之语法分析

采用自顶向下的分析方法中的递归下降分析法,手工编写语法分析器,源代码如下:#include "globals.h"#include "util.h"#include "scan.h"#include "parse.h"static TokenType token; //当前获取的tokenstatic TreeNode* stmt_sequence();static TreeNod

2014-02-24 15:03:51 1379

原创 对杨季文书中关于指令预取进/出保…

此文转载自:http://topic.csdn.net/t/20020901/02/986629.html在P.380,他说是“在实方式下被预取,在保护方式下被执行”。其实着不太正确。着跟预取没有多大的关系。要知道更多的内容请看cnix版我转贴的贴子《如何在实模式下存取4G》。我现在来说说从进/出保护模式究竟发生了什么:   在实模式时    LGDT   fword  ptr   v

2014-02-24 15:03:49 1046

原创 Tiny语言编译器开发之词法分析(利…

输入文件为tiny.l,内容如下%{#include "globals.h"#include "util.h"#include "scan.h"char tokenString[MAXTOKENLEN+1];extern int lineno;%}digit [0-9]number {digit}+letter [a-zA-Z]identifier {letter}+new

2014-02-24 15:03:47 846

原创 python中文乱码的编码问题深入(推…

下面这篇文章很好:http://www.itqun.net/content-detail/67243.html

2014-02-24 15:03:45 369

原创 显卡显存和内存显存的区别

本文转自:http://guoqiang.name/?p=42要弄清楚这个问题,首先要知道什么是地址映射,为什么平时我们说内存地址空间,而不是说内存空间。因为实模式下,20根地址线,最多可以寻址1M内存,也就是我们有1M的地址资源,这1M的地址我们除了用来寻址物理内存外,还要用它来寻址访问BIOSROM,还有各种外设的ROM(因为计算机体系中并没有提供其他的手段来访问这些ROM).这样,1M

2014-02-24 15:03:42 3240

原创 Tiny语言编译器开发之词法分析

对于Tiny语言编写的Sample程序源代码如下:{ Sample program  in TINY language -  computes factorial}read x; { input an integer }if 0 < x then { don't compute if x <=0 }  fact := 1;  repeat    fact := fact* x

2014-02-24 15:03:40 1015

原创 推荐一个生成等待动画gif的网站

http://preloaders.net/可以设置动画gif图片的尺寸、背景颜色(包括透明背景)、动画速度、动画图的颜色。比如:

2014-02-24 15:03:38 518

原创 页面或者元素不居中的原因

想让页面或者元素居中,很简单,只需要设一个CSS格式,比如:div.xxxx{ margin:0 auto; padding:0px; width:600px;}或者直接在标签中添加样式,比如:<div style="width:970px;margin:0 auto;">       随便写几个字         这个,如果是在编译器中生成的网页中,肯定是没有问题的,

2014-02-24 15:03:36 564

原创 Windows系统中PDE和PTE所占的空间

这个问题困扰我已经好几天了,一直想不明白,为什么只需要4M空间,而不是4K+4M,而且于渊的《自己动手写操作系统》一书中确实也用到了4K+4M,难道毛德操先生所言有误,其实不然,通过搜索,我找到了答案,感谢网友wowocock,下面内容转载自http://www.debugman.com/read.php?tid=3128  页目录的地址为什么是C0300000,1个页目录加上1024个页表

2014-02-24 15:03:34 1350

原创 写了一个简单的模拟Windows的cmd.e…

//源代码如下,基本的功能可以实现,注释掉的代码可以用来实现输出的重定位,就不多解释了//如果启动一个程序需要输出到单独的控制台窗口中,则CreateProcess函数的fdwCreate传入//CREATE_NEW_CONSOLE即可#include#include void main(){ char cmd[200]; STARTUPINFO si={sizeof(si)};

2014-02-24 15:03:32 843

原创 VC++选择文件夹的路径

这个主要是从网上找到的,没有记录出处。经过检验,可以正确运行,程序及自己的MFC程序如下://读取文件夹用到的函数int find(char * lpPath){    char*szFind=new char[MAX_PATH];    char*szFile=new char[MAX_PATH];   WIN32_FIND_DATA FindFileData;   str

2014-02-24 15:03:30 1040

原创 动态创建和释放三维数组

在C++中,如果要多次使用数组,占用很大内存,就必须用动态创建的方式。使用完以后,释放数组。必须特别注意循环的嵌套顺序,否则,对各个维度不同的数组,比如a[3*2*5],而不是a[5*5*5],可能会释放不充分。   以下举出三维数组的创建和释放方法,假设各个维数已经获得,并且在程序中用具体数字代替:创建:   double ***xiao28=newdouble**[4];   fo

2014-02-24 15:03:28 748

原创 谈谈Windows程序中的字符编码(非…

(转载自http://www.fmddlmyy.cn/text7.html)写这篇文章的起因是这么一个问题:我们在使用和安装Windows程序时,有时会看到以“2052”、“1033”这些数字为名的文件夹,这些数字似乎和字符集有关,但它们究竟是什么意思呢?研究这个问题的同时,又会遇到其它问题。我们会谈到Windows的内部架构、Win32API的A/W函数、Locale、ANSI代码页、与

2014-02-24 15:03:25 732

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除