欢迎来到antinucleon的窝!!这里随手记录了antinucleon的点点滴滴

2010年8月8日星期日

【存档】【转载】C++ 书籍导读(2) - 选择书的基本原则(1)

书的内容是否反映C++全貌
-----------------------

  我们这里讲的书都是指那些系统的教材,因此,反映C++ 的全貌是很重要的。
我们常见的 C++ 教材从内容上,可能包括下面的部分:
 
1、计算机与二进制基础知识;
2、C++ 基础语法; 
3、C++ 面相对象抽象机制; (OO - Object Oriented)
4、C++ 模板、泛型编程抽象机制; (GP - General Programming) 
5、C++ 标准模板库与数据结构/算法;(STL - Standard Template Library)
6、C++ 编程思想、编译问题与高级技巧;

例如 C++ 发明人 Bjarne Stroustrup 的 The C++ Programming Language 就是
包括 2-6,并以3-5 为主要内容,并综合介绍编程思想以及 C++各项功能的原理
的。

  这个原则可以帮助我们筛选掉一些不合格的、内容比较过时的书。很多国内
作者的书可能只包括1-3,或者4-5只占1、2章这样极少的篇幅,这样的书就属于
内容不全,可能造成重复购买。

书的内容是否详略得当
--------------------

  由于现代 C++的内容非常厚实,一般的 C++教科书的厚度都在3-4 厘米,五
号字排版,需要800-1200页。

  教材应该以教授目的为主,过于简略(大部分国内教材),失去细节,可能
造成学习者不能实际掌握;过于详细,会增加学习者的负担,在细节上耗费功夫。
后面我们会比较,例如 Deitel 父子一共出了很多本 C++的书,其中最厚的那本
就是细节过多,不适合于初学者阅读,而适合于中级读者再学习或参考使用。

  如果有一定基础,可以看看书的目录,看看书的各部分章节的配重。有些书
