注册
沐枫的专栏

手机访问: ly4cn.teeta.net

我的程序人生

档案文件

头像

沐枫

TT号:1019364

帅哥 正式会员 离线

来自:福建 - 福州

日历
<<2008年12月>>
123456
78910111213
14151617181920
21222324252627
28293031
最新评论
日志列表

  C语言的指针相当的灵活方便,但也相当容易出错。许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下。但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序。  然而C++的指针却常常给我一种束手束脚的感觉。C++比C语言有更严格的静态类型,更加强调类型安全,强调编译时检查。因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换。而且这些指针的声明格式都不一样: 数据指针 T * 成员数据指针 T::* 函数指针 R (*)(...) 成员函数指针 R (T::*)(...)  尽管C++中仍然有万能指针void*,但它却属于被批斗的对象,而且再也不能“万能”了。它不能转换成成员指针。   这样一来,C++的指针就变得很尴尬:我们需要一种指针能够指向同一类型的数据,不管这个数据是普通数据,还是成员数据;我们更需要一种指针能够指向同一类型的函数,不管这个函数是静态函数,还是成员函数。但是没有,至少从现在的C++标准中,还没有看到。 沐枫网志 C++指针探讨(三)成员函数指针  自从有了

2006-04-12 23:58

|

阅读全文(798)

|

评论(0)

  转向.NET后,手头上往往仍有旧的模块要重用。也许这些模块是Delphi写的,也许是C/C++写的,或者是其它编程语言……为了能把它们移植到.NET下,或者是在.NET中调用,To be or not to be, that is a question。  在这里,我笔记了几个在工作中遇到的几个场景。不过,这里不包括完全使用C#来重写原来用C++编写的程序这种变态的需求。当你被要求做这种事的时候,请三思而后行……这简直是种非人的折磨。您也使用托管C++吗?  如沐枫林  场景一:在.NET中调用WindowsAPI或DLL。  这是比较普遍的需求。一般来说,简单的函数调用,大可直接用C#/VB.NET,经过DllImport属性包装出函数来调用。如: [DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",  SetLastError=true,CharSet=CharSet.Unicode, ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]public static extern bool MoveFile(String src, String dst);   由于WindowsAPI用到的人实在是多,因此有一个专门的wiki站点,收集这方面的资料:http://www.pinvoke.net/,对于常用的函数甚至有完整的应用例子和帮助。当然,如果你有相

2006-04-12 23:53

|

阅读全文(2250)

|

评论(2)

  C语言的指针相当的灵活方便,但也相当容易出错。许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下。但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序。  然而C++的指针却常常给我一种束手束脚的感觉。C++比C语言更加强调强类型,强调类型安全,强调编译时检查。因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换。而且这些指针的声明格式都不一样: 数据指针 T * 成员数据指针 T::* 函数指针 R (*)(...) 成员函数指针 R (T::*)(...)  尽管C++中仍然有万能指针void*,但它却属于被批斗的对象,而且再也不能“万能”了。它不能转换成成员指针。   这样一来,C++的指针就变得很尴尬:我们需要一种指针能够指向同一类型的数据,不管这个数据是普通数据,还是成员数据;我们更需要一种指针能够指向同一类型的函数,不管这个函数是静态函数,还是成员函数。但是没有,至少从现在的C++标准中,还没有看到。 沐枫网志 C++指针探讨(三)成员函数指针  自从有了类,我们

2006-03-14 10:50

|

阅读全文(902)

|

评论(1)

 程序文档,曾经是程序员的一个头痛问题。写一个程序文档,比较花时间,但不是很难;麻烦的是当程序修改后,程序文档也要跟着同步更新,否则文档和程序就要脱节,文档也就变成没用的东西了。

好在有许多好用的文档生成器来解决这个问题。目前比较流行的C++文档生成器是doxygen。
本文就简单的介绍一下doxygen的文档注释方法,以供初学者参考

全文请见:http://ly4cn.cnblogs.com/archive/2005/11/23/282637.html

2005-11-23 13:58

|

阅读全文(1145)

|

