DELPHI基础:DELPHI指针使用的心得计算机二级考试

文章作者 100test 发表时间 2009:04:09 22:58:25
来源 100Test.Com百考试题网


  开发游戏也有一段时间了,发现使用DELPHI来开发网络游戏不了解DELPHI下指针的使用是完全不行的。所以今天我简单总结以下我使用DELPHI指针的心得。希望对大家有所帮助。
  记得在大学学习C语言的时候在谭浩强编写的书中,关于指针一章的开始就说“指针是C语言的精华”,可见指针对于C语言的重要性。其实在Pascal语言中指针也占据着重要的位置。
  1:指针的赋值。
  type
  RTestInfo = record
  Age:Integer.
  end.
  PtestInfo = ^ RtestInfo.
  var
  Test1,Test2:PtestInfo.
  Begin
  New(Test1).
  New(Test2).
  Test1^.Age:=12.
  Test2:=Test1.
  Application.MessageBox(Pchar(IntToStr(Test2^.Age)),’测试’,MB_OK).
  Test1^.Age:=13.
  Application.MessageBox(Pchar(IntToStr(Test2^.Age)),’测试’,MB_OK).
  DisPose(Test1).
  DisPose(Test2).
  End.
  上面的代码中使用了Test2:=Test1.进行指针的赋值,也就是说进行赋值以后两个变量指向的相同的地址,所以当Test1的Age发送变化以后 Test2的Age也随之发生了变化。反过来也是一样。那如果我们要将Test1中的内容放在Test2中并且当Test1中的内容发生变化的时候 Test2的内容不会发生变化有如何来做呢?其实很简单,使用Test2^:=Test1^;就可以了,这个时候变量Test1和变量Test2指向的是两个不同的地址,当一方的内容发生变化的时候另外一方不会受到影响。
  2:数组和指针的转换。
  曾使用过API函数来编写网络通信的都知道,网络传输过程中传输的都是char类型的数组。而我们经常需要将自己定义的一个结构通过网络传输出去,并且当对方接收到这个数据以后又能将其转换为相应的结构来处理。以前我是使用添加标记位来解决这个问题。其实使用数组和指针转换是很简单的。
  type
  RtestInfo = record
  Age:Integer.
  End.
  Var
  Test: RtestInfo.
  Data:array[0..1024] of Char.
  Begin
  Test.Age:=13.
  Fillchar(Data,SizeOf(Data),#0).
  StrMove(Data,@ Test,sizeof(Test)).
  //数据发送
  End.
  在上面的例子中首先我们将我们定义数组Data清空,然后使用函数StrMove将结构Test的内容复制到Data中去。这个时候就可以将数据发送出去。当对方接受到数据以后,可以用以下的代码进行还原。
  type
  RtestInfo = record
  Age:Integer.
  End.
  Var
  Test: RtestInfo.
  Begin
  StrMove(@Test,Data,sizeof(Test)).
  //处理数据
  End.
  这个时候就可以对发送过来的数据进行相应的处理了。
  3:函数指针的使用。
  在分模块开发的过程中,DLL占据着重要的位置。在我开发游戏的服务端也是使用DLL的方式。在开发的时候遇见这样的一个问题,例如我在一个EXE中编写了一个功能非常复杂的函数,在DLL中我想使用到它,如何做呢?其实使用函数的指针就可以很方便的实现。
  我们知道DLL的运行空间是和调用它的EXE在一起的。也就是说在这个空间中的资源理论上DLL是都可以使用。所以只要将exe中的函数指针传给DLL,那么DLL就可以使用这个函数了。
  例如在DLL中有函数ModuleSendData作用是让EXE中传入函数的指针链表,这个链表中的函数都是DLL中可能用到的。
  SendDataFun: procedure(Casetype: Byte. UserSocket: RUserSocket. Data: array of char. DataLen: Integer).
  function ModuleSendData(FunPList: TList): Boolean. stdcall. export.
  begin
  SendDataFun := FunPList.Items[0].
  end.
  在EXE中的代码是:
  Linstance:=LoadLibrary(Pchar(Temp)).
  if Linstance>.0 then
  begin
  //将发送数据的指针传入DLL插件中
  @GiveModuleFun:=GetProcAddress(Linstance,’ModuleSendData’).
  if @GiveModuleFun<.>.NIl then
  begin
  m_FunList:=TList.Create.
  //发送数据
  t_Pointer:=@DllSendData.
  m_FunList.Add(t_Pointer).
  GiveModuleFun(m_FunList).
  End.
  End.
  其中DllSendData就是我们想传入给DLL的函数。
  这个时候在DLL中使用SendDataFun就和一般的函数一样了。
  这里注意的一点是Exe中的函数DllSendData我定义的是一个全局函数。原因是这样取得函数的指针的时候比较简单。
  2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛
  2009年上半年全国计算机等级考试报名信息汇总
  2009年NCRE考试有新变化
  2009年全国计算机等级考试-大纲
  2009年上半年全国计算机二级考试试题及答案
  2009年上半年全国计算机等级考试试题答案汇总

相关文章


计算机二级DELPHI基础:DELPHI菜单模板计算机二级考试
二级DELPHI基础:菜单图像与ImageList组件计算机二级考试
计算机二级DELPHI基础:DELPHI创建子窗体计算机二级考试
DELPHI基础:DELPHI设置断点的方法计算机二级考试
DELPHI基础:DELPHI指针使用的心得计算机二级考试
DELPHI基础:DELPHI中的INI文件编程计算机二级考试
DELPHI基础:COM中的复合文档的结构化的存储计算机二级考试
计算机二级DELPHI基础:Tcanvas类的主要属性计算机二级考试
计算机二级DELPHI基础:TCanvas类的方法计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