linux下C/C++学习2——gcc

      前面一篇已经简单的介绍了如何利用gcc编译c源代码,这篇说一下gcc的具体编译过程   


 

  1. 预处理

      预处理的工作主要是处理#include语句等,然后生成*.i文件。如果不加参数“-o *.i”,则会将预处理的结果输出到标准输出。


 

      gcc -E *.c -o *.i                     #使用gcc的E参数进行预处理
      cpp *c - o *.i                          #使用cpp命令进行预处理
      这两条命令预处理的结果一样,因为gcc使用-E参数实际上也是调用了cpp指令。


 

   2.生成汇编代码
      


      gcc -S *c -o *.s            #将C代码汇编为汇编语言代码
      gcc -S *.i -o *.s            #将i文件汇编为汇编语言代码

   3.编译


 

      gcc -c *.c -o *.o
      gcc -c *.s -o *o
      as  *.s -o *.o
      cc -c *.c -o *.o
   4.链接

      gcc *.o -o *out


GCC高级技巧
1.指定头文件位置
   一是在源码中指定头文件的绝对路径,简单直观但缺乏灵活性,二是在编译时使用“-I”参数来指定头文件的路径,实际工作中,一般选择第二种。


 

   使用第二种方法将resolv.c编译为resolv.out的命令如下:
   gcc resolv.c -I /home/myname/code/header -o resolv.out 如果找不到会按照代码所在目录或系统目录寻找头文件
   gcc resolv.c -I /home/myname/code/header  -I /home/myname/code/header2 -o resolv.out  多个路径


 

2.定义符号常量
   在代码中会使用一些常量来控制程序的行为,如#define WIRELESS 211  等等一系列,怎么来检验定义了符号常量与为定义符号常量的区别,一般在编译时使用-D参数来指定符号常量,命令如下:gcc -D WIRELESS  -I /home/myname/code/header resolv.c -o resolv.out
3.定义警告级别
   最常用的警告选项是-Wall选项。其意思是warning all。使用如下命令显示特定警告信息来编译test.c,命令如下:
      gcc -Wall test.c -o test
4.其他GCC选项
   gcc [option] [filename]


 

  • -c:只将源代码编译为以.o为后缀的目标文件,而不是直接将这些文件连接可执行文件。通常用于不包含主程序(man函数)的子程序代码。
  • -o:filename: 指定输出文件名。如果不用这个选项,gcc会将文件输出到a.out,而不管输出文件的类型
  • -g:产生调试信息。如果要使用gdb进行调式,则必须使用该选项。但是该选项所产生的调式符号,并不能被其他调式器识别。
  • -O:在程序编译、连接过程中对代码进行优化。
  • -O2:比-O更好的优化编译、连接。
  • -L dir:在程序连接时,会首先在dir目录寻找类库文件,然后在系统预设路径中寻找类库。也可以使用多个-L参数指定多个类库存放的目录。
  • -lname:在程序连接时加载名为libname.a的函数库。如-lmath 表示连接名为libmath.a的数学函数库。
  • --sysboot=dir:让目录dir作为头文件和库文件的根目录
  • -B dir:将目录dir添加到编译器的搜索路径中。
  • -b:指定gcc编译的目标机器架构,如ARM、DEC、GNU/Linux、IA64、MIPS等,这也可以看出gcc的超级跨平台性。
  • -V n1.n2:使用n1.n2指定版本的gcc进行编译
  • -E:仅作预处理,不能进行编译等工作,生成i文件
  • -S:将源码编译为汇编语言代码
  • -x lang:将源代码依照特定语言进行编译,可以取得值包括但不限于C、C++、Objective-C、Objective-C++、Assembler、Ada、java等。在一系列的编译中,该选项会一直保持,知道另一个-x lang出现,指定另一种编译语言。如果是none,意味着让gcc一句文件的后缀来自动判断语言种类。


posted @ 2012-03-21 13:05 Daywei 阅读(571) | 评论 (0)编辑 收藏

Linux下C/C++学习1

      在Linux 下面,如果要编译一个C 语言源程序,我们要使用GNU 的gcc 编译器。下面
