delphi数组问题
最近一直为数组的问题困绕。数组的值老是传不对。
procedure sendData(cosnt buf;len:integer);
var
buffer:array of byte;
begin
move(buf,buffer,len);//这里buffer没有正常将buf的值赋过来
//....
end;
经过研究发现是由于静态数组和动态数组,指针的指向是不一样的。 string类型也是动态数组。
如下例子。
静态数组
procedure TForm1.Button1Click(Sender: TObject);
var
a:Array[0..10] of integer;
b,c:pointer;
begin
b:=@a;
c:=@(a[0]);
showmessage(inttostr(integer(b))+' '+inttostr(integer(c))); --相等
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a:array of integer;
b,c:pointer;
begin
setlength(a,10);
b:=@a;
c:=@(a[0]);
showmessage(inttostr(integer(b))+' '+inttostr(integer(c))); --不相等
c:=@(a[0]);
showmessage(inttostr(integer(b))+' '+inttostr(integer(c))); --相等
end;
这两个例子可以说明。动态数组的变量名,不等于第1个数组,它是一个地址.
静态数组名等于第1个数组
所以在使用Move这个函数时,它取了source和Dest的地址进行赋值操作,如下:
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;
动态数组应该如下传值
var
buffer:array of byte;
begin
move(buf,buffer[0],len);
静态数组应该如下传值
var
buffer:array of byte;
begin
move(buf,buffer,len);
转载于:https://www.cnblogs.com/sunlinjun/archive/2009/12/18/1559228.html
delphi数组问题相关推荐
- delphi数组与c语言数组不同,delphi数组间的赋值
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢.在函数参数中使用数组的时候,数组将被转换为指针处理 ...
- delphi 数组复制利用CopyMemory 最为完美
delphi 数组复制利用CopyMemory 最为完美 在各网站的文章里面,见复制数据的方法中,有move的,有system.copy的,而要实际应用中,这两种方法,并不是很完美,会遇到一些问题,比 ...
- Delphi - 数组 详解
技术交流,DH讲解. 首先我们要知道什么是数组?数组是一堆相同特性数据的一个集合,也就是每个元素的类型必须是一样的,当然在其他一些弱语法的语言里面,数组的元素可以千奇百怪. 例子: ? 1 2 3 4 ...
- Delphi用指针读取数组某个元素
要点: 1.TBytes和C++里面的数组一样,数组名就是数组的首地址.而array [..] of char 不是指针,需要用取地址符号读地址@ 2.要获取TBytes某个元素位置的指针, 应该是 ...
- Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)...
来源:http://blog.csdn.net/xiongmao000738/article/details/6863988 一.变体类型常用的函数介绍: Variant: 一种可以拥有各种数据类型: ...
- Variant 数组
Variant 数组 Variant: 一种可以拥有各种数据类型: 也可以告诉目前存储的数据是什么类型(通过使用VarType函数): 可以给相同的Variant分配不同的数据类型,只要Var ...
- 使用Delphi学COM
第一章 在Delphi中使用接口 1.1 定义接口: 目的:什么是接口,以及和抽象类的关联以及不同点. 抽象类(备注理解接口最简单的方法) 永远不能创建一个抽象类的实例: 本身不能实现功能,依 ...
- 269道各路算法考试题集锦
1 某编程大赛题(35道题,中等难度) 1.在实际的开发工作中,对于string的处理是最常见的编程任务,本题是要求程序对用户输入的string进行处理,具体要求如下: 1.每个单词的首字母变为大写. ...
- 【delphi】Byte数组与String类型的转换
string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...
最新文章
- mysql封装成类_python操作mysql封装成类
- 引用的定义、使用及其和指针的区别与联系
- java mysql 全文索引_MySQL索引原理
- c#FileStream文件读写(转)
- 3D 服务器端以向量计算为主的角色位置的算法
- PYTHON自动化Day3-列表/元组/切片/字典/字符串处理方法
- WPF 使用DrawingVisual绘制高性能曲线图
- Linux命令中的$()和${}的区别
- 子类怎么继承父类方法中的变量_JavaOOP_04 封装 继承
- HTML初识HTML
- Prometheus+Grafana监控PostgreSQL
- 支付宝小程序平台的IM聊天插件
- if else 条件语句
- Altium net has no driving source问题
- PTA习题【python】 6-8 jmu-python-发牌
- BZOJ1066 蜥蜴
- linux-防火墙开放端口
- 不正经的保姆级西电软工操作系统实验课教程 ==== 专题一
- 海康萤石摄像头SDK Java(一)java本地调用摄像头
- 使用Let's Encrypt申请永久免费通配符证书