我正在研究我的学校项目,我想使用动态(非静态)数组。我使用ObjectPascal,所以我习惯了一些语法。但现在我在旧的TurboPascal编程(我正在使用Turbo Pascal 7 for Windows)。
似乎并不知道ObjectPascal,所以我想,Turbo Pascal并不知道动态数组。
如果我的理论是对的,有人能告诉我吗?我试图谷歌,但我没有成功。 基本上我要问" Turbo Pascal 7"中的动态数组怎么样? ? 谢谢你的所有反应。
答案 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 位的额外大小去哪里了,但是它们是必需的。