浪迹江湖
成长的足迹,
posts - 4,comments - 0,trackbacks - 0
在高新园区的网络大厦实习了一天,坐在电脑前看课件,却总是扭头望着窗外的大海。

    经常来大工和海事大学,也偶尔在高新园转转,总以为这里群山环绕的一块平地。走在黄浦路路上看到的是两边的高楼和路边的巨型绿化带,总以为那群楼后面就是一座座的小山了。有这个想法的确不能怪我,因为大连本身就是多山的沿海城市,因为山多所以在这里骑自行车的非常少,所以楼下停车场里看到的都是漂亮的私家车和富态的面包车,不像别的城市,任何能停车的地方,排的满满的总是自行车而让私家车找不到合适的停放位置。
   (跑题了还是说说山吧)小时候天天看山对山已经没有什么感觉了,但是大连的山却是有个特点,不大,就像野外的乱坟岗一样,这一座那一座,开发商耗费了大量的人力和物力把山搬走把坑填平然后建房子,真该感谢这些开发商,是他们把大连建的像模像样的,所以大连的房子贵也不要抱怨了。我们的学校就建在山上,呆了三年的老校区是,搬到新校区来仍旧是,老校区的半个校区就建在山腰上,新校区却很特别,沿着山脚一路修建,整得像一串项链,下面坠着宿舍,上面由三个教学楼撑着,幸好大四了没多少课,不然天天这头跑到那头去上课,那头跑到这头来吃饭,再回去上课,再回来睡觉,一天几个来回时间都耗在路上了,真为学弟学妹们不平,走的时候该臭骂学校一番,因为那些没必要去上的课却每次都要签到。反正是要走了,让那些不负责任的老师都见鬼去。哈哈。

   (又跑题了不是,难怪高中作文总是低分)说说水吧,水,在大连就是海,在山里长大的孩子不知道海是什么样的,小时候在一个亲戚家,在一个一百多亩的大鱼塘边过了几年,天天晚上睡在船上,白天在河边沙滩上跑圈,半夜撑船抓鱼,外面的人很羡慕我,可我感觉很累,累怕了,我在那里就是一个只管吃饭,不付工钱的工人,甚至连件衣服都讨不到,以至于长大了就再也不想去那个亲戚家。心想,海,是不是由这几百几千个百亩大河拼成的呢,想是想着,但是对于海已经没有那么大的好奇心了,所以来大连的第一件事并不跟那些内陆来的想看海的孩子一样下了火车就跟爹妈一起跑到海边了,我却是一个人拎着包去了学校,走在路上对这个城市有着好奇心,都说北方冷,所以穿了两件衣服下的火车,夏天,有凉风,不是很热,如果当时不是穿两件衣,应该不会在第一时间感受到大连夏天的凉爽吧。这里有很漂亮的高楼,每隔一段距离,有一个绿绿的广场,很大气,来这第一个影响比较深的广场是希望广场,看看希望广场再看看威严的希望大厦很有感觉。直到十·一的时候,才跟同学一起去星海疯了一把,星海不愧为亚洲第一大广场,一眼望不完,旅游的地方风景不一样,有马车,双人自行车,还有飞艇,星海国宝……(要说的很多,有时间专门写一篇关于星海的日志吧)总之星海给人一种不一样的感觉,没有太高的雅兴,没有太好的审美,我也能吹吹海风,看看海鸟,坐在海边,听海浪的低吟,在海滩沐浴阳光。

   当天去星海是三男三女,女孩比男孩疯狂(女孩是几个学艺术的老乡),所以说大场合能放得开的还是女孩,她们见了海如同见了珍珠项链一样脱了鞋子就噗通噗通跳进去戏水了。。。也可能是我们几个男生太拘束了吧,她们想找她们自己的乐子。沙滩很舒服,海里有人游泳,来之前没有计划下海游泳,所以没准备泳衣,看她们玩的那么开心,我们也商量下海玩玩,所以脱掉衣服也噗通噗通跳下去了。上了海滩看到旁边的几个穿着泳衣晒太阳的老外对着那几个女生笑,呵呵,她们全身湿透,任何人看到都会笑话的,怕着凉,准备打的回学校,可是连叫了几个的,看到她们这身都不载。

   第二次去星海是专门去看海的,快到冬天了,上午海上有雾,海也是灰蒙蒙的,远远的望去,就像我们那里的阴天,很沉重,风小,海也挺平静,只有小浪。雾阻碍了视线,太阳也是昏黄的。海面上有游艇,使得海还不至于太单调。为了使海更美观同时也为钓鱼的旅客提供方便,那里专门设计了一个小区域,形成半月,边缘由水泥砌成,壁上有水印,看来这里也涨潮的。爬到栏杆外面看海水,很干净,清澈见底,能看到水底石头与石头缝里的一群群小鱼。奇怪海水里容纳了这么多盐这么多Mg、Ca等元素,怎么会这么清澈,所以又爬到下面去伸手摸了一把,吓得小鱼都逃了,添了下手指,~~~~(>_<)~~~~ 、,什么味道说不出,不是咸,是又苦又涩,搞不懂这么清澈的液体里面藏了多少东西。望着干净,其实“暗藏杀机”,呵呵,不要为外像所迷惑。
