【发布时间】:2015-01-06 05:34:57
【问题描述】:
这似乎是一个奇怪的请求,但有一个很好的理由(代码生成应用程序)。我将一个变体数组传递给一个过程,该过程包含在一个变体数组中,如下所示:
TVarArray = array of variant;
procedure TMainForm.Button1Click(Sender: TObject);
var
params: TVarArray;
numRows: integer;
numCols: integer;
i: integer;
j: integer;
begin
SetLength(params, 2);
numRows := 2;
numCols := 2;
params[0] := 5;
params[1] := VarArrayCreate([1, numRows, 1, numCols], varVariant);
for i := 1 to numRows do
for j := 1 to numCols do
params[1][i, j] := i + j;
TestProc(params);
end;
procedure TMainForm.TestProc(params: TVarArray);
var
arr: variant;
p: PVariant;
v: variant;
begin
arr := params[1]; // -- Copies the array to arr.
arr[2, 2] := 99;
p := @(params[1]);
p^[2, 2] := 88; // -- Directly reference the passed-in array.
v := p^; // -- Copies the array to v -> How to prevent?
v[2, 2] := 77; // -- This should change the value in the original array.
edit1.Text := VarToStr(arr[2, 2]); // -- 99
edit2.Text := VarToStr(params[1][2, 2]); // -- 88 - should be 77
edit3.Text := VarToStr(v[2, 2]); // -- 77
end;
我不想创建数组的副本,所以可以使用 p^[] 直接访问传入的数组。但是,我不想在 TestProc 中使用 p^ 语法,而是更喜欢使用不带 ^ 的变量名。当然,如果我尝试 v := p^ 我只会得到一份副本。有没有办法解决?谢谢!
【问题讨论】:
-
所以,据我了解,您已经有了解决方案,即使用
p^。 -
@DavidHeffernan 是的,我可以使用 p^,但是如果他们在生成的代码中看到“^”,则 TestProc 等效项来自我的代码生成器,并且从最终用户的角度来看,他们绑定到被吓到(这是针对非专业编码人员的)。我怀疑这是不可能的,但我想我会问。
-
你为什么首先使用变体?
-
通常情况下,生成的代码永远不需要人工查看。它由生成器编写并由编译器读取,仅此而已。鉴于此,生成的代码很少需要看起来漂亮。
-
@RobKennedy 在我的情况下,TestProc 将包含用户代码和生成代码的混合,这一事实更加复杂。
标签: arrays delphi pointers variant