pascal - Turbo Pascal 中的动态数组

标签 pascal dynamic-arrays delphi turbo-pascal

我正在开展我的学校项目,我想使用动态(而不是静态)数组。我使用 ObjectPascal,所以我习惯了一些语法。但现在我在旧的 TurboPascal 中编程(我使用的是 Windows 版 Turbo Pascal 7)。

它似乎不知道ObjectPascal,所以我想,你Turbo Pascal不知道动态数组。

谁能告诉我,我的理论是否正确?我尝试用谷歌搜索,但没有成功。 基本上我问的是“Turbo Pascal 7 中的动态数组怎么样”? 感谢您的所有反应。

最佳答案

正如 MartynA 所说,Turbo Pascal 中没有动态数组类型。您需要使用指针手动分配内存,如果使用范围检查,请小心。

通常您定义一个数组类型

TYPE
  TArrayT = array[0.. ((65535-spillbytes) div sizeof(T))-1] of T;

其中,spillbytes 是一个常量,用于进行小额扣除,因为您不能使用整个 64k,请查看编译器接受的内容。 (可能这个推导是针对 64k block 内的堆管理器结构)

然后定义一个指针

  PArrayT= ^TArrayT;

和一个变量

  var 
     P : PArrayT;
      

然后使用 getmem 分配 nrelement 元素;

 getmem(P,SizeOf(T) * nrelements);

并可以选择用零填充它们来初始化它们:

 fillchar(p^,SizeOf(T) * nrelements,#0);

您可以使用以下方式访问元素

 p^[index]

要释放它们,请使用与 getmem 行完全相反的 freemem。

 freemem(P,Sizeof(T)*nrelements);

这意味着您必须将分配的元素数量保存在某处。这个问题已在 Delphi 和 FPC 中得到修复/解决。

另请记住,您无法再通过范围检查找到错误。

如果您想要大于 64k 的数组,这是可能的,但仅限于限制,并且更重要的是确切的 TP 目标(dos、dos 保护或您使用的 Windows)我建议您搜索在线 SWAG 存档有很多例子。当然,我也建议您访问 FreePascal/Lazarus,您可以简单地执行以下操作:

 var x : array of t;
 begin
    setlength(x,1000000);

不用额外的行就可以完成它,忘记所有这些废话。

关于pascal - Turbo Pascal 中的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519050/

相关文章:

arrays - 用 TArray<XXX> 替换 XXX 数组是否安全

c - 在 C 中访问和输入元素到动态结构数组中

delphi - 如何确定 Delphi 对象是否属于特定类而不是任何后代类?

c++ - 挂其他问题?

arrays - 帕斯卡 : Get Length of array[x]

将 typedef 结构从 C 转换为 Pascal

C++ 调整动态数组的大小最多可以处理一定数量的元素,但有时会因错误 (0XC0000005) 而崩溃

delphi - 如何调试或修复 "Module has open descendants or linked modules"错误?

delphi - 替换delphi中的组件类

pascal - 有没有办法确定对对象过程的引用是否对应于 Pascal 中的对象实例?