去过海之韵,那里的海才是海,来大连看海,那里不能错过,海边有礁石,由海浪不停的冲洗着,但礁石看起来还是那么脏,海的特色吧,礁石缝里能找到死了很久的海生物的贝壳,由于是死了很久的,所以贝壳不漂亮,也不坚硬。那时候才知道,那些去海边玩带回去的贝壳说是在海边拣的都是骗人的,真正的贝壳要到深海或者无人海中小岛才能得到。在海里游泳次数比较少。去过星海海滩和星海浴场,也去过夏家河子。但真正的浴场水都很脏,而不是浴场的海滩下面海水才比较干净。

   马上就要离开大连了,大连的美景还没有机会去看去玩,在这个不准备长待的公司里却看到了心旷的美景,望着窗外,海陆的分界弯弯曲曲的延伸着,远处是一个码头,起着褶皱的海洋很平静,安稳的承载着浮在上面的轮船。有个游玩港口,游艇孩子般在上面戏闹着。晚上太阳落山的时候,红云染红了海,环顾下海,大连是不是那颗搏动的心。
   亲爱的同学们,大连这块土地需要你们去浇灌。我将在明年五月份再回来看看她。
   21:56 2008-12-24

posted @ 2008-12-24 22:14 唐金虎 阅读(200) | 评论 (0)编辑 收藏

python脚本语言

为什么在游戏中使用脚本
    在早期的一些游戏中,大部分的游戏逻辑都直接写入游戏代码,例如计算公式、游戏流程等。但随着游戏产业的不断发展,游戏开发本身也变得越来越复杂,游戏企划需要更多的时间来对游戏进行调整,如果游戏逻辑还写在代码中,则企划对游戏的每次修改都要通过程序进行,而且还需要重新编译以及重启程序,这样工作效率就大大降低了。
    在游戏中使用脚本,就正好能解决上述问题,小到一些计算公式,大到游戏的控制流程都可以通过脚本完成,而且目前的脚本系统大多是解释执行的,因此都可以支持运行时动态修改,这样一来可以立即看到修改结果,非常方便。
 如何使用脚本
    在游戏中使用脚本主要有两种方式。一种方式是主程序使用一门高级语言,比如C++进行编写,然后对其嵌入一个脚本解释器,在运行时动态执行一些脚本函数;另一种方式则是整个程序全部使用脚本编写,例如一些泥巴游戏就是直接用LPC脚本编写的。
    本文主要研究嵌入式脚本使用方法,因为目前大部分的脚本都不能提供如VC++那样方便的调试环境,如果程序全部用脚本编写,当脚本多达几万行甚至十几万行的时候,调试会成为一件非常痛苦的事。而且嵌入式使用时可以将一些非常耗时的代码用C++编写,以保持较好的运行效率。
    程序从C++的main( )函数开始启动,然后进入主循环,在一些C++函数中会直接调用脚本函数,在脚本函数的运行过程中,又可能调用C++的扩展函数。C++扩展函数的主要功能有两个:一是用来增加脚本无法直接编写的功能,二是用来替换脚本中运行速度过慢的函数。
    上述过程的关键点就在于C++和脚本如何相互调用函数,以及如何传递参数与结果。一般的解决方法是在程序启动时利用脚本的API向脚本注册C++的扩展函数,将函数指针传递给脚本系统以便将来调用,调用脚本函数则使用脚本系统的API将调用参数压进栈,取得运行结果也要通过API进行。
 Python 脚本简介
    目前有许多第三方脚本语言可供直接使用,例如Tcl、Lua等等,本文要介绍的是Python脚本。Python已经有超过十年的历史,是一种解释性的、面向对象的脚本语言。Python的解释器在大部分的操作系统上都可以运行,如Windows、Linux、Solaris、Mac 等。
