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 ?
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 ?
解决方案 »
- 怎样从表table1中随机选取5条记录显示出来?
- Delphi 渐渐离我们而去
- 如果只用SQL的本地功能,并不使用它的网络功能,装哪个版本就行了呢?企业版?标准版?个人版?给点意见.
- 谁用过这个第三方控件,告诉我名字,急!
- delphi 使用的API到何处查?谢谢!
- 請問大俠如何判定自已電腦是否連在InterNet 上?
- 关于“数据库记录太多,如何解决?(500分解决该问题)”问题的给分,请blueshu(绝对是菜鸟)领分
- 学delphi应该配备拿几本工具书呢?
- 急救,关于存储过程
- 在Delphi中如何在RichEdit的每行前加个CheckBox
- 数据库多表联查返回的数据集删除的问题
- delphi操作oracle问题
查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);
Procedure TForm1.New(RecData:Array of BYTE);
这样声明的方法头部会产生一段循环拷贝数组的指令而
Procedure TForm1.New(const RecData:Array of BYTE);
Procedure TForm1.New(var RecData:Array of BYTE);
这两种声明不会有前者的问题,会更节省空间并更有效率。
所以当以数组作为参数传递时应该尽量避免第一种声明。