章节很全,但是 模板/STL 部分的比重很少,这样的书可能重点在前面,即类的
使用那部分。例如电子工业出版社的《C++语言程序设计》 ( James P.Cohoon, 
Jack W.Davison: C++ Program Design (3rdEd) 就是这样一本书, 而且这本书
比较详细地介绍了计算机知识和二进制的知识,因此属于入门书籍。

  再例如,大家熟悉的 C++ Primer (Stanley B.Lippman, Josee Lajioe: 
C++ Primer (3rdEd))是以上面 2-5 的内容为主的书,各部分篇幅相当,算是
一本中等难度的可以做参考书的一本教科书。

--

�手中握住繁� 心情�也�得荒� 才��世上一切都��幻  
�青春剩下日� ��就要�成白� 不�的只有那首歌  在心中�回的唱 


※ 来源:・BBS 水木清华站 smth.edu.cn・[FROM: 211.150.200.5]

【存档】【转载】C++ 书籍导读(1) - 引言

文本为水木清华BBS C++ 讨论区所作。欢迎转载,转载时请保留完整的标题
和作者信息。如需修改本文请致函:exbluesea@hotmail.com。作者 exbluesea。

  一直承诺为这个版的 C++初学者以及其他感兴趣的读者写这篇东西,深感困
难。一方面,我不可能通读所有的著作;另一方面,去评价诸位大师的著作总是
心感不安。好在可以换一个角度,从一个学习者、消费者的需要出发,来看看选
择书籍过程中所需要考虑的问题。

  很多的作者和大部分出版商都会声称自己的书适合你,甚至适合从初学者到
高级读者的所有人群,尽管理由可以头头是道,遗憾的是这是不可能的。不过本
文的观点也只代表一家之言,任何事情都不能绝对化,因此仅仅作为参考。

  要想选择一本适合自己读的书,第一步最好是要对你自己的情况以及 C++本
身有所了解。这听上去好像是要取锁在屋里的钥匙。不过,如果你不认识钥匙是
什么样子的,即使你进了屋子也白搭。

学前动员

  在动员之前,我还是想泼一下冷水。C++ 可是目前大多数通用编程语言中最
难学的一个。如果应付一时只需或希望有很快的上手,Visual Basic、Java可能
会是更好的选择。掌握他们也很可以在公司找到差使,甚至如果你看些资料,满
口英文,还可以混到一个不错的职位。

  至于 C++和其他语言的比较,我们准备另出 FAQ。我只想说的是,C++ 像一
个健壮和智慧的男子,学习和掌握他,你可以像他一样健壮和智慧。

学前准备

  初学者的情况会比较复杂,知识掌握的程度参差不齐。我认为在学习一门计
算机语言之前,特别是你如果要学习 C++的话,应当对计算机的基础知识有所了
解,包括 CPU、指令系统、存储器、虚拟存储器、二进制与十六进制数字、操作
系统等。这些知识也可以随 C++的学习而渐进,但是不掌握这些知识对运用 C++
会有很大的障碍。特别是那些没有接触过编程的人,要特别注意这一点。

  另外,应该清楚编一个完整的程序实际上要和四个东西打交道: 1、语言本
身; 2、语言的开发工具; 3、操作系统的应用程序接口(API);  4、应用领域
的应用程序接口。例如,编写一个收取邮件的程序,我们可以完整地描述为:

  我“用 C++ 语言”“使用 Microsoft Visual C++ 7.0开发工具”
“在 Microsoft Win32平台(NT/2000/xp)上”“使用Winsock API” 开发一个邮
件收取程序。

  C++ 是一个编译语言,就是说,书写的 C++源程序,需要经过编译器等工具
进行编译、连接,变成操作系统能够使用的可执行文件,程序才能运行。常见的
编译器包括Windows 下常用的 Microsoft C++,以及 Unix/Linux 下常用的g++;
源程序编辑器、编译器、连接调试工具经常组合在一起形成一个产品,提供更方
便的开发环境(IDE),例如 Microsoft Visual C++ 和 Dev C++等。

  学习 C++还需要了解常用数据结构的概念,包括向量、队列、表、树,以及
时间复杂度、空间复杂度等,因为C++ 的标准库就会经常和这些东西打交道。

  C++ 从发明至今已经有十几年的历史,可以说历史上大约有两次 C++的市场
高峰,一个是 C++面世不久,Microsoft/Borland 推出了自己的 C++产品,特别
是大家熟知的TC/BC++ 3.x;另一个高峰就是 1998年 C++的ANSI标准通过后直到
今天,C++ 的应用得到空前的推广和普及。我要学习的现代 C++就是指符合ANSI
标准的 C++,而不是早期的 C++。

学习步骤

  学习C++ 本身大致分为 5 个步骤:

  不管 C 语言的 C90 版本如何,我们仍然可以说,C++ 的单句语法是基本继
承了 C 的单句语法。学习 C++ 的第一步是掌握单句语法,包括变量、表达式、
条件转移、循环语句、指针等;

  第二步是学习 C++的面向对象的抽象机制,包括类、类的派生和继承、多态
等。早期的 C++ 大致就是这些了;

  第三步是学习 C++的泛型编程的抽象机制,包括类和函数的模板。这个是早
期 C++所不具有或不完备的;

  第四步是学习 C++标准模板库(STL) 的使用。把库提高到语言的高度,说明
了STL 的重要程度。这个是前人经验的总结,熟练使用 STL,实际上能够把编程
的效率提高一个档次;

  第五步可以穿插在上述四个步骤中,就是学习和掌握 C++的高级特性,包括
异常、运行时刻类型机制、操作系统API的使用、线程和进程以及其他使用技巧。

学习过程

  初学者本身的情况实际上就是学习的起点;

  还应该为自己设立一个目标,至少是一个里程碑,是希望对 C++有所了解呢,
还是希望成为一个 C++高手;以及希望在哪些方面有所特长?

  有了起点和目标,决定学习时间长短的就是你的能力和付出的努力了。大致
的说,学过其他编程语言的,粗粗学完第二步大约只需要1-2个月,即可上手甚
至编写一些复杂的东西,而比较精细和完整地掌握大部分东西,可能需要至少一
年时间甚至更长。

  弹性之大完全是因为每个人的学习情况完全不同,格外的努力和聪明、格外
的懒散和笨拙,对学习时间都和结果都影响很大。

书籍介绍

  随后的书籍介绍大致会按照:书籍本身介绍的摘录、大致评价、适用者以及
比较、采购等几个方面来进行。新书会层出不穷,本系列也随之更新。

--

�手中握住繁� 心情�也�得荒� 才��世上一切都��幻  
�青春剩下日� ��就要�成白� 不�的只有那首歌  在心中�回的唱 


※ 修改:・exbluesea 于 Oct 10 10:07:43 修改本文・[FROM:    61.149.28.20]
※ 来源:・BBS 水木清华站 smth.edu.cn・[FROM: 211.150.200.5]

深夜随笔

草草看完一些数学资料,打印了一些东东。想到itgirl提供的帮助,不禁窃喜。

不过心里还是有些阴影。随即和skydoom聊了聊。

skydoom和RoachCock提出了一个相同的问题:看你做什么了。

我到底是什么领域的呢?

翻看最近糟蹋的DXUT代码,悲叹良久。

我的确看不出花出去的时间到底会有什么收获,于是导致什么都干不好?

从Windows API到DXUT,我是受了Mac OSX的影响,觉得Ribbon比健壮的功能有效吗?

想不清楚到底在干什么,应该做什么。

skydoom建议我去看看精华区,果不其然,发现了exbluesea的文章。


相见恨晚。

一切如行云流水,相当的自由,而又道出真谛——原来我一直不解的迷惑的,都是他早说过的。

后来才知道exbluesea原来是潘爱民老师。

热血沸腾得读完,留下他当年的qmd留念:

�手中握住繁� 心情�也�得荒� 才��世上一切都��幻
�青春剩下日� ��就要�成白� 不�的只有那首歌  在心中�回的唱









2010年8月4日星期三

2010年8月3日星期二

DXUT......�

All of the DXUT controls work similarly to Windows controls. They are implemented entirely from scratch and do not use HWND or any Windows control underneath. They are also rendered with Direct3D, and therefore can be used by both windowed and full screen Direct3D applications.


恩。。。。拿到DirectX SDK,还以为就是这样就开始了,没想到比Win32 SDK还要复杂N倍。DXUT是一个"简单"的轮子,包括基本的DXUT GDI, DXUT Sound, DXUT 3D/2D功能。


开始还以为一而且都要从新开始。当我无法理解为什么在引用d3d9.h为啥会出怪怪的问题。当打开CDXUTDialog的定义才看到,大概DXUT GDI的类定义有1341行。所有实现估计要上万行了。


文档显示,DXUT GDI能响应的事件有

Event Callback

Certain events happen as the user interacts with the UI controls, such as checking or unchecking a check box, selecting a new item in a combo box, selecting a new item in a radio button group, etc. The application may be interested in such events, and it can be notified with the CDXUTDialog event callback mechanism. In the sample, a callback function, OnGUIEvent, is defined and passed as the parameter to the CDXUTDialog::SetCallback method. As a result, this function will get called whenever the user performs an interesting action with a UI control. The actions that can trigger a callback are:

  • Clicking a button (CDXUTButton)

  • Selecting a new item in a combo box (CDXUTComboBox)

  • Selecting a new item in a radio button group (CDXUTRadioButton)

  • Changing the check state of a check box (CDXUTCheckBox)

  • Changing the value of a slider (CDXUTSlider)

  • Pressing Enter in an edit box (CDXUTEditBox and CDXUTIMEEditBox)

  • In the callback, the type of event, the ID of the control that fired the event, and the control object are available to the application. The sample responds to the callback by retrieving content of the firing control and displaying it on screen.



也就是说,需要更多的功能只能自己车轮子了。

网易的风云车出了不少轮子,一统国内游戏界。俺先搞明白M$的轮子是怎么造的吧


�。睡了一觉,舒服多了,又要看这些张牙舞爪的定义。





2010年8月2日星期一

zz【存档】对不起 我是程序员

有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。  "如果你亲我一下,我会变成一个美丽的公主哦。"男人一言不发,把青蛙捡起来,放入口袋。  "如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。"男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。  "如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。"男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。  "如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。"再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。  最后,青蛙无力地问:"我开出了这么好的条件,为什么你还不肯吻我?"   男人说:"我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。"


2010年8月1日星期日

EmptyProject? BullShit!!!


真没人性。。。。。。

 

见过恶心的,没见过这么恶心的

 

 

//--------------------------------------------------------------------------------------

// File: EmptyProject.cpp

//

// Copyright (c) Microsoft Corporation. All rights reserved.

//--------------------------------------------------------------------------------------

#include "DXUT.h"

#include "resource.h"

 

 

//--------------------------------------------------------------------------------------

// Rejects any D3D9 devices that aren't acceptable to the app by returning false

//--------------------------------------------------------------------------------------

bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat,

                                      bool bWindowed, void* pUserContext )