1. 安装与配置
    Python的主页在http://www.python.org,目前最新版是2.3.2,本文采用2.2.2,你可以在其主页上下载安装包http://www.python.org/ftp/python/2.2.2/Python-2.2.2.exe。运行安装程序后,它会将Python解释器、文档、扩展模块等安装到你的计算机上。
    安装完成后在开始菜单中会有Python的图形化编辑器(IDLE,但目前版本不支持中文字符),Python的命令行解释器以及用户手册。
    为了在C++程序中调用Python的API函数,需要将头文件与lib路径添加到VC++的搜索目录中,头文件路径是本地Python安装目录下的include目录,lib路径是本地Python安装目录下的libs目录。这里需要注意的是安装包只提供了release版本的lib与dll,如果需要调试运行,则必须自己下载Python的源代码以编译debug版本的lib与dll,源码可在这里下载http://www.python.org/ftp/python/2.2.2/Python-2.2.2.tgz
2. 语法简介
    详细的语法说明请参考Python安装包自带的文档,这里我只介绍一些常用的关键字与注意事项。
  Python没有C++中的 { 和 } ,它使用缩进来代替。变量不需要单独声明,但不能引用未经赋值的变量。
  Python中引入了模块的概念,类似C++中Library的概念。模块可以包含函数、变量、类。一个脚本文件就是一个模块,模块在使用前需要导入。
  Python中没有switch,使用if判断代替:
if ( num==1 ):
    print "1"
elif ( num==2 ):
    print "2"
else:
    print "unknown"
  while 是Python的一个循环语句。在while循环内可以使用continue跳到下个循环,使用break可以跳出整个循环:
cnt = 5
while ( cnt > 0 ):
    print cnt
    cnt -= 1
  for 循环:
list = ["test1", "test2", "test3"]
for str in list:
    print str
  词典是Python的一种映射数据类型,它能从一个键值(key)映射到实际内容(value):
accounts = {'tom':'123456', 'mike':'654321'}
print accounts['tom']
print accounts['mike']
3.API 介绍
    Python提供了大量的C API,C++与Python的交互都是通过这些API进行。下面介绍几个比较重要的API函数:
  void Py_Initialize( )
在使用Python系统前,必须使用Py_Initialize对其进行初始化。它会载入Python的内建模块并添加系统路径到模块搜索路径中。这个函数没有返回值,检查系统是否初始化成功需要使用Py_IsInitialized。
  int PyRun_SimpleString(char *command)
把输入的字符串作为Python代码直接运行,返回0表示成功,-1表示有错。大多时候错误都是因为字符串中有语法错误。
  PyObject* Py_BuildValue(char *format, ...)
把C++的变量转换成一个Python对象。当需要从C++传递变量到Python时,就会使用这个函数。此函数有点类似C的printf,但格式不同。常用的格式有s表示字符串,i表示整型变量,f表示浮点数,O表示一个Python对象。
  PyObject* PyObject_CallObject(PyObject*callable_object, PyObject *args)
调用一个callable_object指向的Python函数,args为调用参数。在使用此函数前可以用PyCallable_Check来检测callable_object是否为一个可被调用的Python对象。
  PyObject* PyImport_Import(PyObject *name)
载入一个n a m e 指定的模块。可以先使用PyString_FromString将模块名转换为Python对象,再使用PyImport_Import载入。
  void Py_Finalize()
关闭Python系统,一般在程序退出时调用此函数。


【小知识】
更多Python 简介
Python 使用一种优雅的程序设计语法,它非常接近自然语言,这使得它具有很好的可读性。
Python 是一种灵活的程序设计语言,程序易于运行。这使得它成为进行原型开发和特殊程序设计任务的理想化语言;用P y t h o n 做程序设计,你甚至可以不太考虑你的程序的可维护性很差。
Python 是支持类和多继承的面向对象程序设计。
Python 代码可以被打包为模板和包。
Python 支持异常处理追踪并能够列出比较清晰、详细的错误提示。
Python 包含了一些高级的程序设计特性,例如代码生成器和解释器。自动垃圾收集功能使你从内存管理的争战中解脱出来。
Python 庞大的标准库支持很多一般的程序设计任务,如与网络服务器连接,正则表达式,文件操作。
Python 的交互式模式使得调试小段的程序非常便捷;另外,处理大型程序时,它还具备一个捆绑式的开发环境—— IDLE。
Python 编译器很容易扩展,可以将C 或者C++ 编译后的模板作为新的模板加入到其中。
Python 编译器可以被嵌入到另外一个应用程序中以提供一个可编程的界面。
Python 可以在很多不同种类的计算机和操作系统上运行:比如Windows,Mac OS,OS/2,Unix,Linux 等。
Python 语言的编译器是开源项目,拥有版权但可以免费使用和免费发布,甚至可以应用在商业项目中。

 