我们以一个实例来说明如何使用gcc 编译器。假设我们有下面一个非常简单的源程序
(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
要编译这个程序,我们只要在命令行下执行:
gcc -o hello hello.c

下面就详细说一下gcc的编译过程

gcc由C语言源代码文件生成可执行文件的过程,一般来说分为四个阶段:预处理(也称预编译Preprocessing)、编译(compilation)、汇编(Assembly)和链接(linking)。这四个阶段分别由gcc调用不同的程序来实现。
 


  • 预处理是调用cpp程序来实现的,预处理主要是对包含语句、宏定义等进行处理。
  • 编译是调用cc来实现的,它是源文件变为后缀为.o的目标文件的过程。
  • 汇编过程是对汇编语言的操作,通过调用as来实现,汇编同样也生成目标文件。
  • 链接是通过用ld来实现的。这是最为关键的步骤,在该阶段,ld会将各程序的执行代码放置在程序的适合位置,同时,程序调用的库函数也会以适当的方法设置调用接口。

      gcc编译时,如果在命令行没有指定其他参数,则gcc会完成编译、链接的过程,然后在当前目录中生成一个名为a.out的可执行文件。一般来说,linux并不依赖文件的后缀来识别文件是否为可执行程序,其判断文件是否可执行依据的是文件的属性。如果对于当前用户而言,文件有运行权限,则该文件为一个可执行程序。
      对于gcc而言,判断文件的类型主要是依据文件的后缀名。所以,要使用gcc编译代码,正确使用文件后缀是保证编译正确的前提。如果写了一个C++代码,却使用了.c为后缀,gcc在编译该文件时会将该文件按照C语言代码来处理,一般会出错。




      一些gcc常用的文件后缀名:

  • c: C语言源代码文件
  • a:由目标文件构成的档案库文件
  • .C、.cc 或.cxx:c++源代码文件
  • h:头文件
  • i:经过预处理的C源代码文件
  • ii:经过预处理的C++源代码文件
  • m:Objective-C源代码文件
  • o:编译后的目标文件
  • s:汇编语言源代码文件
  • S:经过预编译的汇编语言源代码文件

    gcc hello.c编译通过后,就可以简单的使用a.out调用该程序,使用命令如下:./a.out
  • 注意:这里不能直接使用a.out来调用该程序,因为shell在寻找可执行程序时,并不在当前目录中寻找,所以必须用“./”来显示指定该文件的路径是当前目录

posted @ 2012-03-19 11:08 Daywei 阅读(422) | 评论 (0)编辑 收藏

关于DXUT的问题

1.使用DXUT为什么会有链接问题
   少一些lib文件(dxerr.lib dxguid.lib d3dx9d.lib d3d9.lib d3dx10d.lib winmm.lib comctl32.lib)
   详细请参考:1.http://home.51.com/xutao185132/diary/item/10026267.html
                     2.http://www.gamedev.net/topic/474304-linker-errors/
                     3.http://www.gamedev.net/topic/570453-dxut-library-updated--new-issues/

posted @ 2012-02-16 16:48 Daywei 阅读(173) | 评论 (0)编辑 收藏

关于DirectX使用的一些注意事项

1.关于创建Direct3D设备对象
   创建Direct3D设备对象时,需要先创建Direct3D对象,然后再调用Direct3D对象的接口函数IDirect3D9::CreateDevice创建Direct3D设备对象。通过同一个Direct3D对象创建的所有Direct3D设备对象共享相同的物理资源(显卡)。因为共享同一硬件,所以如果通过一个Direct3D对象创建多个Direct3D渲染设备对象会明显降低系统性能。
   在创建Direct3D设备对象之前,还需要先初始化D3DPRESENT_PARAMENTERS结构,该结构用于创建Direct3D设备对象。此结构将会影响Direct3D设备的显示方法。
      

D3DPRESENT_PARAMETERS

Describes the presentation parameters.

typedef struct D3DPRESENT_PARAMETERS {
    UINT BackBufferWidth, BackBufferHeight;
    D3DFORMAT BackBufferFormat;
    UINT BackBufferCount;
    D3DMULTISAMPLE_TYPE MultiSampleType;
    DWORD MultiSampleQuality;
    D3DSWAPEFFECT SwapEffect;
    HWND hDeviceWindow;
    BOOL Windowed;
    BOOL EnableAutoDepthStencil;
    D3DFORMAT AutoDepthStencilFormat;
    DWORD Flags;
    UINT FullScreen_RefreshRateInHz;
    UINT PresentationInterval;
} D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;

Members

BackBufferWidth, BackBufferHeight
Width and height of the new swap chain's back buffers, in pixels. If Windowed is FALSE (the presentation is full-screen), these values must equal the width and height of one of the enumerated display modes found through IDirect3D9::EnumAdapterModes. If Windowed is TRUE and either of these values is zero, the corresponding dimension of the client area of the hDeviceWindow (or the focus window, if hDeviceWindow is NULL) is taken.
BackBufferFormat
The back buffer format. For more information about formats, see D3DFORMAT. This value must be one of the render-target formats as validated by IDirect3D9::CheckDeviceType. You can use IDirect3DDevice9::GetDisplayMode to obtain the current format.

In fact, D3DFMT_UNKNOWN can be specified for the BackBufferFormat while in windowed mode. This tells the runtime to use the current display-mode format and eliminates the need to call IDirect3DDevice9::GetDisplayMode.

For windowed applications, the back buffer format no longer needs to match the display-mode format because color conversion can now be done by the hardware (if the hardware supports color conversion). The set of possible back buffer formats is constrained, but the runtime will allow any valid back buffer format to be presented to any desktop format. (There is the additional requirement that the device be operable in the desktop mode; devices typically do not operate in 8 bits per pixel modes.)

Full-screen applications cannot do color conversion.

BackBufferCount
This value can be between 0 and D3DPRESENT_BACK_BUFFERS_MAX (or D3DPRESENT_BACK_BUFFERS_MAX_EX when using Direct3D 9Ex). Values of 0 are treated as 1. If the number of back buffers cannot be created, the runtime will fail the method call and fill this value with the number of back buffers that could be created. As a result, an application can call the method twice with the same D3DPRESENT_PARAMETERS structure and expect it to work the second time.

The method fails if one back buffer cannot be created. The value of BackBufferCount influences what set of swap effects are allowed. Specifically, any D3DSWAPEFFECT_COPY swap effect requires that there be exactly one back buffer.

MultiSampleType
Member of the D3DMULTISAMPLE_TYPE enumerated type. The value must be D3DMULTISAMPLE_NONE unless SwapEffect has been set to D3DSWAPEFFECT_DISCARD. Multisampling is supported only if the swap effect is D3DSWAPEFFECT_DISCARD.
MultiSampleQuality
Quality level. The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D9::CheckDeviceMultiSampleType. Passing a larger value returns the error D3DERR_INVALIDCALL. Paired values of render targets or of depth stencil surfaces and D3DMULTISAMPLE_TYPE must match.
SwapEffect
Member of the D3DSWAPEFFECT enumerated type. The runtime will guarantee the implied semantics concerning buffer swap behavior; therefore, if Windowed is TRUE and SwapEffect is set to D3DSWAPEFFECT_FLIP, the runtime will create one extra back buffer and copy whichever becomes the front buffer at presentation time.

D3DSWAPEFFECT_COPY requires that BackBufferCount be set to 1.

D3DSWAPEFFECT_DISCARD will be enforced in the debug runtime by filling any buffer with noise after it is presented.

Differences between Direct3D9 and Direct3D9Ex

In Direct3D9Ex, D3DSWAPEFFECT_FLIPEX is added to designate when an application is adopting flip mode. That is, whan an application's frame is passed in window's mode (instead of copied) to the Desktop Window Manager(DWM) for composition. Flip mode provides more efficient memory bandwidth and enables an application to take advantage of full-screen-present statistics. It does not change full screen behavior. Flip mode behavior is available beginning with Windows 7.

hDeviceWindow
The device window determines the location and size of the back buffer on screen. This is used by Direct3D when the back buffer contents are copied to the front buffer during IDirect3DDevice9::Present.
  • For a full-screen application, this is a handle to the top window (which is the focus window).

    For applications that use multiple full-screen devices (such as a multimonitor system), exactly one device can use the focus window as the device window. All other devices must have unique device windows.

  • For a windowed-mode application, this handle will be the default target window for IDirect3DDevice9::Present. If this handle is NULL, the focus window will be taken.

Note that no attempt is made by the runtime to reflect user changes in window size. The back buffer is not implicitly reset when this window is reset. However, the IDirect3DDevice9::Present method does automatically track window position changes.

Windowed
TRUE if the application runs windowed; FALSE if the application runs full-screen.
EnableAutoDepthStencil
If this value is TRUE, Direct3D will manage depth buffers for the application. The device will create a depth-stencil buffer when it is created. The depth-stencil buffer will be automatically set as the render target of the device. When the device is reset, the depth-stencil buffer will be automatically destroyed and recreated in the new size.

If EnableAutoDepthStencil is TRUE, then AutoDepthStencilFormat must be a valid depth-stencil format.

AutoDepthStencilFormat
Member of the D3DFORMAT enumerated type. The format of the automatic depth-stencil surface that the device will create. This member is ignored unless EnableAutoDepthStencil is TRUE.
Flags
One of the D3DPRESENTFLAG constants.
FullScreen_RefreshRateInHz
The rate at which the display adapter refreshes the screen. The value depends on the mode in which the application is running:
  • For windowed mode, the refresh rate must be 0.
  • For full-screen mode, the refresh rate is one of the refresh rates returned by IDirect3D9::EnumAdapterModes.
PresentationInterval
The maximum rate at which the swap chain's back buffers can be presented to the front buffer. For a detailed explanation of the modes and the intervals that are supported, see D3DPRESENT.

Requirements

Header: Declared in D3D9Types.h. 
      几个重要的参数加以解释说明一下,其中BackBufferWidth和BackBufferHeight指定后台缓存区的宽高(以像素为单位)。如果图形以窗口方式显示并且该成员变量被设置为0,则系统自动使用显示窗口客户区的宽高作为后台缓冲区的宽高。BackBufferCount指定后台缓冲区的数量。该值可以为0、1、2、3,其中0和1时都表示创建一个后台缓冲区。通常使用一个后台缓冲区和一个主缓存,主缓存将其显示在屏幕上。

posted @ 2012-02-16 15:24 Daywei 阅读(927) | 评论 (0)编辑 收藏

关于Direct2D使用的问题

       这两天考虑把DirectX 版本升级,同时把相关的功能也升级,比如画图,之前用的是DirectDraw比较老,现在想改用Direct2D。
      Direct2D是DirectX11中的新特性,可以说是DirectDraw的升级版。DirectX最新版本http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6812,当然要想使用DirectX11需要系统支持,win7中就已带DirectX11,而vista中使用就需要Update,以下来自MSDN文档
      Direct3D 11 Runtime

To obtain the Direct3D 11 runtime, please install the release version of Windows 7 or Windows Server 2008 R2. Windows Vista users can follow the procedure described in KB 971644 (or KB 971512 for corporate network users).

http://support.microsoft.com/kb/971644

具体如何去实现一个DirectX2D Application  参见DirectX 2010.6 版本中SDK文档——Windows DirectX Graphics Documention——Direct2D

Direct2D入门:http://blog.pfan.cn/lym51/52200.html
使用Direct2D绘图http://msdn.microsoft.com/zh-cn/magazine/ee413543.aspx

posted @ 2012-01-30 17:13 Daywei 阅读(668) | 评论 (0)编辑 收藏

傅立叶变换的物理意义(转)

1、为什么要进行傅里叶变换,其物理意义是什么?

  傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。

和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。
因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号换成时域信号。

从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。

在数学领域,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类:1. 傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子;2. 傅立叶变换的逆变换容易求出,而且形式与正变换非常类似;3. 正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;5. 离散形式的傅立叶的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;著名的卷积定理指出:傅立叶变换可以化复变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT))