{

    // Typically want to skip back buffer formats that don't support alpha blending

    IDirect3D9* pD3D = DXUTGetD3D9Object();

    if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,

                                         AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,

                                         D3DRTYPE_TEXTURE, BackBufferFormat ) ) )

        return false;

 

    return true;

}

 

 

//--------------------------------------------------------------------------------------

// Before a device is created, modify the device settings as needed

//--------------------------------------------------------------------------------------

bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )

{

    return true;

}

 

 

//--------------------------------------------------------------------------------------

// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)

// and aren't tied to the back buffer size

//--------------------------------------------------------------------------------------

HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,

                                     void* pUserContext )

{

    return S_OK;

}

 

 

//--------------------------------------------------------------------------------------

// Create any D3D9 resources that won't live through a device reset (D3DPOOL_DEFAULT) 

// or that are tied to the back buffer size 

//--------------------------------------------------------------------------------------

HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,

                                    void* pUserContext )

{

    return S_OK;

}

 

 

//--------------------------------------------------------------------------------------

// Handle updates to the scene.  This is called regardless of which D3D API is used

//--------------------------------------------------------------------------------------

void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )

{

}

 

 

//--------------------------------------------------------------------------------------

// Render the scene using the D3D9 device

//--------------------------------------------------------------------------------------