在C++中使用python最简单的方式就是高级应用
在使用时要初始化python语言的解释器
Py_Initialize();
在使用完成时要中止python的语言解释器
Py_Finalize();
这种应用最简单的就是直接执行一断脚本
  PyRun_SimpleString("import sys\n"
                     "print 100+200\n");
这就是最简单的应用了
如果想执行一段保存在文件中的脚本那就调用
int PyRun_SimpleFile( FILE* fp , const char* filename)
这种方式的调用是最简单的一种调用了。


函数调用终于可以返回值了前几天的BCB调用Python,没有直接在C++里面调用Python函数,只是简单的使用了PyRun_SimpleString()这个函数进行指定字符串的执行。这种调用,对于没有输出结果,或者是输出结果在文件之类时还是可以使用的,但是通常情况下,我们调用函数是需要返回一个结果给被调用者的。针对这种情况,使用解释字串方式可行性不大了(可以实现,使用输出流重定向,但是处理起来复杂),只能是调用函数,然后接受函数的返回值。

这种调用也是比较简单的(因为我只要求返回字串就可以了:)),首先使用PyImport_ImportModule初始化你要调用的模块(一般指文件名),然后使用PyObject_CallMethod调用你的Python函数,当然了,调用函数的参数是需要设置的。

参考代码:
-----------------------------------
    AnsiString ScriptPath = ExtractFilePath(Application->ExeName)+"script";
    AnsiString PyStr;
    PyObject *pName, *pOs, *pArg, *pResult, *pCall;

    Py_Initialize();
    InitLogger();

    pOs = PyImport_ImportModule("os.path");
    PyObject_CallMethod(pOs, "join", "(s)", ScriptPath.c_str());
   
    pCall = PyImport_ImportModule("BOMandXY");
    pResult = PyObject_CallMethod(pCall, "ReadBOM", "(s)", FileName.c_str());
    ShowMessage(PyString_AsString(pResult));

    Py_Finalize();



posted @ 2008-11-24 22:03 唐金虎 阅读(1590) | 评论 (0)编辑 收藏

http://blog.csdn.net/yanonsoftware/archive/2005/11/26/537314.aspx
 
iterator中文经常被译为“泛型指针”,在实际的使用中却需要比指针更加小心翼翼。如果没有注意到iterator失效,那么产生的错误可能比普通指针更隐蔽,当然也可能会引起一般的程序异常。iterator失效主要有两种情况:
 1、iterator变量已经变成了“悬空指针”,对它进行*,++,--都会引起程序内存操作异常;
 2、iterator所指向的变量已经不是你所以为的那个变量了。
 所以在使用iterator是必须要时刻牢记“容器的插入和删除元素”可能引起iterator失效!普遍遇到的几个问题:

 1、刚刚使用STL的很多人会为这个问题困扰:在循环遍历一个容器时,需要根据条件删除其中的某个元素,如何处理iterator?答案是:对于序列式容器标准写法是这样:

 //vector<int> con;
 for(vector<int>::iterator iter=con.begin();
  iter
!=con.end();)
 
{
  
if((*iter) == 99)
   iter
=con.erase(iter);
  
else
   
++iter;
 }


 对于关联容器是这样:

 //map<int,int> con;
 for(map<int,int>::iterator iter=con.begin();
  iter
!=con.end();)
 
{
  
if(iter->second == 99)
   con.erase(iter
++);
  
else
   
++iter;
 }


 2、使用一个iterator变量时往往是危机重重,我在刚开始使用STL的时候,就范了一个较难测试出来的错误,类似这样:
 

int DoSomething(vector<int>& con)
 
{
  vector
<int>::iterator iter = find(con.begin(),con.end(),99);

   
//做了一些insert操作

  
return *iter;//如果vector的内存没有重新分配,那//么*操作会成功,但是已经不保证是99了!
 }


 
 3、下面这个错误则要更隐蔽一些、在大一些的类库中更难以控制:
 有一个界面系统,一个window类,用来封装自身的操作、绘图功能,并管理它的所有子窗口:

class Window
 
{
  Window
*  m_pParent;
  list
<Window*> m_children;
 
public:
  
void RemoveChild(Window *pChild)
  
{
   m_children.remove(pChild);
  }

  
virtual void Update()
  
{
   
for(list<Window*>::iter=m_children.begin();
    iter
=m_children.end();++iter)
   
{
    (
*iter)->Update();
   }
//endof for
  }

 }
