勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

#

关于会话记录Session的实现

     摘要:        Session的适用性很广,翻译为‘会话’,最初接触他的时候在做web方面,可以记录一个用户的会话记录,当关闭浏览器的时候失效!Session实际上是一个特定的时间概念.       在最开始接触它时没有刻意的研究实现与扩展性,然后最近的一个工程有这...  阅读全文

posted @ 2009-04-22 20:53 expter 阅读(1421) | 评论 (1)编辑 收藏

一周回忆(2009.03.30-)

     本周公司游戏公测,然后也玩了此玩游戏,同时也比较关心游戏的运营状态,毕竟是公司第一款游戏。
    虽然没有参与此游戏的开发,但是看了server部分的代码,可以通过此次运营游戏的问题,来提醒自己以后尽量不要出现此问题,或者是提供一个更好的解决方案。


    本周在公司没做多大的事情,游戏公测,我也跑去玩游戏去了,虽然没有太大的网游天赋,但是还是尽量通过看的资料与代码在结合游戏来熟悉各个环节,为自己以后开发做好一定的基础。

     本周清明节,放假3天,放假第一天先是回校和朋友们耍了,然后一起去图书馆还书,在借书,然后收到3G门户人事的一些信息。放假第二天电脑出问题了,我写的代码用VS2005,VC6 一link就会死机,只有拔电源。我也不知道什么BUG。郁闷惨了,重装系统问题依旧。陷于崩溃,最后打了几盘Z3,缓解了下心情,然后只有用DEV了。晚上换了以前的Solaris,安装了Ubuntu8.10,当然是虚拟机。放假第三天,和朋友逛了家乐福,下午睡觉,看了下毕业设计,有一些头绪了。  然后晚上看了会书。三天放假就这样过去了,感觉就像一宅男,下午和妈妈聊天,他喊我出去处处逛逛,我说一个人没撒好逛的,已在叮嘱我多吃,吃多点,感觉在父母眼中还是个小孩。。  这周看了2部电影,很好看,很好看,一部励志电影《当幸福来敲门》 一部很感人的爱情片《八月迷情》。


     同时最近看了些书与代码,感觉收获蛮大,风格和注意问题都有提高。希望能再接再厉,保持状态,努力学习!



   

posted @ 2009-04-06 23:55 expter 阅读(367) | 评论 (0)编辑 收藏

Cutting Corners (acm 1996)

     摘要: 地址连接:http://www.karrels.org/Ed/ACM/96/ccorners.html刚开始做这题时候,没作对,后来优化了下代码,问了下pozen,测试代码通过,只是没有地方提交。。。寻路是dp(动态规划)。。其实可以成优化成很小,直接是求所有点中的其中2点距离。 1996 ACM Scholastic Programming Contest Finals sponsored ...  阅读全文

posted @ 2009-04-04 21:25 expter 阅读(500) | 评论 (1)编辑 收藏

一周总结,读书笔记

          这周主要是熟悉开发流程,阅读工程代码,熟悉方案逻辑,查看需求文档,然后就是看书学习,闲来无事可以听下歌,中午休息的时候去zoj做了几道题目。

         
        查看了接近一周的代码和书籍有了一下总结:
1.如果不需要一个类的对象不能被隐式的转换,可以在构造函数前增加关键字explicit  
   
 1template<class T>
 2class Array
 3{
 4public:
 5    explicit Array(int _size = 0);
 6    T & operator [](int index);
 7    
 8}
;
 9
10Array<int> a(10);
11Array<int> b(10);
12
13if (a == b[i])
14{
15    // 如果没有加explicit,可以编译通过,加了就不能通过
16}

17// 要转换可以使用
18if (a == static_cast<int> b[i])
19{
20    ..
21}

2.可以通过宏或者const常量,来优化,减少和优化常量,还可以利用宏来定义一些函数,或者字符串的处理。
   比如一个简单的字符串处理
  
1#define  STR(ST) #ST

3.容器的使用,注意各种函数的参数和返回值以及各种函数使用。
   比如:关联容器和标准容器在删除元素的时候会不同。
     例子:
 1对于ma等关联容器的元素删除
 2map<int,int> mp;
 3for (map<int,int>::iterator it = mp.begin(); it != mp.end();)
 4{
 5    if ()  //满足删除条件
 6    {
 7        mp.erase(it++);//删除当前节点,并返回下一个元素,自加
 8    }

 9    else
10    {
11        it++;
12    }

13}