评论(0)

        .NET 本身提供了强大的脚本引擎,可以直接使用.NET CLR的任何编程语言作为脚本语言,如VB.NET、C#、JScript, J#等等。使用脚本引擎,我们可以动态生成任意表达式、或动态导入任意脚本文件,并在任意时候执行。         经实践发现,我们可以使用至少两种不同的方式在.NET中使用脚本引擎:VsaEngine和CodeDom。         其实,CodeDom不能算是真正的脚本引擎,它实际上是编译器。但是我们完全可以利用CodeDom来模拟脚本引擎。         使用Emit方法也能达到动态生成可执行代码的目的,而且Emit生成的代码不需要编译,因此速度更快。但是Emit插入的实际上是汇编代码,不能算是脚本语言。         本文介绍如何以CodeDom方式来动态生成可执行代码。 (Teeta无法发布完整的文章,有兴趣查看整篇文章,请到:http://ly4cn.cnblogs.com/archive/2005/11/03/267989.html)     1.     构造一个编译器 设置编译参数 编译参数需要在CompilerPara

2005-11-03 22:56

|

阅读全文(2655)

|

评论(0)

去年我作了一个Lua脚本的C++包装,有许多朋友感兴趣,并尝试使用,我感到受宠若惊。事实上,我作的包装,学习的目的比较强,它还是有许多缺陷的。为了让朋友们少走弯路,我推荐使用LuaPlus作为C++的包装。 LuaPlus是Lua的C++增强,也就是说,LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作,是比较好的一个选择。LuaPlus目前版本为:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28, 2004)。大家可以到http://luaplus.org/ 站点下载:源码   (http://wwhiz.com/LuaPlus/LuaPlus50_Build1081.zip)目标码 (http://wwhiz.com/LuaPlus/LuaPlus50_Build1081_Win32Binaries.zip) 我将在下面说明,如何使用LuaPlus,以及如何更方便的让LuaPlus与C++的类合作无间。 1. 调用Lua脚本     // 创建Lua解释器:    LuaStateOwner state;         // 执行Lua脚本:    state->DoString("print('Hello World\n')");    // 载入Lua脚本文件并执行:    state->DoFile("C:\\test.lua");    // 载入编译后的Lua脚

2005-09-06 14:24

|

阅读全文(4648)

|

评论(1)

.NET 提供的反射(Reflection)机制可以很方便的加载插件。本文提供一种方法,可以灵活的正确的载入所需的插件。 在.NET中,一个完整的类型名称的格式如 "类型名, 程序集名"。 例如:"System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"。 类型名为:System.Configuration.NameValueSectionHandler,这是带名字空间的完整类型名。你也可以使用该类型的FullName得到。如:string typeName = typeof(NameValueSectionHandler).FullName; 程序集名为:"System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",程序集名为System,系统为自动为其适配扩展名(如System.dll或System.exe);Version、Culture、PublicKeyToken为程序集的具体版本、文化背景、签名,没有特定要求,这些都可以省略。 我们可以根据类型的名称,来动态载入一个所需要的类型。如: string typeName = "System.Configuration.NameValueSectionHandler, System";Type t = Type.GetType(typeName);Object obj = Activator.CreateInstance(t);或System.Configuration.NameValueSectionHandler ob

2005-08-21 11:48

|

阅读全文(617)

|

评论(0)

