首页 > 其他分享 >原始翎风CLIENT8位 (7) 对于@(pcm^)的理解

原始翎风CLIENT8位 (7) 对于@(pcm^)的理解

时间:2023-11-30 15:01:37浏览次数:32  
标签:CLIENT8 MagicList 翎风 body TClientMagic pcm data 指针

procedure TfrmMain.ClientGetMyMagics(body: string);
var
i: integer;
data: string;
pcm: PTClientMagic;
begin
for i := 0 to g_MagicList.Count - 1 do
Dispose(PTClientMagic(g_MagicList[i])); //释放指针,
g_MagicList.Clear; //清理列表
while TRUE do
begin
if body = '' then
break;
body := GetValidStr3(body, data, ['/']); //切割
if data <> '' then
begin
new(pcm);
//PCM 一个TClientMagic记录指针变量。取它的内容,就是一个指针值,怎么又取它的地址呢?
//或者这个@()表示一个强制 地址类型?不是的, @构造一个指向其操作数的指针
//理解下,这应该是规避类型不匹配,
//原型是DecodeBuffer(Src: string; Buf: PChar; bufsize: Integer);
// pcm^表示了pcm 所指向的东西,这里是一个TClientMagic记录,可以把它当一个整体变量来看
// 它没有名字,但是经过了一个这个类型的指针声明,分配内存new ,它又是实际存在的。对应基础变量类型是自动分配,不需要手动
// 再取这个东西的的地址,如果编译选项{$T-}没有打开,@返回的是一个通用的指针
// 作为参数传递给过程的 Buf: PChar,
//应该可以改写为pchar(pcm) ,确实可以通过编译,直接用PCM 就不行 ?
//[Error] ClMain.pas(6433): Incompatible types: 'TClientMagic' and 'Char'
// DecodeBuffer(data, PChar(pcm), sizeof(TClientMagic));
DecodeBuffer(data, @(pcm^), sizeof(TClientMagic));

g_MagicList.Add(pcm);

// PlayScene.MemoLog.Lines.Add(pcm.Def.sMagicName + IntToStr(MagicList.Count));
end
else
break;
end;
end;

 

看到一个过程,里面有 @(pcm^) 这个代码, 为什么这样写,

理解了下,指针是指针,应该是避免对地址的直接操作,总得给它起个名字来称呼, 

^ 取内容,有的人说是 去指针,也许更恰当些。

 

在一些地方,用到了 @(pcm^) 这种模式,我认为根本原因是为了避开类型的不匹配,一个是自定义的记录指针,一个是 PCHAR 指针

 

标签:CLIENT8,MagicList,翎风,body,TClientMagic,pcm,data,指针
From: https://www.cnblogs.com/D7mir/p/17867375.html

相关文章

  • 原始翎风CLIENT8位 (4) frmMain 下的 OnIdle 事件
    原始翎风CLIENT8位frmMain下的OnIdle事件在frmMain的Create中Application.OnIdle:=AppOnIdle;//程序空闲事件的方法procedureAppOnIdle(Sender:TObject;varDone:Boolean);原型是procedureTForm1.ApplicationEvents1Idle(Sender:TObject;varDone:Boolea......
  • 原始翎风CLIENT8位 (3) frmMain 下的 CSocket控件
    原始翎风CLIENT8位frmMain下的CSocket控件属性:在frmMain的FormCreate中g_ConnectionStep:=cnsLogin设置为登陆方式g_boSendLogin:=Falseg_boServerConnected:=FALSE根据读取的mir.ini文件给CSOCKET的ADDRESS,PORT赋值Socket.Address:=g_sServerAddr;CSocket.Port:......
  • 【语音压缩】基于adpcm实现语音信号压缩与解压缩附Matlab实现
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • phpcms v9标签合集
    phpcmsv9模板制作常用代码集合1.截取调用标题长度{str_cut($r[title],36,'')}2.格式化时间调用格式化时间2011-05-0611:22:33{date('Y-m-dH:i:s',$r[inputtime])}3.多栏目调用&多推荐位调用调用需求:文章范围为596061三个栏目,并且推送到了27和28两个推荐位;从第三条开始......
  • phpcmsV9调用默认的分页样式
    //回复列表 publicfunctionganyanreply(){//点击后台-内容-留言管理,默认运行到这 $page=isset($_GET['page'])?intval($_GET['page']):1;//分页 $tablename=$this->db->db_tablepre.$MODEL[$modelid]['tablename'];// $this->db->......
  • phpcmsv9更换域名后和空间后登陆后台提示验证码错误如何解决
    修改 caches\configs\system.php 的//网站路径 'web_path' => '/apppath/',和'js_path' => 'http://localhost/apppath/statics/js/', //CDN JS'css_path' => 'http://localhost/apppath/statics/css/', //CD......
  • phpcms后台发表文章时候添加新的字段
    在modules/content/templates/content_add.tpl.php模板中的foreach($forminfos['base'] as $field=>$info) {}外面添加新的字段,注意name为字段名,同时在数据库的v9_news_data添加新的字段和testfield一致.<th width="80">测试字段</th><td><input type='text'......
  • phpcms添加后台菜单
    后台-扩展-菜单管理,选择在哪里添加菜单,然后填写模块名,文件名,方法名即可,参考系统默认的写法,如管理内容模块名为content,文件名是content.php,方法名是init,则调用的是 phpcms\modules\content\content.php中的init()方法,在content.php中function add() { }//对应的是content_add.tp......
  • 【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)
     【关键字】音频编码、管道模式、createEncoder【写在前面】在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。【主要功能代码】importohos.media.codec.Codec;importohos.media.common.BufferInfo;im......
  • 【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)
    【关键字】音频编码、管道模式、createEncoder 【写在前面】在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。 【主要功能代码】importohos.media.codec.Codec;importohos.media.common.Buf......