;
 

 
 这个Window::Update()函数负责处理窗口逻辑,结果在某个窗口的Update写成了这样:

class MyDlg : public Window
 
{
 
public:
  
virtual void Update()
  
{
   
if(m_bClosed)
    m_pParent
->RemoveChild(this);
   
else
    Window::Update();
  }

 }
;

 
 当一个模块的逻辑比上述例子复杂很多时,这种情况更难以掌握,为了防止模块客户的代码产生类似的行为,我不得不把代码写成这样:

class Window
 
{
  Window
*  m_pParent;
  list
<Window*> m_children;
  
bool  m_bLock;
 
public:
  
void RemoveChild(Window *pChild)
  
{
   ASSERT(
!m_bLock);
   m_children.remove(pChild);
  }

  
virtual void Update()
  
{
   m_bLock
=true;
   
for(list<Window*>::iter=m_children.begin();
    iter
=m_children.end();++iter)
   
{
    (
*iter)->Update();
   }
//endof for
   m_bLock=false;
  }

 }
;

 
参考资料:
 《C++标准程序库》,候捷、孟岩译,2002

posted @ 2008-11-23 21:23 唐金虎 阅读(541) | 评论 (0)编辑 收藏

今天去了中关村来连的招聘会现场。

发现去的公司只有网上公布的三分之一不到,心目中的几个公司一个没有(现在我都把公司当成了心仪的女孩了,总希望用自己的实力俘获一个女孩的芳心,却总是让那残酷的现实一点一点地蚕食自己那少的可怜的自尊心)。
人很多,排队的人比平时在食堂打饭的人多多了,我就是不喜欢等,也就不愿意排队,让他们都投完了我再去投吧。然后听同学说有个公司,现场做笔试题,眼睛不好使,没有看见贴在那里的大字,也没有在意,我想现场怎么做题呢,到处转转后看到几个人都蹲在那里,也有几个人在指指画画,就顺着他们的手看到了贴在那里的三道。看了看,简单的思考了下,不是很难。然后看到我们学校的小朱,看他在纸上画着,然后我过去把我的思路告诉他,不知道他到底是懂了还是没懂,说一会反过来一会正过去,好麻烦,又想了会说太深了,不做了。我奇怪,这难吗?就做了起来。自从学了stl后很多编程都深受其影响,总想用其中的方法来表达我想要的要求,发现这几个题都能使用vector,但最终只在第一个题中用了,后面两个题是一个类型的,我使用了结构体,在里面重载*运算符,写了一个算法,这两个题就这样出来了。写完用了三张纸。

  看看别人两个三个一起,一边讨论一边指错,有请教有指导,想想,有同学在一起真好!!

交过去的时候,看到一个女同志,之所以叫同志,是因为她是负责招聘工作里面的一员。看她批改,那叫神速,只在网上看到有关于HR筛选简历很快的传说,今天我终于见证了。但这比筛选简历还是快多了,基本上是3秒钟判一道题,对的划勾,错的打叉,我想这是什么人,反应那么快,直接就把算法给判了,不到十秒钟就枪毙一个人,狠!!!由于答案都写在简历的后面,我站在那里看了一会儿,发现很多答案都几乎是一个模子里出来的,大同小异。基本上都只是一张纸解决了三道题,我却用了三张纸,牛逼!!等她“处决”我的时候,上下找了找,就找关键语句,如果关键语句与跟标准答案一样就对,完全不在乎你用什么方法,我郁闷,我费尽心思的用stl表现一下,却被忽视了。。。第二个先划钩,然后又带了个小杠就是半对,第三个扫了一眼直接叉,我晕。旁边有人问她为什么他的题不对,她说这里不讨论题,我看到我的结果后,我说我是用结构体做的,她说不用结构体。我想这题我可以用三种方法实现,但我用了最复杂的方式,不值。我又在那里看了会儿,想看看他们的答案,她在判的时候我就在看,我看了几个都不合要求,但她也划了对号,等她判完了送过来的答案后,我问她,你那上面不是要求不能用字符串做吗?她说是,然后拿过一张刚判过的看了看,又重新划叉,我想,我这不是推人家下水吗?人家辛辛苦苦做题,为的不是跟我一样想得到面试机会吗?结果让她给人判了死刑.然后她喊刚才那份简历上的人名,让她回去不用字符用别的方法做出来。
然后我看了看公司的简介,团队有160多人,以清华北大毕业生为核心,我想这个判官就是北大的吧!
20:27 2008-11-16

posted @ 2008-11-16 20:44 唐金虎 阅读(262) | 评论 (0)编辑 收藏
仅列出标题