arrays - Delphi 中将数组转换为 const 数组

标签 arrays delphi type-conversion delphi-10.2-tokyo

我正在寻找一种简单且理想通用(或使用泛型)的方法来转换 arrayarray of const (=array of TVarRec)。我的具体情况是我有一个 array of Variant并想将其传递给Format()功能。

这是我到目前为止所发现的,但对我来说看起来很黑客:

function MyFormat(const Fmt: string; const Args: TArray<Variant>): string;
var
  A: array of TVarRec;
  I: Integer;
begin
  SetLength(A, Length(Args));
  for I:= Low(Args) to High(Args) do begin
    A[I].VType:= vtVariant;
    A[I].VVariant:= @Args[I];
  end;
  Result:= Format(Fmt, A);
end;

这似乎有效。安全吗?

是否可以做得更短、更好、更快,或者我可以使用现成的东西来代替? :)


一些额外的想法和有趣的事实:

System.Rtti.TValue最近成为我的 friend 。然而,这里似乎缺少一个功能。我可以使用 TValue.From() 读取我的数组,但似乎没有办法将其取出为 array of TVarRec 。有一个精彩TValueArrayToArrayOfConst ,但这并没有真正的帮助,因为我必须构造一个 array of TValue首先,这与存储在单个TValue中的数组不同。 ... :(

至少 TValue 能够将单个元素输出为 TVarRec,因此我认为我可以为所有类型的数组创建一个通用转换器。但是...

你认为这有效吗?

for I:= Low(Args) to High(Args) do A[I]:= TValue.From(Args[I]).AsVarRec;

它可以编译,但是 TValue的内存在使用后被释放,并且自 TVarRec.VVariant是一个指针,然后它指向某个旧位置,该位置将在下一个周期被覆盖。

最佳答案

您的函数安全且快速。它只分配一个小的内存数组A[] ,并通过引用传递所有值。我无法更快地思考任何事情 - 而不是过早的优化。我可能只会做一些重构来重用 TArray<variant>进入TArray<TVarRec>转换例程。

使用TValue.From().AsVarRec如果您的输入确实是TArray<Variant>,那么肯定会更慢.

关于TVarRec dandling 引用,你是对的:这些结构只是堆栈上的简单指针,没有分配,因此所有引用的变量在函数调用期间都应该可用。因此,如果您使用 TArray<TVarRec>本地转换,您应该确保TArray<variant>调用format()时仍然分配功能。

关于arrays - Delphi 中将数组转换为 const 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585956/

相关文章:

c# - 将类型转换(向下转换)为另一个子类型时出现运行时错误

c++ - 使用 OpenCV 描述符匹配 findFundamentalMat

java.util.Scanner 对象在解析文本文件时抛出 NullPointerException

javascript - 检索 React 组件上单击的数组项

python - Python 解释器如何将 int 转换为 long?

c++ - 如何将 vector<wstring> 转换为 wchar_t**?

arrays - 无法将值存储在数组中

delphi - Windows 7 上的 IHTMLDocument2 和 Internet Explorer 11 更改

arrays - 无法为具有记录数组的对象赋值

delphi - 是否可以在 TIdHTTPServer onCommandGet 事件中使用 TIdHTTP(客户端)重定向请求并返回响应?