正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。

2图像傅立叶变换的物理意义

图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数

傅立叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,我们习惯用一个二维矩阵表示空间上各点,则图像可由z=f(x,y)来表示。由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们可以通过观察图像得知物体在三维空间中的对应关系。
为什么要提梯度?因为实际上对图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图,当然频谱图上的各点与图像上各点并不存在一一对应的关系,即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点,实际上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅立叶变换后的频谱图,也叫功率图,我们首先就可以看出,图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好处,它可以分离出有周期性规律的干扰信号,比如正弦干扰,一副带有正弦干扰,移频到原点的频谱图上可以看出除了中心以外还存在以某一点为中心,对称分布的亮点集合,这个集合就是干扰噪音产生的,这时可以很直观的通过在该位置放置带阻滤波器消除干扰



另外我还想说明以下几点:

1图像经过二维傅立叶变换后,其变换系数矩阵表明:

若变换矩阵Fn原点设在中心,其频谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅立叶变换矩阵Fn的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。这是由二维傅立叶变换本身性质决定的。同时也表明一股图像能量集中低频区域。
、变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大(幅角比较大)

posted @ 2012-01-29 10:37 Daywei 阅读(427) | 评论 (0)编辑 收藏

如何从DirectX中获取图像


BOOL CD3DCameraViewWnd::GetImageInfo(DWORD* pPixelBuffer, int& width,int& height) { BOOL result = FALSE; IDirect3DSurface9 *_surfaceback = NULL; if (FAILED(m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &_surfaceback))) { result = FALSE; } D3DSURFACE_DESC surfaceDesc; if (!FAILED(_surfaceback->GetDesc(&surfaceDesc))) { width = surfaceDesc.Width; height = surfaceDesc.Height; } D3DLOCKED_RECT lockedRect; HRESULT hr = _surfaceback->LockRect( &lockedRect,0, 0); /* pointer to receive locked data指向申请到的内存区域*/ /* lock entire surface*/// no lock flags specified if (!FAILED(hr)) { pPixelBuffer = (DWORD*)lockedRect.pBits; result = TRUE; } _surfaceback->UnlockRect(); _surfaceback->Release(); return result; }


