Turbo Pascal中的动态数组

时间:2017-02-28 21:27:08

标签: pascal dynamic-arrays delphi turbo-pascal

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

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

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

3 个答案:

答案 0 :(得分:5)

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

通常您定义数组类型

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

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

然后定义指针

  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-protected或你使用的Windows)我建议你搜索在线SWAG档案有很多例子。当然,我建议你去FreePascal / Lazarus,你可以做到:

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

并且无需额外的线条就完成了,忘了所有这些废话。

答案 1 :(得分:1)

我正在使用Turbo Pascal 5.5并创建动态数组,也许诀窍是声明一个零维度的数组,如下所示:

dArray = array [0..0] of integer;

然后声明指向该数组的指针:

pArray = ^dArray ;

最后,创建一个指针变量:

ArrayPtr : pArray;

您现在可以按如下方式引用指针变量ArrayPtr

ArrayPtr^[i]; { The index 'i' is of type integer}

请参阅下面的完整示例:

{
  Title: dynarr.pas

  A simple Pascal program demonstrating dynamic array.

  Compiled and tested with Turbo Pascal 5.5.
}

program dynamic_array;


{Main Program starts here}
type
  dArray = array [0..0] of integer;
  pArray = ^dArray ;
var
  i : integer;
  ArrayPtr : pArray;
begin

  for i := 0 to 9 do { In this case, array index starts at 0 instead of 1. }
    ArrayPtr^[i] := i + 1;

  writeln('The Dynamic Array now contains the following:');
  writeln;

  for i := 0 to 9 do
    writeln(ArrayPtr^[i]);

end.

在这个例子中,我们将数组声明为:

array[0..0] of integer;

因此,索引从0开始,如果我们有n个元素,则最后一个元素位于索引n-1,类似于C / C ++中的数组索引。

Regular Pascal数组从1开始,但在这种情况下,它从0开始。

答案 2 :(得分:0)

@Component

只要您的数据适合堆栈,即小于 64 kB,任务就相对简单。我唯一不知道的是 6 位的额外大小去哪里了,但是它们是必需的。