gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:16:14 26 4
gpt4 key购买 nike

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

我发现所有对象都作为引用参数传递,即使没有声明为 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.

最佳答案

动态数组是一种引用类型。您的类型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);

关于delphi - 如何将变量对象作为值参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32921174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com