What would the expected behavior be for pointers inside records? What if the record is actually a linked list? Or includes classes and objects? Do we run the constructor or no? If the record has file handles do we attempt to recreate their state? (perhaps running assign again, and crossing our fingers the file hasn't been deleted - which at least on Linux is definitely possible)

On 05/16/2018 04:24 AM, denisgolovan wrote:
Doing the same conceptual thing using different syntax does not seem right as 
generics, macros and other nice stuff become clumsy and too verbose.

See

//========================================================
program project1;
{$mode objfpc}

type
    TRec= record
       A:array of integer;
       S:string;
    end;

var R1,R2:TRec;
begin
    SetLength(R1.A, 3);
    R1.A[0]:=1;
    R1.A[1]:=2;
    R1.A[2]:=3;
    R1.S:='123';

    R2:=R1; // shallow copying <> full clone
    R2.A[0]:=10;
    R2.S[1]:='S';

    // does not work as expected (no copy-on-write/cloning)
    writeln(R1.A[0]); // prints 10
    writeln(R2.A[0]); // prints 10

    // works fine
    writeln(R1.S[1]); // prints 1
    writeln(R2.S[1]); // prints S
end.
//========================================================

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

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

Reply via email to