Проблема при работе с массивом

Здравствуйте, в данной программе я умножаю единственный элемент массива “а” на 3, полученный массив носит имя “k”. Проблема в том, что после этой операции элемент “а” тоже оказывается умноженным на три:

var
  a,k:array of real;
function Mult(r:array of real; num:real):array of real;
  begin
    r[0]*=num;
    Result:=r;
  end;
begin
  a:=new real[1] (1);
  k:=Mult(a,3);
  Writeln(a[0]);
end.

Выводится "3" Вот похожий код, где я умножаю число “a” на 3, результат присваивается “k”. В этом случае с “а” всё остаётся в порядке, выводится “1”:

var
  a,k:real;
function Mult(r,num:real):real;
  begin
    r*=num;
    Result:=r;
  end;
begin
  a:=1;
  k:=Mult(a,3);
  Writeln(a);
end.

Выходит, что в одном случае переменная “а” меняется, в другом - нет. В чём тут дело? Если же в функции первой программы создать ещё одну переменную, и провести действия “через неё”, то массив “а” не меняется, выведется “1”:

var
  a,k:array of real;
function Mult(r:array of real; num:real):array of real;
  var
    b:array of real:=new real[1];
  begin
    b[0]:=r[0]*num;
    Result:=b;
  end;
begin
  a:=new real[1] (1);
  k:=Mult(a,3);
  Writeln(a[0]);
end.

Заранее спасибо за разъяснение.

динамические массивы имеют ссылочную семантику. copy-on-write семантика есть только у строк

Можете объяснить попроще, пожалуйста? Я недостаточно компетентен.

динамические массивы всегда передаются как ссылки, то есть а и r ссылаются на один и тот же массив. поэтому изменяя элемент r, вы изменяете a. вам надо копировать r функцией Copy.

1 лайк

Понял, большое спасибо!