14对于vector等标准容器的元素删除
15vector<int> ve;
16for (vector<int>::iterator it = ve.begin(); it != ve.end();)
17{
18    if ()  //满足删除条件
19    {
20        it = ve.erase(it);
21    }

22    else
23    {
24        it++;
25    }

26}

27
28关于2者区别主要是erase返回值问题,可以在网上查相关的说明,

4.关于内存池,基于动态分配的安全的线程池,可以利用2个参数,一个数据类型,一个锁类的参数模板。
   关于内存池可以阅读boost::pool 库相关文档,Boost pool 库引入了可用于实现快速内存分配的工具。正确的内存块对齐可以得到保证。

   根据 Boost 文档所述,当您分配和释放许多小型对象时,建议使用池。使用池的另一个不太明显的优点在于,作为程序员,您不必担心内存泄露:内存由 Boost 库在内部自动进行管理。要使用 pool 库,您不必在链接时提供特定的库——单凭头文件就足以完成链接了。 有多个接口对 pool 库可用:
   关于Boost pool可以阅读
  http://www.ibm.com/developerworks/cn/aix/library/au-util_boost_lib/


     另外实现一个锁类有很大的用处,比如
 1template<typename TyVal>
 2class Lock
 3{
 4public:
 5    explicit Lock()
 6    {}
 7    explicit Lock(TyVal val):_val(val)
 8    {
 9        //加锁
10    }

11    ~Lock(){//释放}
12private:
13    TyVal _val;
14}
;
15
16如果我们有一段代码需要加锁,则可以直接使用
17vector<int> Vint;
18Lock<vector<int> > lock(Vint);
19可以直到lock的声明周期结束,释放资源

5.关于重载操作符,本周看到同事们在讨论一个关于结构体的代码
  实例如下:
  
 1struct Test
 2{
 3    //
 4    
 5    Test & operator = (const Test &_t)
 6    {
 7        //关于此处是否需要增加一个 _t与*this的判断,
 8       memcpy(this,&t,sizeof(t));      
 9        return *this;
10    }

11    
12    //
13}
;
    因为效率和安全的问题,是否需要增加判断的代码,比如
     if(_t == *this)
     {
         return *this;
     }
   其实Effective C++的条款17: (在operator=中检查给自己赋值)的情况已经说了需要增加一个自检验证,我们姑且不考虑memcpy的数据重叠问题(new placement),增加一个明显有好处。

6. 必须有良好的OOA,OOD思想,这样能更快写出,高效的代码。
7. 算法重要,有良好的编程风格,在确保程序稳定的同时,增加效率。
 

个人总结不代表其他意见。。

posted @ 2009-03-29 22:28 expter 阅读(2855) | 评论 (7)编辑 收藏

智能指针(auto_ptr 和 shared_ptr)

都是这周看书以及代码的总结:
  
    Stl  中 auto_ptr只是众多可能的智能指针之一,auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。
    这里是一个简单的代码示例,如果没有auto_ptr,
    
   

 

 1void ProcessAdoption(istream &data)
 2{
 3 
 4    while (data)                            // 如果还有数据
 5    {
 6        ALA   *pa = readALAData(data);      // 取出下一个数据
 7        pa->DealProcessAdoption(data);        // 处理
 8 
 9        delete pa;                          // 释放资源
10    }

11    return;
12}


     如果在DealProcessAdoption有一个exception,会发生什么事情,因为ProcessAdoption不能捕获他,所以这段代码很危险,所以DealProcessAdoption后面的代码可能会跳过,造成内存泄露。
如果利用try catch去捕获他,会搞得代码很乱,又缺少美观性。

所以Stl提供了一个智能指针来解决这个问题,我们可以先模拟实现一个智能指针的类实现。

 

 1// 关于一个智能指针的定义
 2template<typename Type>
 3class auto_ptr
 4{
 5public:
 6    auto_ptr(T *=NULL) :Ptr(p)
 7    {     }
 8    ~auto_ptr()
 9    {
10        delete Ptr;
11    }

12private:
13    Type *Ptr;
14}
;
15
16
17void ProcessAdoption(istream &data)
18{
19
20    while (data)                            // 如果还有数据
21    {
22        auto_ptr<ALA> pa(readALADara(data));
23        pa->DealProcessAdoption(data);
24    }

25    return;
26}


这个版本和原先版本的差异只有二处,
第一pa是一智能指针的对象,不是ALA*
第二不用自己去释放delete

然后我看到Effective STL的条款
8:永不建立auto_ptr的容器
关于此可以看的Effective STL的条款8

因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char>  pstr (new char[12] ); //数组;为定义
然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;

然后收集了关于auto_ptr的几种注意事项:
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器

然后笔者从而推荐的是boost的shared_ptr,然后看完shared_ptr关于智能指针的介绍与例子。
5种针对auto_ptr不足的指针如下:需要详细了解可以去查看相当文档,与测试新代码。
scoped_ptr <boost/scoped_ptr.hpp> 简单的单一对象的唯一所有权。不可拷贝。
scoped_array <boost/scoped_array.hpp> 简单的数组的唯一所有权。不可拷贝。
shared_ptr <boost/shared_ptr.hpp> 在多个指针间共享的对象所有权。
shared_array <boost/shared_array.hpp> 在多个指针间共享的数组所有权。
weak_ptr <boost/weak_ptr.hpp> 一个属于 shared_ptr 的对象的无所有权的观察者。
intrusive_ptr <boost/intrusive_ptr.hpp> 带有一个侵入式引用计数的对象的共享所有权。

1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

关于shared_ptr的使用其实和auto_ptr差不多,只是实现上有差别,关于shared_ptr的定义就不贴代码了,以为内开源,可以网上找
1、shared_ptr<T> p(new Y);


要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28
要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板
    

posted @ 2009-03-29 15:50 expter 阅读(31264) | 评论 (5)编辑 收藏

2007年我在干啥

     摘要: 2007年我在干啥  阅读全文

posted @ 2009-03-29 14:50 expter 阅读(1662) | 评论 (3)编辑 收藏

生活杂记。。。

         这周末本来打算租房的,结果还是没找到,很郁闷了,估计还得每天早起晚归一周,原因有几:房价太高,条件不好,都是中介舍不得中介费,家具配置也不咋全。


         这周在fox的帮助下,终于把Netmonitor搞完了,平时还是得多看书,多学习。
        周六找房子没找到,实习论文懒得写,晚上又真三了一盘。
        周末去上了会自习,看了下书,闲时看了下朋友的公务员题目,看了几道题有几个不会,汗一个
       
       题目如下: (猜数字)
      1 .    1    2    3    35   ..       猜下个数字
      2 .    1    3    4    1     9       猜下个数字


    下周计划:
         1.没事就多看书,多看代码,多与其他人交流。
         2.每天晚上多熟悉shell编程。
         3、一定要确定房子。
         4、提前一个月祝女友公务员考试成功。因为你生活更精彩!

  

posted @ 2009-03-08 16:28 expter 阅读(388) | 评论 (2)编辑 收藏

一个索引表 (风格,问题推广分析)

     摘要: 今天看到以前写的一个关于容器排序以及赋值问题。先贴以前代码 #include <iostream>#include <cstdlib>#include <vector>#include <algorithm>using namespace std;template< cla...  阅读全文

posted @ 2009-03-08 14:58 expter 阅读(1222) | 评论 (2)编辑 收藏

一些学习笔记 ,陷阱,缺陷

 


1、关于初始化:

deque<string> Deque;// 一个deque容器

deque
<string> Deque2(Deque.begin(),Deque.end());                // 一种初始化

copy(Deque.begin(),Deque.end(),back_inserter(Deque2) );         
// 一种初始化

deque
<string> Deque3(istream_iterator<string>(cin),istream_iterator<string>()); // 一种初始化
  现在讨论第三种初始化方式,
typedef istream_iteraor<string> (Func)();

deque
<string> Deque3(istream_iteraotr<string> cin, Func);  
看上去像一个函数声明,

typedef istream_iteraor
<string> (Func)();
deque
<string> f(stream_iteraor<string> ,Func);
现在比较清晰了吧,很像一个函数声明了,

所以第三种初始化方式根本就不能做任何事情.

//如果真的要达到初始化的目标,可以通过括号来消除二义性
deque<string> Deque3( (istream_iterator<string> (cin)) , istream_iterator<string>() );

通过加括号来提示编译器我们这里提供的是构造函数的参数而非参数声明,因为 (istream_iterator<string> (cin))  不能解析为变量声明,这个更void f ( (int i)) 不可能是函数声明是一回事。多一对括号不可能解释为合法的声明语句。


2.关于double 和float 区别

一个例子
int main()
{

  
double  x = 1e8;
  
  
while(x >0)
      x
--;


   
return 0;
}


 

现在的编译器一秒就可能运行完成,
如果吧doubel x = 1e8 ,换为 float x = 1e8;
 C++标准说 :
 浮点类型有三种: float ,double, long double,关于精度很显然
如果换成float 答案很诡异,因为取决于float的精度,能否表达0 1e8区间的整数

所以如果换为 float,可能运行一秒,也可能是死循环,因为如果float不能表达0 1e8区间的整数, 因为其中 n-1 = n (由于浮点精度不够)



3. 一些拼写代码错误

#include <iostream>
#include 
<iomanip>

using namespace std;

int main()
{
    
int x = 1;
    
for (int i =0 ; i < 100; i++)
    
{
        ;
    }


    
//  下面这行代码会干些什么?递增???????/
    ++x;
    std::cout 
<< x << std::endl; 
    
return 0;
}


  一个支持标准c++的编译器答案输出是 1
  原因很诡异,因为有个有趣的是:注释末尾‘??/’会被转换为'\' ,写个宏的都知道这个就是换行符,所以??/换转换为\ ,而++x就相当于粘贴到注释行的末尾 ,所以++x.,不会起作用,是注释的一部分。

在看一个例子:
一个符号标准 c++的编译器会报多少错误。
struct X 
{
    
static bool f(int *p)
    
{
        
return p &&0[p] and not p[1:>>p[2];
    }

}
;

先一步一步的分析
1:0[p] 其实和p[0]一样
2: and not都是有效关键字 ,他们分别是&& 和!
3::>竟然也是合法的,他是]的双字符写法。

所以这个语句会被解析为 return p && p[0] && !p[1]>p[2] ,没有语法错误。
很诡异。

 

posted @ 2009-03-08 14:05 expter 阅读(1848) | 评论 (5)编辑 收藏

最近笔记以及总结!

     来公司已经2周了,自己做的工作挺少,给的3周完成的一个编辑器,不到2周基本功能做完了,因为没有详细的设计,而且是内部的人员使用,很多的功能都是自己来规划的,其实我觉得平时在校的话 这个3-4天就可以做完,不知道为啥做了这么久!

     没看看着忙碌的同事,还有游戏正在三测,都在加班,我只是看一些一些接口,一些逻辑代码,没多大的事情,估计是刚来任务也很轻吧,呵呵!
   
     在校虽然学了主流的的语言,但是最后选择C++,因为它开发自由,效率高,结构性很强等等。最近看了几本书,对OOD,OOA,以及编写代码时的问题,与良好的设计模式有了一定的提高,但是对于有些又有些遗忘,比如STL,LUA,软件工程。在我看来,一个程序员必须有很好的算法功底与扎实的数据结构!最近手中还有几本书,打算闲的时候看,OOD启示录,boost也得学学,另外stl,设计模式和网络编程以及他的几种模型都要加强复习。

     在我看来一个项目只有有了这方面的理论知识,有一门熟练的语言,实现起来都很快,自己感觉缺少的是一种思想,架构思想,估计是自己接触的太少,经验太少,需要的是时间来催化!
    
     同时很高兴在新的环境认识了新的朋友,大家都很和善,同时也知道fox,kevinlynx也经常在CPPBLOG这里写日记,以后得像2位学习,以及公司的同事都是俺的前辈。

     在大学没有写个太大的程序,估计最大一个软件的在6K左右行吧(c++),ACM估计在100多道,以及平时也的小东西不到20个项目。学习笔记,以及一些简单的win 32 编程还是有少许,比如底层驱动之类的。

     现在的任务就是多看一些大牛的技术blog,多看书,多写代码才是王道,以后编程尽量规范了,良好的风格以及更好设计模式,更优的算法才是最好的,在我平时做什么东西,都希望敢时间,几下就做不了了之。还得改正。

     我比较喜欢网络编程,平台方面主要是win,对于linux只是写过,平时玩玩。学得都比较浅毕竟没做个啥子大的商业项目。既然来了这个公司就要做出自己成绩。年轻有无限的激情,就要努力。

     在等段时间就要写毕业设计和论文了,希望没多大问题,一个彩色人脸识别程序,关键是识别成功率!

     在大学最后的时间即将完成,迈入社会就得认真对待任何事情了。努力工作,挣钱,养老婆,呵呵!   

     加油!!!就想kevinlynx那天说的,让人知道你能做什么,会什么!!

     因为自己表达能力稍加,一般不写技术,怕描述因次误导或者乱说了,其实也没多大技术含量、、、呵呵 主要记录的生活笔记!

posted @ 2009-02-22 22:21 expter 阅读(1986) | 评论 (12)编辑 收藏

仅列出标题
共7页: 1 2 3 4 5 6 7