void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )

{

    HRESULT hr;

 

    // Clear the render target and the zbuffer 

    V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 170 ), 1.0f, 0 ) );

 

    // Render the scene

    if( SUCCEEDED( pd3dDevice->BeginScene() ) )

    {

        V( pd3dDevice->EndScene() );

    }

}

 

 

//--------------------------------------------------------------------------------------

// Handle messages to the application 

//--------------------------------------------------------------------------------------

LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,

                          bool* pbNoFurtherProcessing, void* pUserContext )

{

    return 0;

}

 

 

//--------------------------------------------------------------------------------------

// Release D3D9 resources created in the OnD3D9ResetDevice callback 

//--------------------------------------------------------------------------------------

void CALLBACK OnD3D9LostDevice( void* pUserContext )

{

}

 

 

//--------------------------------------------------------------------------------------

// Release D3D9 resources created in the OnD3D9CreateDevice callback 

//--------------------------------------------------------------------------------------

void CALLBACK OnD3D9DestroyDevice( void* pUserContext )

{

}

 

 

//--------------------------------------------------------------------------------------

// Initialize everything and go into a render loop

//--------------------------------------------------------------------------------------

INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int )

{

    // Enable run-time memory check for debug builds.

#if defined(DEBUG) | defined(_DEBUG)

    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );