如何将变量对象作为值参数传递

时间:2015-10-03 09:51:25

标签: delphi delphi-2010

我有一个自定义数据类型,以及所述类型的全局变量。我将这个全局变量作为参数传递给了几个方法,变量的值似乎无意中发生了变化。

我发现所有对象都作为参考参数传递,即使没有声明为var参数(或者我认为)。

所以我尝试通过向我传递对象的所有方法引入一个局部变量来解决问题,然后将局部变量赋值给参数,然后将对象参数声明为const - 但是全局变量仍在变化,我该如何克服这个?

{unit something}
interface

   uses
      SysUtils

   type
      ByteArr = Array of Byte;
      Num = record
         sign : byte;
         int : ByteArr;
         frac : ByteArr;
      end;

   function StrToNum(input : string):Num;
   function NumToStr(input : Num):string;
   function Dostuff(const a : Num):Num

implementation

    function StrToNum(input : string):Num;
    begin
       //code to convert a string into 'Num' type
    end;

    function NumToStr(input : Num):string;
    begin
       //code to output a string version of a 'Num' input
    end;

    function Dostuff(const a : Num):Num
    var
       somevar : num;
    begin
       somevar := a;
       code; //code to change value of 'somevar'
       result := somevar;
    end;       

end.

{console program}
uses
   something in 'something.pas';
var
   globalvar : num;

begin
   globalvar := StrToNum('2');
   writeln(NumToStr(globalvar)); //shows 2
   writeln(NumToStr(Dostuff(globalvar))); //shows correct value
   writeln(numtostr(globalvar)); //no longer displays 2
end.

2 个答案:

答案 0 :(得分:1)

动态数组是引用类型。您的类型ByteArr是动态数组,因此是引用类型。这种类型的变量的赋值是引用赋值而不是赋值。

考虑以下代码:

var
  A, B: ByteArr;
....
SetLength(A, 1);
A[0] := 0;
B := A;
Writeln(A[0]);
B[0] := 42;
Writeln(A[0]);

这将输出

0
42

那是因为在B := A之后,两个变量引用到同一个数组。

使用Copy创建一个新数组,该数组是第一个的副本:

B := Copy(A);

答案 1 :(得分:0)

Object是指针类型。一些指针(对象副本)可以处理相同的内存片段,因此修改一个副本会影响其他内容 你的问题没有明确定义,但我怀疑你可能需要"深层复制"对象内容 - 例如在Assign的帮助下 - 从TPersistent继承类并实现AssignTo方法。