什么是一致的数组?

时间:2011-12-12 23:16:02

标签: arrays pascal

我正在试图弄清楚一致的数组是什么,但我无法在任何地方找到一个好的定义。任何人都可以解释这是什么,给我一个基本的例子,它们的目的是什么?

由于

4 个答案:

答案 0 :(得分:13)

所以这是一个非常古老的问题,但它在搜索结果的早期出现,所以让我给出正确答案。

Conformant Array不是一个动态数组,可以调整自身大小以适应数据,例如Java的List类。它是一种允许Pascal过程和函数与可变大小数组一起工作的机制。

在Pascal中,数组的大小是其类型的一部分,因此在:

VAR
    MyArray1 : ARRAY [1..10] OF INTEGER;
    MyArray2 : ARRAY [1..20] OF INTEGER;

MyArray1MyArray2属于两种不同类型并且不兼容。

这成为经典Pascal中的过程/函数的问题:因为过程的形式参数必须具有特定类型,并且因为数组的长度是其类型的一部分,所以通常不可能定义一个适用于任意长度数组的过程/函数。

Conformant Arrays是作为ISO标准Pascal的一部分引入的,通过允许使用符合数组"定义过程/函数来解决此问题。作为参数,像这样:

PROCEDURE MyProc(VAR x : ARRAY [low..high : INTEGER] OF INTEGER;

这定义了具有三个形式参数的过程MyProcxlowhigh(即传递了三个参数任意名称)。调用过程时,x设置为指向数组的指针,low是设置为数组下限的整数变量,high是设置为数组的整数变量数组的上限。

此机制允许数组边界以类型安全的方式与数组一起传递,并允许过程使用任意大小的数组。它是由ISO标准Pascal定义的一个特性,但其他Pascals(例如Extended Pascal和Borland Pascal)提出了不同的机制来处理这个问题(例如,扩展Pascal的类型模式,它更丰富和更多复杂)。

答案 1 :(得分:1)

符合数组的数组具有未定义的大小,并且会拉伸或缩小以适合其数据。

一个例子是Java中的List

如果您需要更多信息,Google搜索会为您提供大量结果。

答案 2 :(得分:1)

这是一个更老的问题(现在),但当我用Google搜索&#34时,它是第一个答案;什么是符合条件的数组"。在Windows上,就IDL和使用IDL(C& C ++)的语言而言,定义为here

引用文章:"数组被称为"符合"如果在运行时确定任何维度的上限。 (只能在运行时确定上限。)"

答案 3 :(得分:0)

一致数组是安全编程语言的功能。 Pascal和C出现在几乎同一年。在C中,数组与指针的区别不大,因此在C中传递大小未知的数组实际上是将指针传递给数组的开头和长度参数。

Pascal是提出索引检查的第一种语言。但是由于类型不匹配,过程和函数无法再以这种方式处理大小不同的数组。 C不安全的数组参数处理方式与安全的编程语言设计不兼容。因此介绍了一致性数组参数类型的参数。它只能是形式参数类型,不能出现在其他任何地方。

ISO Pascal 83可能不再使用,但是在Pascal派生中可以看到相同的方法。 Open arrays是Delphi 4、5或更高版本中引入的功能。以前,Turbo Pascal具有一个称为开放字符串的功能,但这是另一项需求的功能,并且需求更为有限。例如,在开放数组中,长度作为隐式参数传递,在开放字符串中,长度存储在字符串的第一个字节中,而隐式参数用于传达最大可能长度。

此功能启用安全的阵列访问。 function or procedure accepting an open array可以传递任意大小的固定数组,动态数组或开放数组(从另一个调用者获得),也可以传递其中的slice或{{3} }。不幸的是,Delphi工程师对安全编程的重视程度不高,因此Delphi并未在市场上销售,也不被广泛称为安全编程语言。默认情况下不启用索引和范围检查。一致性阵列并未作为一种快速而安全的编程的杀手级功能在市场上销售。 open array constructorSystem.Slice不同,它没有采用Index参数,因此只能使用内在函数从数组的开头引用子数组。在更大数组的任何部分中引用子数组的开始和结束都没有技术限制,可以解决此限制,但是修复System.Slice将是一个更合理的解决方案。这应该很简单,但是多年来似乎没有人可以使用Delphi的安全编程功能。

ISO Pascal的一致性数组是可选功能。 Ada源自Pascal,但在Ada中有一个更强大的功能称为System.Copy,并且此功能是必需的。 Ada可能是与一致性数组一起使用的最有趣的语言。它是一种安全的编程语言,应该是系统编程的默认语言,但是不幸的是,人们对此意识不足,因此发明了丑陋的笨蛋,将其迁移到Ada就足够了。不需要iMPX,不需要SGX,Ada就足够了。

在Ada中,无约束数组是unconstrained arrays的特例。 indefinite types是不受约束的数组和不确定类型的一个很好的示例,也称为固定字符串。 String的实例可以是任何长度。分配的实例是可变的,但约束是固定的。这样,接受String参数的过程或函数将有效地接受任何大小的字符串。请注意,在Ada中,无约束数组可以(并且必须)具有类型名称。 ISO Pascal中的一致数组和Delphi中的开放数组只能作为函数参数形式类型出现,因此不能出现在Standard.String中,因此不能有名称。

几乎在任何地方都可以使用Ada中的不确定类型。它们可以用作形式参数,就像遵循一致数组和开放数组一样。可以从任何索引开始传递type declaration。变量和常量可以是不确定的类型,但是slice of array。与Delphi不同,在Ada中,不仅可以初始化全局变量和常量,还可以初始化局部变量和常量。另外,可以they must be initialized to make constraints definite at runtime。实际上,在Delphi中,聚合仅在use expressions to initialize itemsdeclared constants中被允许,而在Ada open array constructors中则是表达式的特殊情况,与其他表达式没有区别,可在其他上下文中使用,并且当变量或用聚合初始化常量,这是用表达式初始化的一种特殊情况。在Ada中,不确定变量和常量是在堆栈上分配的,类似于非标准的alloca()C扩展名和C99 aggregates

Ada中允许使用不定类型作为返回类型。无法为未知大小的结果在主堆栈上预分配空间。当主堆栈已经堆满了参数和局部变量时,它不适合返回结果。在这种情况下,其他编程语言会转而使用堆。 Ada编译器(至少已知GNAT和Ada​​Magic会执行)优化:它们使用辅助堆栈。分配和解除分配的速度与主数据库一样快,但是那里没有大量的参数和局部变量。例如,variable-length arrays函数就是这种方式。

此外,与Delphi相比,Ada具有指向不确定类型的指针(访问类型)。到目前为止,不定类型几乎可以出现在任何地方,与其他更频繁依赖堆的编程语言相比,Ada编译器知道如何编排主堆栈和次堆栈以获得最高性能。当然,记录内的项目不能有任意大小,记录内的所有项目都必须是确定的,但是Ada.Text_IO.Get_Line。据我所知,Ada设法用本机编程语言使尽可能多的一等公民作为不确定的类型值。有趣的是,看到一个过程,其中对安全性的追求越高,编程语言必须具备的表达能力越强,才能表达所有可能被证明是安全的技巧。

除了Pascal派生词外,还有几种非Pascal语言值得一提。不幸的是,支持这些语言的人们要么不希望看到Pascal及其派生类,以使他们的编程语言在剩下的东西面前大放异彩。或者,他们对编程语言工程师所无法接受的程度一无所知。 CPU设计最终导致了与ISO Pascal,Delphi,Ada中相同的设计解决方案,但它们提出的“发现”与Pascal或其衍生产品无关。

例如,ISO C ++将获得一致的数组。 constraints can be specified using type discriminants介绍了GSL具有所谓的“ span”非所有者容器的情况。过程和函数可以接受span模板,并且这种方式可以接受数组或向量。与Ada不同,“跨度”始终是无主的。仅拥有数组和向量。就像我说的那样,这些人非常容易遭受“此处未发明”的综合症,因此,如果您查看C++ Core Guidelines,您会看到“…C ++…”,“…C ++…”,“…C ++…”, “……C ++……”,……一直到最底层。他们表现得像宗派。如果他们知道,那么这意味着他们的行为是不道德的,并且他们以某种方式说服了足够多的人不要引用与Pascal,Delphi或Ada有关的任何内容。或者,也许他们是出于真正无法接受的无意识,并且是对Pascal的真正改造。这样的意识不佳的人应该做多年的功课才能被允许设计编程语言,但是在我们这个疯狂的世界中,事情以某种方式发生了。

Rust被定位为一种安全的编程语言。预计将与另一种安全的编程语言进行比较,其中Ada是最可见的编程语言,用于生活中至关重要的飞机和地铁。在学术界,研究人员必须将“以前的工作”作为其研究报告的一部分,因此,以这种方式定位的编程语言应与“先前的工作”部分中的Ada进行比较,但是Rust工程师要么与C ++属于同一领域。工程师,其宗教信仰禁止他们提及Pascal,Delphi或Ada;或尽管探索了几乎相同的研究领域,但他们不知何故偶然也对Ada毫无意识。不提及Delphi和Ada会使他们更容易推广自己的编程语言Rust,因为这样他们就可以与C和C ++进行比较,而C和C ++正是不安全批评家的不二之选,而Ada对于这种年轻的语言来说可能是一个太强的竞争对手。好吧,似乎他们的宗派计划效果很好,因为有很多人希望将安全性转移到Rust而不是Ada,而不是以某种方式不了解Ada。

无论如何,最后,Rust中也存在相同的功能。 Rust中的类型不能有大小标记,并且有bibliography。 Rust数组和数组切片比Delphi中的功能更强大,并且大多与Ada数组接近。但是与Ada不同,array slices as built-in type。 Rust函数必须显式使用慢速堆。

我可以根据它们对一致性数组支持级别的要求来订购经过审查的编程语言:Ada,Rust,Delphi,C ++。那应该是对编程语言中一致数组和相关特征情况的全面回顾。