但是这样存在着性能的问题,经测试获取一帧需要200ms左右,为什么会存在这样的问题?因为这边有资源锁定操作。

 

现在关键的问题就在于,资源锁定的操作速度总是非常之慢.当然,你会跟我提, OpenGL似乎能够快捷地完成这项任务.但是,在Direct3D中,资源锁定操作确实是很慢的.这里面一个主要的原因是,API,驱动,以及硬件要处理一些不可回避的后台操作.那就是GPU与CPU是并行运行的,若不加任何措施,将引起类似多线程程序同步时的竞态条件的问题.

如果你试图去修改的资源正同时被一个位于GPU处理序列中的指令使用,那么整个渲染流程就会因为你的资源锁定而停顿或强制刷新(stalls and flushes).停顿(stall)会一直持续到你完成了对资源的修改并调用Unlock().而强制刷新(flush)则会要求GPU在你得到这个资源的访问权之前完成目前所有的任务.

如何去解决这个问题?下面的参考资料中有一些解决方案,我没有经过认真测试,我试了其中一个GetRenderTargetData 这样的一种方法 ,感觉不太好用,why请看Reference3


下面给出我的解决方案

BOOL CD3DCameraViewWnd::GetImageInfo(DWORD* pPixelBuffer, int& width,int& height)
{
	BOOL result = FALSE;

	IDirect3DSurface9 *_surfaceback = NULL; 
	if (FAILED(m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &_surfaceback)))
	{
		result = FALSE;
	}
	  

	D3DSURFACE_DESC surfaceDesc; 
	if (!FAILED(_surfaceback->GetDesc(&surfaceDesc)))
	{
		width = surfaceDesc.Width;
		height = surfaceDesc.Height;
	}

	LPDIREC3DSURFACE9 surf;
	if(FAILED(m_pDevice->CreateOffscreenPlainSurface(width, height,D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM, &surf,NULL)))
	{
		result = FALSE;
	}
	D3DXLoadSurfaceFromSurface(surf, NULL,NULL,_surfaceback,NULL,NULL,D3DX_FILTER_NONE,0);

	D3DLOCKED_RECT lockedRect; 
	HRESULT hr = surf->LockRect( &lockedRect,0, 0); /* pointer to receive locked data指向申请到的内存区域*/ /* lock entire surface*/// no lock flags specified 

	if (!FAILED(hr))
	{
		pPixelBuffer = (DWORD*)lockedRect.pBits;
		result = TRUE;
	}

	surf->UnlockRect();
	surf->Release();
_surfaceback->Release(); return result; }


 


 

参考资料:Reference1.http://www.cnblogs.com/mixiyou/archive/2010/02/25/1673060.html

   Reference 2.http://www.cnblogs.com/mixiyou/archive/2010/02/25/1673425.html

   Reference 3.http://blog.csdn.net/Nightmare/article/details/1707362

   Reference 4.http://www.cnblogs.com/lancidie/archive/2011/3/14.html

posted @ 2011-12-23 17:45 Daywei 阅读(2666) | 评论 (0)编辑 收藏

Code Manage

免费并支持私有库的代码管理平台http://www.voland.com.cn/free-and-support-the-private-library-of-code-management-platform

10款免费好用的源代码管理桌面应用http://www.chenchunlin.info/10-free-desktop-applications-for-managing-your-code-snippets.html

在Google Code上用 Mercurial 取代 Subversion 管理你的项目http://leeiio.me/googlecode-converting-svn-to-hg/

Google的SVN免费代码托管(版本控制)使用教程【图文教程】http://hi.baidu.com/swgweb/blog/item/8bed574e687d8c00b3de058c.html

posted @ 2011-12-05 15:43 Daywei 阅读(202) | 评论 (0)编辑 收藏

SQLite C++ Class

     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->////////////////////////////////////////////////////////////////////////////////// CppSQLite3&nbs...  阅读全文

