Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays GCSE级德尔菲 var RegNo:字符串数组; 速度:实数数组; 汽车:整数; 时间:真实; 开始 设置长度(RegNo,99); 设定长度(速度,99); 写入(“限速为50公里/小时”); Writeln(“两点之间的距离为50m”); 汽车:=0; 时间:=1; 当时间>0时 做 开始 汽车:=汽车+1; Writeln(“进入汽车需要通过两点”); Readln(时间); 如果时间=0,则 写 其他的 如果时间_Arrays_Delphi_Delphi 7 - Fatal编程技术网

Arrays GCSE级德尔菲 var RegNo:字符串数组; 速度:实数数组; 汽车:整数; 时间:真实; 开始 设置长度(RegNo,99); 设定长度(速度,99); 写入(“限速为50公里/小时”); Writeln(“两点之间的距离为50m”); 汽车:=0; 时间:=1; 当时间>0时 做 开始 汽车:=汽车+1; Writeln(“进入汽车需要通过两点”); Readln(时间); 如果时间=0,则 写 其他的 如果时间

Arrays GCSE级德尔菲 var RegNo:字符串数组; 速度:实数数组; 汽车:整数; 时间:真实; 开始 设置长度(RegNo,99); 设定长度(速度,99); 写入(“限速为50公里/小时”); Writeln(“两点之间的距离为50m”); 汽车:=0; 时间:=1; 当时间>0时 做 开始 汽车:=汽车+1; Writeln(“进入汽车需要通过两点”); Readln(时间); 如果时间=0,则 写 其他的 如果时间,arrays,delphi,delphi-7,Arrays,Delphi,Delphi 7,我不明白我做错了什么。这应该是一个程序,用数组读出超速的汽车。它表示变量RegNo可能尚未初始化。它表示变量速度可能尚未初始化。这是因为您第一次在条件if子句中访问这些变量 所以,如果不满足条件子句所期望的特定条件,代码将永远不会运行 这就是编译器生成上述警告的原因 但是你的代码有更大的问题。由于您使用的是动态数组,因此需要使用SetLength(yourray,NewSize)设置它们的大小,然后才能将任何数据存储到它们 如果在项目中启用了范围检查,否则将引发范围异常 如果不启用范围检查(默认

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

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

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

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

但是你的代码有更大的问题。由于您使用的是动态数组,因此需要使用
SetLength(yourray,NewSize)
设置它们的大小,然后才能将任何数据存储到它们

如果在项目中启用了范围检查,否则将引发范围异常


如果不启用范围检查(默认情况下),您可能会很容易覆盖属于其他对象或变量的部分内存,从而对您的程序造成严重破坏。

我不确定您是从哪里想到在显然是初学者的编程任务中使用动态数组的,因为必须处理内存分配和基于零的数组索引的复杂性会让您在执行任务时分心

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

在类似这样的练习的传统版本中,可以使用静态数组:

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.
这样做的好处包括

  • 数组可以有直观的上下限,而不是0和98:当然,这是假设你真的打算在数组中包含99个元素,而不是100个元素,这说明了如果你使用动态数组很容易犯这样的错误,或者零基数组,通常在它们不适合您的编程任务时使用

  • 如果数组是全局变量(而不是过程或函数的局部变量),则无需进一步ado即可使用数组,即在使用数组之前无需对其进行内存分配(SetLength),之后无需释放内存。原因是在运行时,全局变量在程序启动时自动填充为零,因此程序以已知状态启动

我同意David Heffernan的评论,即启用范围检查有助于获取超出范围的数组索引,但在这样简单的情况下,最好不要依赖“训练轮”,而是首先习惯于获取正确的数组索引。必须在数组的心智模型和数组边界之间来回跳跃,并且对基于零的数组进行索引,这可能是最常见的错误源之一。除非有人故意让你的生活变得困难,坚持使用零基数组,否则请使用帕斯卡允许的自然数组边界,让你的生活更轻松

局部变量是在堆栈上分配的(除了某些例外,还有一些高级主题中的托管生存期变量),因此包含随机值,因此应在使用前通过执行以下操作对其进行初始化:

var
  RegNo: array[1..100] of string;  // assuming you actually want 100 elements
  Speed: array[1..100] of real;
有些人可能不同意,但在我看来,即使不需要初始化变量(比如全局变量),也要养成初始化变量的习惯,而不是被未初始化的变量绊倒

值得一提的是,数组的边界不需要是明显的数字。例如,给定一个枚举

FillChar(MyArray, SizeOf(MyArray), Chr(0));
然后可以声明一个数组

type

  TFruit = (apple, pear, banana);

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

我已经添加了Setlength,但仍然存在访问冲突错误。我如何将其更改为访问条件if条款之外的变量。您现在何时获得访问冲突错误。也许当您试图输入最后一辆车(第100辆)的信息时?您可以看到动态数组是
零基的
,这意味着数组中的第一项的索引为
0
。但您的代码会将第一辆车的信息写入数组中的第二项。当您试图将数据写入最后一项时,实际上是在试图访问超出数组边界的内存。因此,我建议您启用范围检查。您可能也考虑过使用一个或多个记录,其中每个记录将包含有关每辆车的所有必要信息(速度、车牌)。动态数组使用基于零的索引。您读取的内容超出了数组的末尾。启用范围检查以帮助查找错误。代码中没有说明100就足够了。为什么用户不能输入超过100个项目?至于
FillChar
,对于托管类型来说,这是一个糟糕的建议。@DavidHeffernan:a)在我看来
var
  Calories : array[apple..banana] of real;