Arrays 将变量数组转换为动态数组

Arrays 将变量数组转换为动态数组,arrays,delphi,Arrays,Delphi,我试图将一个变体数组(double,但它可能是我猜的任何东西)转换为一个动态数组。我通常使用DynArrayFromVariant和DynArrayToVariant过程,但在本例中,我的变量数组是基于1的。这两个函数似乎只适用于基于0的数组。你知道我该怎么做吗?如果你知道数组元素的类型,你可以编写更高效(而不是泛型)的代码: 函数doubledynarrayfromvarray(const V:Variant):TDoubleDynArray; 变量 P:指针; 计数:整数; 开始 结果:=无

我试图将一个变体数组(double,但它可能是我猜的任何东西)转换为一个动态数组。我通常使用DynArrayFromVariant和DynArrayToVariant过程,但在本例中,我的变量数组是基于1的。这两个函数似乎只适用于基于0的数组。你知道我该怎么做吗?

如果你知道数组元素的类型,你可以编写更高效(而不是泛型)的代码:

函数doubledynarrayfromvarray(const V:Variant):TDoubleDynArray;
变量
P:指针;
计数:整数;
开始
结果:=无;
如果不是VarIsArray(V)或(VarType(V)和varTypeMask varDouble)或
(VarArrayDimCount(V)1)然后
生成evariantivalidargerror.Create(SVarInvalid);
计数:=varraryhighbound(V,1)-varrarylowbound(V,1)+1;
如果计数=0,则
出口
P:=瓦拉洛克(V);
尝试
设置长度(结果、计数);
移动(P^,结果[0],Count*SizeOf(Double));
最后
瓦拉伦洛克(V);
结束;
结束;

如果您知道数组元素的类型,则可以编写更高效(但不太通用)的代码:

函数doubledynarrayfromvarray(const V:Variant):TDoubleDynArray;
变量
P:指针;
计数:整数;
开始
结果:=无;
如果不是VarIsArray(V)或(VarType(V)和varTypeMask varDouble)或
(VarArrayDimCount(V)1)然后
生成evariantivalidargerror.Create(SVarInvalid);
计数:=varraryhighbound(V,1)-varrarylowbound(V,1)+1;
如果计数=0,则
出口
P:=瓦拉洛克(V);
尝试
设置长度(结果、计数);
移动(P^,结果[0],Count*SizeOf(Double));
最后
瓦拉伦洛克(V);
结束;
结束;

调用SetLength分配动态数组,然后用for循环填充它调用SetLength分配动态数组,然后用for循环填充它
function DoubleDynArrayFromVarArray(const V: Variant): TDoubleDynArray;
var
  P: Pointer;
  Count: Integer;
begin
  Result := nil;
  if not VarIsArray(V) or (VarType(V) and varTypeMask <> varDouble) or
    (VarArrayDimCount(V) <> 1) then
    raise EVariantInvalidArgError.Create(SVarInvalid);

  Count := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1;
  if Count = 0 then
    Exit;

  P := VarArrayLock(V);
  try
    SetLength(Result, Count);
    Move(P^, Result[0], Count * SizeOf(Double));
  finally
    VarArrayUnlock(V);
  end;
end;