内存 复制 buf pointer move(100分)

  • 主题发起人 主题发起人 tdp
  • 开始时间 开始时间
T

tdp

Unregistered / Unconfirmed
GUEST, unregistred user!
如何把两个两个内存块连接起来
buf1, buf2, buf3: porinter;
getmem(buf1, 10);
getmem(buf2, 10);
getmem(buf3, 20);
......
想要实现buf3= buf1 连接 buf2 , { buf3 } = { (buf1) (buf2) }
 
Move(buf1^, buf3^, sizeofbuf1))...
 
不是buf3 = buf1 , 是buf3= buf1 + buf2
把 buf1 放在 buf3 的前半部分,把 buf2 放在 buf3 的后半部分。

可以用下面的方法实现,但比较麻烦,应该可以直接实现的
MereoryStream.write(buf1, length(buf1));
MereoryStream.write(buf2, length(buf2));
MereoryStream.posion:= 0;
MereoryStream.read(buf3, length(buf));
 
//简单的办法:
var tempPtr : Pchar;
tempPtr := pchar(buf2) + 10
// 10=buf1大小
move(buf1^, buf3^, 10);
move(buf2^, tempPtr^, 10);
 
还是不太懂,参考下面的代码,在move中直接改变指针,有没有人可以仔细讲讲。

function TMemoryStream.Write(const Buffer
Count: Longint): Longint;
var
Pos: Longint;
begin
if (FPosition >= 0) and (Count >= 0) then
begin
Pos := FPosition + Count;
if Pos > 0 then
begin
if Pos > FSize then
begin
if Pos > FCapacity then
SetCapacity(Pos);
FSize := Pos;
end;
System.Move(Buffer, Pointer(Longint(FMemory) + FPosition)^, Count);
FPosition := Pos;
Result := Count;
Exit;
end;
end;
Result := 0;
end;
 
以前的贴子有人说:Move应该是按值传递,而不是按地址传递。
 
// 我前面给出的方法也是一样的, 就是简单的地址+而已
move(buf1^, buf3^, 10);
move(buf2^, pointer(Longint(buf3) + 10)^, 10);
 
多人接受答案了。
 
后退
顶部