我想使用pointer实现两个数组相加放到一个新数组中,怎么出错!??
var
a:Array of Byte;
b:Array of Byte;
c:Array of Byte;
i:Integer;
p:PChar;
begin
setLength(a,10);
setLength(b,10);
setLength(c,20);
ZeroMemory(a,10);
ZeroMemory(b,10);
ZeroMemory(c,20);
p:=@c;
for i:=0 to 9 do
begin
a[i]:=52;
b[i]:=53;
end;
ShowMessage(PChar(a));
ShowMessage(PChar(b));
CopyMemory(p,@a,10);
ShowMessage(PChar(c));
inc(p,10);
CopyMemory(p,@b,10); //??? 怎么出错!!??
end;
问题点数:25、回复次数:6Top
1 楼bluekitty(软件黑领)回复于 2006-03-01 11:28:15 得分 0
CopyMemory(p,@x,10)改成CopyMemory(p,@x,10*sizeof(integer))Top
2 楼bluekitty(软件黑领)回复于 2006-03-01 11:32:46 得分 0
...,看错了,abc我看成integer数组了Top
3 楼jixiaoqiang(探索者)回复于 2006-03-01 11:40:09 得分 0
现在又发现一个问题,真是奇怪!!
var
b:Array of Byte;
c:Array of Byte;
i:Integer;
p:PChar;
begin
setLength(b,10);
setLength(c,20);
ZeroMemory(b,10);
ZeroMemory(c,20);
p:=@c;
for i:=0 to 8 do
begin
b[i]:=48 + i;
end;
ShowMessage(PChar(c));
CopyMemory(p,@b,1*sizeof(byte)); //copy1个字节,为什么内容都复制过去了??
ShowMessage(PChar(c));
end;Top
4 楼ZyxIp(绝望中...)回复于 2006-03-01 12:06:04 得分 0
a:Array of Byte;定义一个动态数组,a 就是一个指针
ZeroMemory(a,10);第一个参数要pointer 你这样写是正确的.
CopyMemory(p,@a,10);这里也是要pointer你为什么写@a这成了指针的指针.
这里应写成CopyMemory(p,a,10);
留言的时候为什么有时删除就,Ctrl_C这些都失效了?Top
5 楼ZyxIp(绝望中...)回复于 2006-03-01 12:09:00 得分 25
正确的写法
var
a:Array of Byte;
b:Array of Byte;
c:Array of Byte;
i:Integer;
p:pointer;
begin
setLength(a,10);
setLength(b,10);
setLength(c,20);
ZeroMemory(a,10);
ZeroMemory(b,10);
ZeroMemory(c,20);
p:=c;
for i:=0 to 9 do
begin
a[i]:=52;
b[i]:=53;
end;
ShowMessage(PChar(a));
ShowMessage(PChar(b));
CopyMemory(p,a,10);
ShowMessage(PChar(c));
p:=Pointer(Integer(p)+10);
CopyMemory(p,b,10);
ShowMessage(PChar(c));
a:=Nil;
b:=Nil;
c:=Nil;
end;Top
6 楼jixiaoqiang(探索者)回复于 2006-03-01 14:21:09 得分 0
//p:=@c 你会死的很难看,copyMemory的时候,即使限定长度,会把整个内容都给复制进去,还误以为是copymemory函数的问题呢!!
//正是似懂非懂害死人呀..别人写的用@的是因为他是string类型的,而这里的c本身就代表数组的首指针.
//如果p:=@c,会把c的指针对应的内存地址赋给p,这样p就不是指向c的指针了.Top




