GCSE级delphi

时间:2015-10-10 23:56:08

标签: arrays delphi delphi-7

var
RegNo: array of string;
Speed: array of real;
cars : integer;
time : real;
begin
Setlength(RegNo, 99);
Setlength(Speed, 99);
Writeln ('The speed limit is 50km/h');
Writeln ('The distance between the two points is 50m');
cars := 0;
time := 1;
while time>0
  do
    begin
    cars := cars + 1;
    Writeln ('Enter the car takes to pass the two points');
    Readln (time);
      if time = 0 then
      Writeln
      else
        if time < 1 then
          begin
           Writeln ('Enter the registration plate for the car');
           Readln (RegNo[cars]);
          Speed[cars]:= 50/time;
          end
        else
    end;
Setlength (RegNo, cars);
Setlength (Speed, cars);
Writeln (RegNo[cars]);
Writeln (Speed[cars]:5:2);
Readln;
end.

我不明白我做错了什么。这应该是一个程序来读出使用数组加速的汽车。它表示变量RegNo可能尚未初始化。它表示变量Speed可能尚未初始化。

2 个答案:

答案 0 :(得分:0)

这是因为您第一次在条件if子句中访问这些变量。

因此,如果不满足该条件子句所期望的特定条件,则该代码将永远不会运行。

这就是编译器生成上述警告的原因。

但是你的代码中存在更大的问题。由于您使用的是动态数组,因此需要先使用SetLength(YourArray, NewSize)设置其大小,然后才能存储任何数据。

如果在项目中启用了范围检查,则不这样做会引发EOutOfRange异常。

如果没有启用范围检查(默认情况下),您可以轻松覆盖属于某个其他对象或变量的部分内存,从而对您的程序造成严重破坏。

答案 1 :(得分:0)

我不确定你在哪里使用动态数组的想法显然是初学者的编程任务,因为必须处理内存分配和基于零的数组索引的复杂性有点分散了你所处的任务。

Delphi实现动态数组的主要原因之一是处理直到运行时才知道元素数量的情况(另一个原因是允许编写与a不相关的例程)特定数量的数组元素)。但是,在您的情况下,您不需要使用动态数组的复杂性,它们只是为可避免的错误引入了可能性。

在像这样的练习的传统版本中,人们会使用静态数组:

var
  RegNo: array[1..100] of string;  // assuming you actually want 100 elements
  Speed: array[1..100] of real;

这样做的好处包括

  • 数组可以有直观的下限和上限,而不是0和98:当然,假设你确实打算在你的数组中有99个元素,而不是100个,这就说明了这种情况如果您使用动态数组或基于零的数组,通常当它们不适合您的编程任务时,它很容易制作。

  • 如果数组是全局变量(不是过程或函数的局部变量),你可以毫不费力地使用数组,即在使用它们之前不需要对它们进行内存分配(SetLength)而不是之后需要释放内存。原因是在运行时,全局变量在程序启动时自动用零填充,因此程序以已知状态启动它们。

我同意David Heffernan的观点,即进行范围检查有助于获取超出范围的数组索引,但在这样简单的事情中,最好不要依赖& #34;训练轮&#34;而是习惯于首先让你的数组索引正确。必须在数组的心理模型与数组边界和基于零的数组的索引之间来回跳跃,这可能是最常见的错误来源之一。除非有人故意通过坚持使用零基阵列而故意让你的生活变得困难,否则请使用Pascal允许的自然阵列界限,让自己的生活更轻松。

局部变量在堆栈上分配(并且有一些例外,托管生命周期变量是一些高级主题),因此包含随机值,因此它们应该在使用前初始化,通过执行以下操作:

FillChar(MyArray, SizeOf(MyArray), Chr(0));

有些人可能不同意,但是即使你不需要(比如全局变量)而不是绊倒未经初始化的变量,最好养成初始化变量的习惯。

值得一提的是,数组的界限不需要过分数字化。例如,给定一个枚举

type

  TFruit = (apple, pear, banana);

然后你可以声明一个数组

var
  Calories : array[apple..banana] of real;

这是在Pascal教程中经常看到的一种风格,它早于Delphi,主要归功于它作为一种强类型教学语言的目标。