| << | 2008年12月 | >> | ||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- C++编译成DLL类库后,用C#调用时,double[]怎么样变成double*(指针)了?
- 用C++.NET写的DLL类库,在用C#调用的时候 函数参数用数组时老出问题是怎么回事?
- 如果这都可以了C++干脆就不要什么面向对象了
- 使用下void*做参数和返回值,都不能编译成功. 不知道怎么使用。 楼主是否可以介绍一下Lua userdata的传送方法. 能给出一个简单例子最好了 谢谢
- ok , 我修改 LuaWrap.h 为如下代码就可以支持Lua 5.1.1 ================================= lua_dofile 替换成 luaL_dofile LoadBuffer()函数替换成 bool LoadBuffer(const char* buffer, size_t size) { #ifdef __LUA4 return lua_dobuffer(m_pluaVM, buffer, size, "LuaWrap") == 0; #else return (luaL_loadbuffer(m_pluaVM, buffer, size, "LuaWrap") || lua_pcall(m_pluaVM, 0, LUA_MULTRET, 0)) == 0; #endif }
- 这个封装库我在lua5.1.1上不能正常使用. 我已经把 lua_baselibopen(m_pluaVM); lua_tablibopen(m_pluaVM); lua_iolibopen(m_pluaVM); lua_strlibopen(m_pluaVM); lua_mathlibopen(m_pluaVM); lua_dblibopen(m_pluaVM); 替换成 luaopen_base(m_pluaVM); luaopen_table(m_pluaVM); //luaopen_io(m_pluaVM); luaopen_string(m_pluaVM); luaopen_math(m_pluaVM); 还有 lua_dofile 替换成luaL_loadfile lua_dobuffer 替换成luaL_loadbuffer 发现其他功能都正常,就是 LoadFile()加载的脚本不起作用,比如add()用lua.Call()调用可以在脚本中用add()调用就没有作用.而且用LoadString()也是一样. 不知道如何修改,请指点~ 谢谢.
C语言的指针相当的灵活方便,但也相当容易出错。许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下。但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序。 然而C++的指针却常常给我一种束手束脚的感觉。C++比C语言有更严格的静态类型,更加强调类型安全,强调编译时检查。因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换。而且这些指针的声明格式都不一样: 数据指针 T * 成员数据指针 T::* 函数指针 R (*)(...) 成员函数指针 R (T::*)(...) 尽管C++中仍然有万能指针void*,但它却属于被批斗的对象,而且再也不能“万能”了。它不能转换成成员指针。 这样一来,C++的指针就变得很尴尬:我们需要一种指针能够指向同一类型的数据,不管这个数据是普通数据,还是成员数据;我们更需要一种指针能够指向同一类型的函数,不管这个函数是静态函数,还是成员函数。但是没有,至少从现在的C++标准中,还没有看到。 沐枫网志 C++指针探讨(三)成员函数指针 自从有了
转向.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/,对于常用的函数甚至有完整的应用例子和帮助。当然,如果你有相
C语言的指针相当的灵活方便,但也相当容易出错。许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下。但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序。 然而C++的指针却常常给我一种束手束脚的感觉。C++比C语言更加强调强类型,强调类型安全,强调编译时检查。因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换。而且这些指针的声明格式都不一样: 数据指针 T * 成员数据指针 T::* 函数指针 R (*)(...) 成员函数指针 R (T::*)(...) 尽管C++中仍然有万能指针void*,但它却属于被批斗的对象,而且再也不能“万能”了。它不能转换成成员指针。 这样一来,C++的指针就变得很尴尬:我们需要一种指针能够指向同一类型的数据,不管这个数据是普通数据,还是成员数据;我们更需要一种指针能够指向同一类型的函数,不管这个函数是静态函数,还是成员函数。但是没有,至少从现在的C++标准中,还没有看到。 沐枫网志 C++指针探讨(三)成员函数指针 自从有了类,我们
程序文档,曾经是程序员的一个头痛问题。写一个程序文档,比较花时间,但不是很难;麻烦的是当程序修改后,程序文档也要跟着同步更新,否则文档和程序就要脱节,文档也就变成没用的东西了。
好在有许多好用的文档生成器来解决这个问题。目前比较流行的C++文档生成器是doxygen。
本文就简单的介绍一下doxygen的文档注释方法,以供初学者参考
全文请见:http://ly4cn.cnblogs.com/archive/2005/11/23/282637.html
.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
去年我作了一个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脚
.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
老妈最近被人骗了好多钱,还好人没事。算是破财消灾吧。只是心里极其郁闷。上网查了一下,发现不只是郁闷了,还多了许多恐惧。现在社会治安状态实在很不好,就转贴出来,和大家一起小心再小心吧。钱没了还好,要是生命受到危协那可了不得啊。 出门在外护身常识(必读)转自 (骗术研究网 http://www.psyjw.com ) 【案例导读】 这如今的治安状况着实让人感到恐慌和惶恐,只能是各人提高警惕,保护自己……【案例正文】 昨天,我们一个代理人来领票时告诉我们,她们单位一位司机的老婆在宝安桃源居等车时,一辆面包车突然停在她面前,把她连人带包一起拉进车内,抢了她包内所有值钱的东西,看见建行卡,就逼问密码,她当时吓懵了第一次说错了,歹徒当时就打电话银行查询,发现密码不正确就捅了她手臂一刀,直到问出正确的密码才把她推下车.所以大家如果在路上等车时,不要离马路太近,看到陌生的面包车或面的靠近自己更是要防范.尤其是带包的女士.要特别关注的事项现在有一些情况很容易让你中招,男女一对背着一个包袱,打扮得像刚从内地来,找不到工作的样子。一般情况是问你,什么地方在那里,这时你最好是赶紧躲开,不然他们有以下方式让你
最近在使用Visual Studio 2003生成C#的程序注释文档时,发现生成的HTML文档不能够正常使用。
大惑不解之下,请教了一位同事,经这位同事多方试验之下,突然发现,原来VS在生成HTML文件时,在文件末尾多加了 0x00 字符引起的。
VS生成的HTML是UNICODE格式的文件,可能是VS的BUG吧,生成的HTML文件末尾均被加上一个单字节的 0x00,造成了IE无法完成HTML文档的解析。唯一的解决方法是:为每一个HTML文件,在末尾去掉一个字节或再加上一个字节 0x00。
我这个经历,希望能给有同样经历的朋友再来帮助。
不过手工一个一个修改文件实在不是一件愉快的事。
在C/C++中,数据指针是最直接,也最常用的,因此,理解起来也比较容易。而函数指针,作为运行时动态调用(比如回调函数 CallBack Function)是一种常见的,而且是很好用的手段,不能不好好认识一番。 接下来,我们就讨论一下函数指针。 2 常规函数指针(难度: 3) void(*fp)(); fp 是一个典型的函数指针,用于指向无参数,无返回值的函数。 void(*fp2)(int); fp2 也是一个函数指针,用于指向有一个整型参数,无返回值的函数。 当然,有经验人士一般都会建议使用typedef来定义函数指针的类型,如: typedef void(* FP)(); FP fp3; // 和上面的fp一样的定义。 函数指针之所以让初学者畏惧,最主要的原因是它的括号太多了;某些用途的函数
指针,在C/C++语言中一直是很受宠的;几乎找不到一个不使用指针的C/C++应用。用于存储数据和程序的地址,这是指针的基本功能。用于指向整型数,用整数指针(int*);指向浮点数用浮点数指针(float*);指向结构,用对应的结构指针(struct xxx *);指向任意地址,用无类型指针(void*)。 有时候,我们需要一些通用的指针。在C语言当中,(void*) 可以代表一切;但是在C++中,我们还有一些比较特殊的指针,无法用(void*)来表示。事实上,在C++中,想找到一个通用的指针,特别是通用的函数指针可是一个“不可能任务”。 C++是一种强类型的语言,C++的编译器的功能是强大的,它的其中一个设计目标,是尽力为程序找出程序中可能存在的问题;因此,C++对类型的匹配是非常严格的。在C语言中,你可以用void*来指向一切;但在C++中,void*并不能指向一切,就算能,也没有意义,因为它不能帮你发现问题,比如,用函数指针赋值给一个数据指针。 下面我们来探讨一下,C++中如何存储各种类型的指针。 1. 数据指针 &nbs
.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"
.NET Framework1.0和1.1 都没有实现OleContainer组件。查遍MSDN,最后得了一个提示:可以使用IEBrowser来模拟OleContainer。这绝对是一个超重的实现,不过,最目前情况下,却是一个最省事的方法。本文就简单的说明一下,如何使用IEBrowser控件来嵌入Excel表格。 1. 首先,需要在工具栏中导入“Microsoft WEB 浏览器”。可以在工具栏上点右键,选择“添加/移除项”。然后在出现的自定义工具箱中选择“COM组件”,最后在组件中找到“Microsoft Web 浏览器”,勾选并确定。见下图:
.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)名称
关于 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
扫雷 - 冲破火网 Ver 1.02
游戏目的
指挥下方的小兵,通过雷区,到达上方的目标地点。
游戏规则
在不触发地雷的情况下到达目标地点,并尽可能多的展开地图。
提示
一定有一条没有地雷的路,可以到达目标。
“重新来过”以及“读取存档”将使你的纪录不能上榜。
附件1: 游戏
附件[lyMine.rar]
附件2:源代码 (Delphi 7.0)
附件[lyMine_src.rar]
在这篇文章中,我想向大家介绍如何进行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中,写一个这样的程序
使用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
.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
[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字







