zoukankan      html  css  js  c++  java
  • Delphi中关于Move的操作

    在Delphi中,Move是这样来定义的:

    procedure Move(const Source; var Dest; Count: Integer); 

    这几天程序用到一个缓冲数据的截取,定义了一个PAnsiChar,然后来截取其中的一部分数据,发现总有问题. 

    var
      d,s: PansiChar;
    begin
      s:
    ='123456';
      d :
    = ansiStrAlloc(3);
      Move(s,d,
    3);
      ShowMessage(d);

      StrDispose(d); 

      

    后来在网上搜索了一下,发现问题出在move的操作上,正确的做法应该是:

    var
      d,s: PansiChar;
    begin
      s:
    ='123456';
      d :
    = ansiStrAlloc(3);
      Move(s^,d^,
    3);
      ShowMessage(d);

      StrDispose(d); 

       

    再来看move的源码:

    procedure       Move( const Source; var Dest; count : Integer );
    {$IFDEF PUREPASCAL}
    var
      S, D: PChar;
      I: Integer;
    begin
      S :
    = PChar(@Source);//取内存地址
      D :
    = PChar(@Dest);//取内存地址
      
    if S = D then Exit;
      
    if Cardinal(D) > Cardinal(S) then
        
    for I := count-1 downto 0 do
          D[I] :
    = S[I]
      
    else
        
    for I := 0 to count-1 do
          D[I] :
    = S[I];

    end; 

    如果直接传入s,S := PChar(@Source);//取内存地址  就相当于取的字符串S地址的地址.
    如果传入的是ps^,S := PChar(@Source);//取内存地址  就相当于取pchar 所指向字符串实际数据的地址.
  • 相关阅读:
    Linux 三剑客之SED
    搭建Docker环境
    Docker rabbitmq
    Docker Redis 集群
    Docker Mysql
    lerna 大前端项目代码重用解决方案
    将create-react-app从javascript迁移到typescript
    使用 React hooks 优雅解决 mp3 的播放 和 暂停
    React 代码 Import Svg as ReactComponent 失败
    vue3 自定义 hooks 优雅处理异步调用 ajax
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/2072416.html
Copyright © 2011-2022 走看看