# [fpc-pascal] Schema Types

Jonas Maebe jonas.maebe at elis.ugent.be
Mon Dec 22 11:53:08 CET 2008

```On 15 Dec 2008, at 21:29, Kevan Hashemi wrote:

> Dear FPC,
>
>> fancy:=new(fancy_type); // or something similar, I usually use
>> GetMem not New
>> SetLength(fancy.first, 10, 20);
>> SetLength(fancy.second, 10, 20);
>> SetLength(fancy.third, 300);
>
> Nice. I see how it works. Thank you very much (Felipe and Florian)
> for your answers. I'll try porting some code to FPC.

One important different to keep in mind between dynamic arrays and
regular arrays (including those defined using schema types): dynamic
arrays are reference counted and copies are always shallow copies.
This means that in this code:

var
a, b: array of real;
begin
setlength(a,10);
b:=a;
a[5]:=1.0;
end.

at the end, b[5] will also be 1.0. To make a deep copy, use the
following code after assignment:

setlength(b,length(b));

Note that this will only make the "first" level unique. I.e., if you
have:

var
a, b: array of array of real;
begin
setlength(a,10,10);
b:=a;
setlength(b,length(b));
a[5][5]:=1.0;
writeln(b[5][5]);
end.

then this will still print 1.0. I don't think there is an easier way
to make a full deep copy than using a loop to iteratively call
setlength on all sub-arrays as well:

var
a, b: array of array of real;
i: longint;
begin
setlength(a,10,10);
b:=a;
setlength(b,length(b));
for i:=0 to high(b) do
setlength(b[i],length(b[i]));
a[5][5]:=1.0;
writeln(b[5][5]);
end.

Jonas

```