posted @ 2011-11-17 15:11 Daywei 阅读(2577) | 评论 (0)编辑 收藏

C++之父力作学习笔记7——模板

template<class C> class String
{
    
struct Srep;
    Srep
* rep;
public:
    String();
    String(
const C*);
    String(
const String&);

    C read(
int i) const;
    
//
}
 ;
这是一个简单的String模板。template<class C>前缀说明当前正在声明的是一个模板,它有一个将在声明中使用的类型参数C。在引入后,C的使用方式恰如其他的类型名。C的作用域将一直延伸到由这个template<class C>作为前缀的声明的结束处。注意,template<class C>只是说C是一个类型名,它不必一定是某一个类得名字。
      模板类中成员的声明和定义与在非模板类里完全一样,模板类的成员也不必在类本身的内部定义,在这种情况下,它的定义必须出现在某个地方,像非模板类的成员一样。模板类的成员本身也是模板参数化的,与它们所在模板类得参数一样。在类外定义这些成员时,就显式地将它们定义为模板。例如:
template<class C> struct String<C>::Srep
{
    C
* s;
    
int sz;
    
int n;
    
//
}
;

template
<class C> C String<C>::read(int i)const
{
    
return rep->s[i];
}


template
<class C> String<C>::String()
{
    rep 
= new Srep(0,C());
}
      在一个程序里,对一个类成员函数只能有一个函数定义。同样,对于一个类模板成员函数,在一个程序里也只能有一个函数模板定义。但在另一方面,重载只能针对函数去做,而专门化使我们能够为同一个模板提供不同的实现。
      类模板的名字不能重载。所以,如果在某个作用域里声明了一个类模板,就不能有其他以同样名字声明的实体。

posted @ 2011-09-24 17:52 Daywei 阅读(323) | 评论 (0)编辑 收藏

仅列出标题
共4页: 1 2 3 4 
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章档案

牛人博客

搜索

积分与排名

最新评论

阅读排行榜