老妈最近被人骗了好多钱,还好人没事。算是破财消灾吧。只是心里极其郁闷。上网查了一下,发现不只是郁闷了,还多了许多恐惧。现在社会治安状态实在很不好,就转贴出来,和大家一起小心再小心吧。钱没了还好,要是生命受到危协那可了不得啊。 出门在外护身常识(必读)转自 (骗术研究网 http://www.psyjw.com ) 【案例导读】    这如今的治安状况着实让人感到恐慌和惶恐,只能是各人提高警惕,保护自己……【案例正文】     昨天,我们一个代理人来领票时告诉我们,她们单位一位司机的老婆在宝安桃源居等车时,一辆面包车突然停在她面前,把她连人带包一起拉进车内,抢了她包内所有值钱的东西,看见建行卡,就逼问密码,她当时吓懵了第一次说错了,歹徒当时就打电话银行查询,发现密码不正确就捅了她手臂一刀,直到问出正确的密码才把她推下车.所以大家如果在路上等车时,不要离马路太近,看到陌生的面包车或面的靠近自己更是要防范.尤其是带包的女士.要特别关注的事项现在有一些情况很容易让你中招,男女一对背着一个包袱,打扮得像刚从内地来,找不到工作的样子。一般情况是问你,什么地方在那里,这时你最好是赶紧躲开,不然他们有以下方式让你

2005-08-19 20:36

|

阅读全文(901)

|

评论(0)

最近在使用Visual Studio 2003生成C#的程序注释文档时,发现生成的HTML文档不能够正常使用。

大惑不解之下,请教了一位同事,经这位同事多方试验之下,突然发现,原来VS在生成HTML文件时,在文件末尾多加了 0x00 字符引起的。
VS生成的HTML是UNICODE格式的文件,可能是VS的BUG吧,生成的HTML文件末尾均被加上一个单字节的 0x00,造成了IE无法完成HTML文档的解析。唯一的解决方法是:为每一个HTML文件,在末尾去掉一个字节或再加上一个字节 0x00。

我这个经历,希望能给有同样经历的朋友再来帮助。
不过手工一个一个修改文件实在不是一件愉快的事。

2005-06-02 16:07

|

阅读全文(977)

|

评论(0)

    在C/C++中,数据指针是最直接,也最常用的,因此,理解起来也比较容易。而函数指针,作为运行时动态调用(比如回调函数 CallBack Function)是一种常见的,而且是很好用的手段,不能不好好认识一番。     接下来,我们就讨论一下函数指针。        2 常规函数指针(难度: 3)        void(*fp)();        fp 是一个典型的函数指针,用于指向无参数,无返回值的函数。        void(*fp2)(int);        fp2 也是一个函数指针,用于指向有一个整型参数,无返回值的函数。        当然,有经验人士一般都会建议使用typedef来定义函数指针的类型,如:        typedef void(* FP)();        FP fp3; // 和上面的fp一样的定义。        函数指针之所以让初学者畏惧,最主要的原因是它的括号太多了;某些用途的函数

2005-05-11 15:49

|

阅读全文(1032)

|

评论(1)

    指针,在C/C++语言中一直是很受宠的;几乎找不到一个不使用指针的C/C++应用。用于存储数据和程序的地址,这是指针的基本功能。用于指向整型数,用整数指针(int*);指向浮点数用浮点数指针(float*);指向结构,用对应的结构指针(struct xxx *);指向任意地址,用无类型指针(void*)。    有时候,我们需要一些通用的指针。在C语言当中,(void*) 可以代表一切;但是在C++中,我们还有一些比较特殊的指针,无法用(void*)来表示。事实上,在C++中,想找到一个通用的指针,特别是通用的函数指针可是一个“不可能任务”。        C++是一种强类型的语言,C++的编译器的功能是强大的,它的其中一个设计目标,是尽力为程序找出程序中可能存在的问题;因此,C++对类型的匹配是非常严格的。在C语言中,你可以用void*来指向一切;但在C++中,void*并不能指向一切,就算能,也没有意义,因为它不能帮你发现问题,比如,用函数指针赋值给一个数据指针。        下面我们来探讨一下,C++中如何存储各种类型的指针。        1.  数据指针  &nbs

2005-05-09 15:30

|

阅读全文(935)

|

评论(1)

    .NET的应用程序配置文件,使用的是XML格式。相对INI文件来说,它的功能要强上不少,而且具有很强的可扩展性。它的缺点是不能直接进行写操作,也就是说,不能直接在程序中修改配置文件的数据(当然不是指不能,不过不是本文讨论的范围)。本文主要目的是探讨如何扩展配置文件,并在其加入各种自定义配置信息。     3. 自定义配置结构 (使用IConfigurationSectionHandler) 假设有以下的配置信息,其在MyInfo可以重复许多次,那么应如何读取配置呢?这时就要使用自定义的配置程序了。<myConfigs>  <myInfo Area="Fuzhou" Device="Printer" Customer="Muf" />  <myInfo Area="Shanghai" Device="Mobile" Customer="Liny" /></myConfig> 访问代码如下:Hashtable cfgTable = (Hashtable)ConfigurationSettings.GetConfig( "myConfigs" ); Debug.Assert( cfgTable.Count == 2);Hashtable cfgFuzhou = (Hashtable)cfgTable["Fuzhou"];Hashtable cfgShanghai = (Hashtable)cfgTable["Shanghai"];Debug.Assert( cfgFuzhou["Device"] == "Printer" );Debug.Assert( cfgShanghai["Device"] == "Mobile"

2005-04-27 10:39

|

阅读全文(635)

|

评论(0)

.NET Framework1.0和1.1 都没有实现OleContainer组件。查遍MSDN,最后得了一个提示:可以使用IEBrowser来模拟OleContainer。这绝对是一个超重的实现,不过,最目前情况下,却是一个最省事的方法。本文就简单的说明一下,如何使用IEBrowser控件来嵌入Excel表格。     1. 首先,需要在工具栏中导入“Microsoft WEB 浏览器”。可以在工具栏上点右键,选择“添加/移除项”。然后在出现的自定义工具箱中选择“COM组件”,最后在组件中找到“Microsoft Web 浏览器”,勾选并确定。见下图:

2005-04-11 21:47

|

阅读全文(663)

|

评论(0)

    .NET的应用程序配置文件,使用的是XML格式。相对INI文件来说,它的功能要强上不少,而且具有很强的可扩展性。它的缺点是不能直接进行写操作,也就是说,不能直接在程序中修改配置文件的数据(当然不是指不能,不过不是本文讨论的范围)。本文主要目的是探讨如何扩展配置文件,并在其加入各种自定义配置信息。        1. 使用<appSettings>        简单的配置信息,可以直接放入<appSettings>标记中。如: <?xml version="1.0" encoding="utf-8"?>  <appSettings> <add key="LogFile" value="d:\log\debug.log"/>  </appSettings>  </configuration>         相应访问代码如下:        string fileName = System.Configuration.ConfigurationSettings.AppSettings.Get("LogFile");      2. 自定义配置节(section)名称      

2005-04-11 10:46

|

阅读全文(723)

|

评论(0)

    关于 int 与 byte[] 的相互转换,Mattias Sjogren 介绍了3种方法。请参见 《将Integer转换成Byte Array》。其实应该还有不少方法。在这里,我归纳了包括Mattias Sjogren在内的4种方法。 1. 最普通的方法 从byte[] 到 uint b = new byte[] {0xfe,0x5a,0x11,0xfa};u = (uint)(b[0] | b[1] > 16);b[3] = (byte)(u >> 24); 2. 使用 BitConverter (强力推荐) 从int 到byte[]byte[] b = BitConverter.GetBytes(   0xba5eba11 ); //{0x11,0xba,0x5e,0xba} 从byte[]到intuint u = BitConverter.ToUInt32(   new byte[] {0xfe, 0x5a, 0x11,    0xfa},0 ); // 0xfa115afe 3. Unsafe代码 (虽然简单,但需要更改编译选项)unsafe {// 从int 到byte[] fixed ( byte* pb = b ) // 从byte[] 到 int u = *((uint*)pb);}4. 使用Marshal类     IntPtr ptr = Marshal.AllocHGlobal(4); // 要分配非托管内存    byte[] b= new byte[4]{1,2,3,4};//从byte[] 到 int    Marshal.Copy(b, 0, ptr, 4);    int u = Marshal.ReadInt32(ptr); //从int 到byte[]&n

2005-04-06 21:47

|

阅读全文(1053)

|

评论(6)

扫雷 - 冲破火网 Ver 1.02

游戏目的
  指挥下方的小兵,通过雷区,到达上方的目标地点。
游戏规则
  在不触发地雷的情况下到达目标地点,并尽可能多的展开地图。
提示
  一定有一条没有地雷的路,可以到达目标。
  “重新来过”以及“读取存档”将使你的纪录不能上榜。

附件1: 游戏
 附件[lyMine.rar]

附件2:源代码 (Delphi 7.0)
 附件[lyMine_src.rar]

2005-04-01 14:59

|

阅读全文(681)

|

评论(1)

  在这篇文章中,我想向大家介绍如何进行Lua程序设计。我假设大家都学过至少一门编程语言,比如Basic或C,特别是C。因为Lua的最大用途是在宿主程序中作为脚本使用的。 作者: 沐枫 (第二人生成员)版权所有转载请注明原出处主页:第二人生 http://www.d2-life.com   http://www.d2-life.com/LBS/blogview.asp?logID=39  在这篇文章中,我想向大家介绍如何进行Lua程序设计。我假设大家都学过至少一门编程语言,比如Basic或C,特别是C。因为Lua的最大用途是在宿主程序中作为脚本使用的。  Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱。  在Lua中,一切都是变量,除了关键字。请记住这句话。I.  首先是注释  写一个程序,总是少不了注释的。  在Lua中,你可以使用单行注释和多行注释。  单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。相当于C++语言中的"//"。  多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于C语言中的"/*...*/"。在注释当中,"[["和"]]"是可以嵌套的。II.  Lua编程  经典的"Hello world"的程序总是被用来开始介绍一种语言。在Lua中,写一个这样的程序

2005-03-19 22:15

|

阅读全文(3393)

|

评论(0)

  使用Lua作脚本,主要是因为它小巧玲珑(体积小,运行快),而且它的语法又比较简单明了。不过,使用LuaAPI将Lua引擎集成到程序中,确实有一些不方便——用落木随风网友的话来说,就是"就象用汇编"。当然,现在你不用再这么辛苦了,因为你可以使用LuaWrapper For C++。使用这个工具,在C++中集成Lua脚本就是轻而易举的事。你原有的C++函数和类,几乎不需要任何改变,就可以与Lua脚本共享。 作者: 沐枫 (第二人生成员)版权所有转载请注明原出处主页:第二人生 http://www.d2-life.com   http://www.d2-life.com/LBS/blogview.asp?logID=41为什么要用Lua作脚本?  使用Lua作脚本,主要是因为它小巧玲珑(体积小,运行快),而且它的语法又比较简单明了。不过,使用LuaAPI将Lua引擎集成到程序中,确实有一些不方便——用落木随风网友的话来说,就是"就象用汇编"。当然,现在你不用再这么辛苦了,因为你可以使用LuaWrapper For C++。使用这个工具,在C++中集成Lua脚本就是轻而易举的事。你原有的C++函数和类,几乎不需要任何改变,就可以与Lua脚本共享。  我们接下来,用实例来说明,如何用LuaWrapper来集成Lua脚本到你的程序中去。1.  创建Lua引擎  Lu

2005-03-19 15:42

|

阅读全文(3396)

|

评论(3)

.NET的类可以用 sealed 关键字来说明一个类是最终类,也就是说不能作为基类,不能被继承。这个功能有时候很有用。但是C++没有这个关键字。那如何在C++中实现类似的功能呢?曾经在CUJ上看到一篇文章介绍过一个方法,但具体网址已经忘记了,Sorry。但是方法却记下来了。它用一个私有的虚基类来实现。我在这种方法的基础上,作了一个通用的工具类:Sealed,只要以此类为基类,那么该类就不可被继承。为了进行性能优化,在Release版本中,还将Sealed作成一个空类。Sealed类的实现如下: #ifdef _DEBUG namespace internalSealed {         class Class_Is_Sealed         {         protected:                 Class_Is_Sealed(){};         }; }; template <typename T>class Sealed: private virtual interna

2004-06-24 12:49

|

阅读全文(659)

|

评论(0)

[SMS PDU模式,数据格式和长度计算]     手机短信发送时,使用SMS PDU模式,数据格式和长度计算方法:     UDL 为UD的字节长度     如:7bit数据 "hello"         UDL = 05, UD = E8 32 9B FD 06     又如:16bit数据 "abc"         UDL = 06, UD = 00 61 00 62 00 63     CSMS 长度,为去掉SCA后的字节长度     如:00 11 00 07 81 21 43 56 F7 00 00 AA 05 E8 32 9B FD 06     其中SCA 为00,一个字节     AT+CSMS=17     又如:07 91 94 71 01 67 00 00 11 00 07 81 21 43 65 F7 00 F6 AA 05 68 65 6C 6C 6F     其中SCA 为07 91 94 71 01 67 00 00 (+491710760000),8个字节     AT+CSMS=17     数据格式有3种:     7bit,8bit,16bit。     其中7bit采用GSM字符集,8bit采用ASCII字

2004-04-08 12:50

|

阅读全文(1097)

|

评论(1)

第(1/2)页
1
2>转到第