【问题标题】:How to determine if array items are references to other arrays (multidimensional arrays)如何确定数组项是否是对其他数组(多维数组)的引用
【发布时间】:2016-09-18 21:50:07
【问题描述】:

我如何确定一个数组项是对另一个数组的引用还是对另一个类型的项(例如 Single)的引用。

我正在研究这个,因为我想制作一个统一的代码,它将遍历动态多维数组的所有项,而不管数组的维数如何。

我需要这个来确定是否需要递归遍历表示内部维度的数组,或者我是否已经在最内部维度。

我认为我可能需要依赖 RTTI,但我必须承认到目前为止我还没有使用 RTTI 的经验。

【问题讨论】:

  • 无法从变量本身发现这些信息。 stackoverflow.com/a/554185/33732 有关将类型信息传递给处理任意维度数组的函数的示例,请参阅 RTL 的 SetLength 实现。
  • @RobKennedy 不像我最初寻找的那样在 Delphi 6 中,但在以后的 Delphi 版本中它是可能的,正如您在下面的回答中看到的那样。

标签: delphi multidimensional-array rtti delphi-6


【解决方案1】:

我已经找到了解决方案,但它仅在更高版本的 Delphi 中可用(在 Delphi 10 SeattleDelphi 10.1 Berlin 上测试)并且它依赖于未记录的函数GetTypeKind 我偶然发现的。

if GetTypeKind(SomeVariable) = tkArray then //Returns true if variable references to static array

if GetTypeKind(SomeVariable) = tkDynArray then //Returns true if variable references to dynamic array

它甚至可以用于检查内部数组的项目类型

var Dyn2DArray: Array of Array of Integer;

if GetTypeKind(Dyn2DArray[0]) = tkDynArray then //Returns true since item of outmost array is references to inner array

if GetTypeKind(Dyn2DArray[0,0]) = tkDynArray then //Returns false since inner array item is of integer type

【讨论】:

  • 除了简单的TypeInfo(x)^.Kind之外,它还有什么作用吗?它真的可以从你还不知道类型的函数中工作吗?我假设您的真实代码将其输入作为无类型的 var 参数。您上面的演示是您甚至不需要它的情况,因为您只需查看声明即可获得所需的内容。
  • @RobKennedy 我的真实代码将使用这个 GetTypeKind 来确定一个数组项是否是对另一个数组的引用。如果是,那么我将递归调用我的函数,将该数组传递给它。这只是创建一个函数的一个步骤,该函数将遍历多维数组的所有项,而不管该数组有多少维。所以现在我只需要弄清楚如何将多维数组的最外层数组作为参数传递给过程。 ...
  • ... 为此,我在 embarcadero 论坛上提出了一个问题,因为我相信我在那里可能会有更多的运气,因为我没有找到任何通常会定义数组的类型。所以我怀疑只有 Embarcadero 的人知道这样的事情是否可行。
  • 我明白了。我怀疑您会发现 this 问题的解决方案最终没有用,因为GetTypeKind 要求在编译时可用于参数的类型信息,但您的其他问题将产生答案这涉及在编译时没有类型信息。所有接受泛型数组参数的内置函数都使用编译器魔法,因此编译器会自动提供隐藏的类型信息参数。就像我说的,您可以查看SetLength 以了解它是如何工作的。你可以模仿它,但它不会是自动的,也不会被隐藏。
  • @RobKennedy 看看SetLength 怎么样?如果我 CTRL+单击SetLength,我会被扔到系统单元的顶部。如果我在SetLength 设置断点,然后按 F7 代码会跳转到一些我不理解的汇编代码。也许这是因为我只有专业版的 Delphi,因此缺少一些源文件。西雅图和柏林也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2013-03-15
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2016-03-25
相关资源
最近更新 更多