Turbo Pascal中的动态数组

Pal*_*rom 2 delphi pascal dynamic-arrays turbo-pascal

我正在研究我的学校项目,我想使用动态(非静态)数组.我使用ObjectPascal,所以我习惯了一些语法.但现在我在旧的TurboPascal编程(我正在使用Turbo Pascal 7 for Windows).

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

如果我的理论是正确与否,有人能告诉我吗?我试图谷歌,但我没有成功.基本上我问"Turbo Pascal 7中的动态数组怎么样?" 谢谢你的所有反应.

Mar*_*ort 5

正如MartynA所说,Turbo Pascal中没有动态数组类型.您需要使用指针手动分配内存,并且在使用rangechecks时要小心.

通常,您定义数组类型

TYPE
  TArrayT = array[0.. ((65535-spillbytes) div sizeof(T))-1] of T;
Run Code Online (Sandbox Code Playgroud)

其中spillbytes是一个小的演绎常量,因为你不能使用整个64k,看看编译器接受什么.

然后定义一个指针

  PArrayT= ^TArrayT;
Run Code Online (Sandbox Code Playgroud)

和它的变量

  var 
     P : PArrayT;
Run Code Online (Sandbox Code Playgroud)

并使用getmem分配nrelement元素;

 getmem(P,SizeOf(T) * nrelements);
Run Code Online (Sandbox Code Playgroud)

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

 fillchar(p^,SizeOf(T) * nrelements,#0);
Run Code Online (Sandbox Code Playgroud)

您可以使用访问元素

 p^[index]
Run Code Online (Sandbox Code Playgroud)

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

 freemem(P,Sizeof(T)*nrelements);
Run Code Online (Sandbox Code Playgroud)

这意味着你必须在某处保存分配的元素数量.这是在Delphi和FPC中修复/解决的.

另请注意,您无法再找到带有范围检查的错误.

如果你想要大于64k的数组,这是可能的,但只有约束,更重要的是TP目标(dos,dos-protected或你使用的Windows)我建议你搜索有很多例子的在线SWAG档案.当然,我建议你去FreePascal/Lazarus,你可以做到:

 var x : array of t;
 begin
    setlength(x,1000000);
Run Code Online (Sandbox Code Playgroud)

并且没有额外的线条就可以完成它而忘记所有这些废话.