[Lazarus] Use of Move()?
Bo Berglund
bo.berglund at gmail.com
Tue Feb 1 23:51:50 CET 2011
On Tue, 01 Feb 2011 23:33:58 +0100, Marc Weustink
<marc at dommelstein.net> wrote:
>
>Just tested:
>
>program MoveTest;
>{$mode objfpc}{$H+}
>uses
> SysUtils;
>var
> S: String;
> I: Integer;
> P: Pointer;
>begin
> S := 'Bla';
> S := S + S;
> P := @I;
> Move(S[1], P^, SizeOf(I));
>
> WriteLn(Format('%x %x %x %x %8.8x', [Ord(S[1]), Ord(S[2]), Ord(S[3]),
>Ord(S[4]), i]));
>end.
>
>$ ./movetest
>42 6C 61 42 42616C42
>
My code is a bit more complex because I want to be able to read and
write different types of variables to the buffer handler.
As an example I have the case of a string variable. To write it into
the buffer I use this overloaded write:
function TSSCommBuf.Write(const Source: string): boolean;
begin
Result := Write(@Source[1], Length(Source));
end;
and for a Cardinal argument I use this:
function TSSCommBuf.Write(const Source: Cardinal): boolean;
begin
Result := Write(@Source, SizeOf(Source));
end;
both of which then calls the main Write:
function TSSCommBuf.Write(Source: Pointer; Count: Cardinal): boolean;
var
b: byte; //For debugging, will be removed later
Dst: Pointer; //Suggestion from Marc Weustink
begin
Result := false;
//Check buffer size and grow if needed
if (FBufSize - FWriteIndex) < Count then
ExpandBuffer(FWriteIndex - FBufSize + Count);
Dst := @FBuf[FWriteIndex];
Move(Source, Dst^, Count); // Source and Dst are pointers
b := FBuf[FWriteIndex]; //To check what actually was written
FWriteIndex := FWriteIndex + Count;
Result := true;
end;
When I call the Write method with a string argument I get first to the
small overloaded function, which unifies the arguments and calls the
main Write.
But when I test this with the string containing the single char #6
then the value that actually gets written is #64....
So somehow I am missing something important here...
Bo Berglund
More information about the Lazarus
mailing list