procedure  TForm1.Button1Click(Sender:  TObject);  
var  
Buf:Array  of  byte;  
i:integer;  
begin  
 Setlength(Buf,11);  
 Buf[2]:=1;       //数组第三字节赋为1  
 New(Buf);        //调用New进程,修改第三字节  
 Showmessage(intToStr(Buf[2]));  
end;  
 
Procedure  TForm1.New(RecData:Array  of  BYTE);  
begin  
 Recdata[2]:=100;                
end;  
 
为什么最后Showmessage出来的还是1,而不是进程修改掉的100  ?

解决方案 »

  1.   

    这个问题是由于Delphi编译器本身的处理造成的
    查Delphi的帮助Open array parameters的说明
    When you pass an array as an open array value parameter, the compiler creates a local copy of the array within the routine's stack frame. 就是说Delphi编译的TForm1.New方法执行前 会把从传进来动态数组(一个堆指针)拷贝到栈上再进行操作,所以要修改数组参数的内容 应该这样写:
    Procedure  TForm1.New(var RecData:Array  of  BYTE);
      

  2.   

    查看汇编可以得知
    Procedure  TForm1.New(RecData:Array  of  BYTE);
    这样声明的方法头部会产生一段循环拷贝数组的指令而
    Procedure  TForm1.New(const RecData:Array  of  BYTE);  
    Procedure  TForm1.New(var RecData:Array  of  BYTE);  
    这两种声明不会有前者的问题,会更节省空间并更有效率。
    所以当以数组作为参数传递时应该尽量避免第一种声明。