gpt4 book ai didi

arrays - 如何将 Variant (包含数组)转换为数组,并将其作为参数传递?

转载 作者:行者123 更新时间:2023-12-01 20:20:01 33 4
gpt4 key购买 nike

我需要调用一个需要整数数组的函数,但我的值位于包含该数组的Variant类型的变量中。

我真的必须循环复制这些值吗?我找不到更好的方法。

相同的变体还可以保存单个Integer而不是数组,因此我创建了一个允许两者的辅助函数(使用VarIsArray检查)。它可以工作,但它只是冗长而且不好:)

type
TIntegerArray = array of Integer;

function VarToArrayInt(const V: Variant): TIntegerArray;
var
I: Integer;
begin
if VarIsArray(V) then begin
SetLength(Result, VarArrayHighBound(V, 1) + 1);
for I:= 0 to High(Result) do Result[I]:= V[I];
end else begin
SetLength(Result, 1);
Result[0]:= V;
end;
end;

我使用的是 Delphi 10.2.2,要调用的函数无法更改,如下所示:

function Work(Otherparameters; const AParams: array of Integer): Boolean;

最佳答案

如果函数将整数数组作为单独的类型,例如:

type
TIntegerArray = array of Integer;

function DoIt(const Values: TIntegerArray): ReturnType;

然后该函数接受 Dynamic Array作为输入。您可以将保存数组的 Variant 分配/传递给动态数组变量/参数。编译器足够聪明,可以调用 RTL 的 VarToDynArray() 函数来分配一个新的动态数组,该数组具有 Variant 数组元素的副本。如果不复制数组数据,就无法将保存数组的 Variant 传递给动态数组。

但是,如果函数直接在其参数列表中采用整数数组,例如:

function DoIt(const Values: array of Integer): ReturnType;

然后需要 Open Array作为输入:

an Delphi function that has an open array parameter can be called by explicitly passing two parameters:

  • A pointer to the first element of the array
  • A count, which is the value of the last index (that is, the size/number of array elements, minus one)"

您无法将 Variant(无论它是否包含数组)直接传递给 Open Array 参数。编译器不够智能,无法提取数组指针和元素计数并将它们传递给 Open Array 参数。但是,您可以通过一些类型转换技巧手动完成,例如:

function DoIt(const Values: array of Integer): ReturnType;

...

type
TOpenArrayFunc = function(const Values: PInteger; ValuesHigh: Integer): ReturnType;

var
V: Variant;
Count: Integer;
P: PInteger;
begin
...
V := ...;
Count := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1;
P := VarArrayLock(V);
try
TOpenArrayFunc(@DoIt)(P, Count-1);
finally
VarArrayUnlock(V);
end;
...
end;

这会将 Variant 的数组直接传递给函数,而根本不复制数组元素。

关于arrays - 如何将 Variant (包含数组)转换为数组,并将其作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49499047/

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