涡轮帕斯卡的动态阵列



我正在研究我的学校项目,我想使用动态(而不是静态)数组。我与Objectpascal合作,所以我习惯了一些语法。但是现在我正在旧的Turbopascal进行编程(我正在使用Windows Turbo Pascal 7)。

它似乎不知道objectpascal,所以我想,您的Turbo Pascal不知道动态阵列。

有人可以告诉我,如果我的理论是对的?我尝试使用Google,但我没有成功。基本上,我问:"在Turbo Pascal 7中使用动态阵列如何?谢谢您的所有反应。

正如Martyna所说,涡轮Pascal中没有动态阵列类型。您需要使用指针手动分配内存,如果使用rangechecks,请小心。

通常您定义数组类型

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

,溢出的质量是较小的扣除量,因为您无法使用整个64K,请查看编译器接受的内容。(可能是针对64K块内部的HeapManager结构)

然后定义指针

  PArrayT= ^TArrayT;

和一个变量

  var 
     P : PArrayT;
      

您使用getMem;

分配nrelement元素
 getmem(P,SizeOf(T) * nrelements);

并选择将它们填充为零以初始化它们:

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

您可以使用

访问元素
 p^[index]

要释放它们,请使用freemem使用getMem线的完全相反。

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

这意味着您必须保存某处分配的元素数量。这是在Delphi和FPC中固定/解决的。

还请记住,您再也找不到带有山地检查的错误了。

如果您想要大于64K的数组,那是可能的,但仅具有约束,并且更重要的是,哪个确切的TP目标(DOS,DOS保护或使用您使用的Windows),我建议您搜索该在线赃物档案馆有很多例子。当然,我也建议您也可以去Freepascal/Lazarus,您可以简单地做:

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

可以在没有其他线路的情况下完成它,而忘记了所有这些胡说八道。

我正在使用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 中的数组索引。

常规的pascal阵列从1开始,但在这种情况下,它从0。

开始
unit Vector;
interface
const MaxVector = 8000;
  // 64 k div SizeOf(float); number of float-values that fit in 64 K of stack
  VectorError: boolean = False;
// toggle if error occurs. Calling routine can handle or abort

type
  VectorStruc = record
    Length: word;
    Data: array [1..MaxVector] of float;
  end;
  VectorTyp = ^VectorStruc;
procedure CreateVector(var Vec: VectorTyp; Length: word; Value: float);
{ Generates a vector of length Length and sets all elements to Value }
procedure DestroyVector(var Vec: VectorTyp);
{ release memory occupied by vector }
procedure SetVectorElement(var Vec: VectorTyp; n: word; c: float);
function GetVectorElement(const Vec: VectorTyp; n: word): float;
implementation
var ch: char;
function WriteErrorMessage(Text: string): char;
begin
  Write(Text);
  Read(WriteErrorMessage);
  VectorError := True;         // toggle the error marker
end;
procedure CreateVector(var Vec: VectorTyp; Length: word; Value: float);
var
  i: word;
begin
  try
    GetMem(Vec, Length * SizeOf(float) + SizeOf(word) + 6);
  except
    ch := WriteErrorMessage(' Not enough memory to create vector');
    exit;
  end;
  Vec^.Length := Length;
  for i := 1 to Length do
    Vec^.Data[i] := Value;
end;
procedure DestroyVector(var Vec: VectorTyp);
var
  x: word;
begin
  x := Vec^.Length * SizeOf(float) + SizeOf(word) + 6;
  FreeMem(Vec, x);
end;
function VectorLength(const Vec: VectorTyp): word;
begin
  VectorLength := Vec^.Length;
end;
function GetVectorElement(const Vec: VectorTyp; n: word): float;
var
  s1, s2: string;
begin
  if (n <= VectorLength(Vec))  then
    GetVectorElement := Vec^.Data[n]
  else
  begin
    Str(n: 4, s1);
    Str(VectorLength(Vec): 4, s2);
    ch := WriteErrorMessage(' Attempt to read non-existent vector element No ' +
      s1 + ' of ' + s2);
  end;
end;

procedure SetVectorElement(var Vec: VectorTyp; n: word; C: float);
begin
  if (n <= VectorLength(Vec))  then
    Vec^.Data[n] := C
  else
    ch := WriteErrorMessage(' Attempt to write to non-existent vector element');
end;
end.  

只要您的数据适合堆栈,即小于64 kb,任务相对简单。我唯一不知道的是六位额外尺寸的去向,但是它们是必需的。

相关内容

  • 没有找到相关文章

最新更新