Delphi 无类型参数传递动态数组和静态数组
2010-12-01 09:55
495 查看
前几天发现的一个相关的问题,总结了下,备忘:
相关几个函数声明:
procedure FillChar(var X; Count: Integer; Value: Byte);
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
function THandleStream.Write(const Buffer; Count: Longint): Longint;
测试代码:
[/code]
原因和结论:
1.定长数组A就是一个变量,A和A[0], @A=@A[0]
动态数组B就是一个指针,B是数组的首地址.B=@B[0]
2.普通参数按值传递,常量参数和变量参数都是按地址传递的 ,无类型参数只能是常量或变量参数,都是按地址传递
3.Best Practise:在用数组作参数的时,不管静态动态一率从0开始,要求传无类型参数的时候一率用arr[0]是个好习惯。写成 arr[Low(arr)] 最好.
参考:
Delphi - 数组 详解
/article/4948568.html
诡异的动态数组问题
http://bbs.2ccc.com/topic.asp?topicid=358558
关于指针和过程/函数的无类型 var 参数的问题。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1938519
相关几个函数声明:
procedure FillChar(var X; Count: Integer; Value: Byte);
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
function THandleStream.Write(const Buffer; Count: Longint): Longint;
测试代码:
测试代码[code]procedure TForm1.btn1Click(Sender: TObject); var verifyMsg : array[0..48] of Char; //定长数组 signedLen : Integer; verfyFile : TFileStream; str : string; len : Integer; begin len := 48; str := 'hello world'; FillChar(verifyMsg[0], len, 0); // OK // FillChar(verifyMsg, len, 0); CopyMemory(@verifyMsg[0], PChar(@str[1]), Length(str)); //要从str[1] 开始copy // OK // CopyMemory(@verifyMsg, Pointer(str), Length(str)); //str pointer pchar都可以 // OK // CopyMemory(@verifyMsg, @str[1], Length(str)); //要从str[1] 开始copy verfyFile := TFileStream.Create('c:\\test.data', fmCreate or fmShareDenyRead); // 方法1 Ok verfyFile.Write(verifyMsg[0], Length(verifyMsg)); // 方法 2 OK // verfyFile.Write(PChar(@verifyMsg[0])^, Length(verifyMsg)); // 方法 3 OK // verfyFile.Write(verifyMsg, Length(verifyMsg)); // 测试写入字符串 // 方法1 OK // verfyFile.write(PChar(str)^,length(str)); // 方法 2 wrong // 写入内容是错误的 可能是str的内部结构导致 // verfyFile.write(str, length(str)); // 方法 3 OK // verfyFile.write(str[1], length(str)); // 方法 4 OK // verfyFile.write(Pointer(str)^,length(str)); freeAndNil(verfyFile); end; procedure TForm1.btn2Click(Sender: TObject); var verifyMsg : array of Char; //动态数组 signedLen : Integer; verfyFile : TFileStream; str : string; len : Integer; begin len := 48; str := 'hello world'; SetLength(verifyMsg, len); // Error FillChar 参数不是指针,如下这行所以是错的. // FillChar(verifyMsg, len, 0); FillChar(verifyMsg[0], len, 0); // OK 接收参数是指针 CopyMemory(@verifyMsg[0], @str[1], Length(str)); // 要从str[1] 开始copy // CopyMemory(verifyMsg, PChar(@str[1]), Length(str)); verfyFile := TFileStream.Create('c:\\test2.data', fmCreate or fmShareDenyRead); // 方法 1 OK 接收参数是无参类型 // verfyFile.Write(PChar(@verifyMsg[0])^, Length(verifyMsg)); // 方法 2 OK 接收参数是无参类型 verfyFile.Write(verifyMsg[0], Length(verifyMsg)); freeAndNil(verfyFile); end;
[/code]
原因和结论:
1.定长数组A就是一个变量,A和A[0], @A=@A[0]
动态数组B就是一个指针,B是数组的首地址.B=@B[0]
2.普通参数按值传递,常量参数和变量参数都是按地址传递的 ,无类型参数只能是常量或变量参数,都是按地址传递
3.Best Practise:在用数组作参数的时,不管静态动态一率从0开始,要求传无类型参数的时候一率用arr[0]是个好习惯。写成 arr[Low(arr)] 最好.
参考:
Delphi - 数组 详解
/article/4948568.html
诡异的动态数组问题
http://bbs.2ccc.com/topic.asp?topicid=358558
关于指针和过程/函数的无类型 var 参数的问题。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1938519
相关文章推荐
- 将多个不同类型的控件放在一个动态数组(ArrayList)中作为参数(控件数组)传递
- 我怎样在函数参数传递时混用静态和动态多维数组?
- 理解 Delphi 的类(十) - 深入方法[20] - 静态数组参数
- ASP.NET MVC3如何用JQuery传递数组(集合)类型参数给JsonResult Action
- 学习笔记--静态方法调用,多肽,操作符重载,3中参数传递方式,二维数组与交错数组
- 【spring】ApplicationListener传递参数到页面(解决静态+动态资源路径+静态文件的缓存控制)
- DELPHI中不同类型的动态数组变量共享内存
- [转]C++中动态分配二位数组和参数传递
- 数组和指针、数组指针和指针数组、函数指针和指针函数、数组标识符的意义、静态和动态创建的数组的本质区别、标识符类型判断方法
- VB调用DLL时传递自定义类型数组参数注意
- C/C++二维数组的动态分配及参数传递
- 反射取含数组的构造函数时的参数类型传递 推荐
- Delphi的参数传递约定以及动态参数个数(转载笔记)
- struts2 常用的结果类型,动态结果,异常处理,如何传递参数与常用的通配符映射
- Delphi 方法或过程中用的参数是动态数组的用法。
- 二维数组的定义(动态初始化、静态初始化)、初始化格式及其操作、java中的参数传递方式,面向对象的基本概念
- *函数参数传递类的类型,在函数内部动态创建不同类型的实例
- 【spring】ApplicationListener传递参数到页面(解决静态+动态资源路径+静态文件的缓存控制)
- Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)
- 参数传递数组 接收 前端使用jquery向后台传递数组类型的参数,java后台直接通过list类型接收,会发现无法取到参数的情况。