> On Mar 9, 2018, at 4:13 PM, Ryan Joseph <r...@thealchemistguild.com> wrote:
> 
> type
>       TDataObject = object
>               v: array[0..2] of integer;
>       end;
> 
> procedure TestObjectCopy; 
> var
>       obj: TDataObject;
>       data: array[0..2] of integer;
>       i: integer;
> begin
>       for i := 0 to 2 do
>               obj.v[i] := 100 + (100 * i);
>               
>       Move(obj, data, sizeof(TDataObject));
>       for i := 0 to 2 do
>               writeln(data[i]);
> end;

Actually this doesn’t work. VMT table breaks the data.

Program below returns:

10
20
30
32766
0
0
 
with the virtual method and:

10
20
30
100
200
300

without the virtual method.


type
        TSuperDataObject = object
                a: array[0..2] of integer;

                procedure Test; virtual; abstract;
        end;

type
        TDataObject = object (TSuperDataObject)
                b: array[0..2] of integer;

                procedure Test;
        end;

procedure TDataObject.Test;
begin
end;

procedure TestObjectCopy; 
var
        obj: TDataObject;
        data: array[0..5] of integer;
        i: integer;
begin
        for i := 0 to 2 do
                begin
                        obj.a[i] := 10 + (10 * i);
                        obj.b[i] := 100 + (100 * i);
                end;

        Move(obj, data, sizeof(TDataObject));
        for i := 0 to 5 do
                writeln(data[i]);
end;

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to