在 Commodore 64 的 Kyan Pascal 中,我不断收到错误:
a[t] 右括号上的索引过多
...在我的第一个程序的第一行:
For t := 1 to 100 do a[t] := t;
整个节目:
Program sort;
Type btyp = 1 .. 255;
Var a : array [1..100] of integer;
Procedure generatedata;
Var t : btyp;
A,b,r : integer;
Begin
For t:= 1 to 100 do a[t] := t;
For t := 1 to 255 do begin
A := random * 100;
B := random * 100;
R := a[a];
End;
End;
Procedure bubblesort;
Var i,j,k : integer;
Begin
For i := 1 to 99 do begin
for j := i to 100 do begin
If a[i] > a[j] then begin
K := a[i];
A[i] := a[j];
A[j] := k;
End;
End;
End;
End;
Procedure showdata;
Var i : integer;
Begin
For i := 1 to 100 do begin
Write(a[i]:3,' ');
End;
End;
Begin
Write(chr(147));
Generatedata;
Bubblesort;
Showdata;
End.
显然 Kyan Pascal 不支持
byte
类型。至少每次我使用它时,我都会得到:
预期类型标识符
...在单词“byte”的开头。
Kyan Pascal 1.0的手册在“教程 IV:整数和 FOR 循环”(第 34 页,PDF 版本第 110 页)中告诉我们:
尽管可以使用实数变量,但整数最常用于 FOR 循环中。
您尝试在循环中使用的是子范围(“教程 IV:标量变量”,第 60-61 页,PDF 明智的第 136-137 页):
子范围类型是标量类型的一种形式,因为它是一个项目列表。但是,它有所不同,因为您只需指定范围中的第一项和最后一项。显然,如果子范围是名称列表,则必须在标量类型中定义完整列表。子范围可能包含整数,因为计算机将数字列表理解为它使用的整组整数的子范围。 TYPE 子范围的语法是:
TYPE Name = first item .. last item;
以下示例声明说明了标量和子范围类型的使用。 ...最后,定义了整数的子范围。进行类型声明后,变量将被标识为其各自的类型。
TYPE Days = 1..7; VAR DayNum : Days;
无法保证子范围类型变量可以用作
for
循环的序数 - 很可能是因为 Kyan Pascal 实现了 ISO 标准 Pascal(并且不知道任何 Byte
类型)。在任何 Delphi 编译器或 FPC 中,for
循环将接受子范围类型变量,如下所示:
type
btyp= 1.. 255;
var
t: btyp;
begin
for t:= 1 to 100 do Caption:= IntIoStr( t );
但是,我在附录 C 第 1-4 页(PDF 明智的第 285-288 页)中没有找到您所说的编译器错误消息 - 您必须使用更高版本。
ISO Pascal 区分大小写:无法同时声明 a
和
A
。
Var a : array [1..100] of integer;
Procedure generatedata;
Var A : integer;
Begin
For t:= 1 to 100 do a[t] := t;
此时您想要访问
a
,但有效地访问
A
- 并且该变量根本不支持索引 - 因此会出现编译器错误。一般来说,变量应该有有意义的名称,因此 a
的更好名称可能是 unsorted
,而 A
更好的名称可能是 rand1
- 这样可以立即避免这种错误。不是“该死的编译器太挑剔了”——你在命名变量方面有点懒。 你的整个程序遭受更多逻辑错误:
R := a[a];
没有意义,在
Procedure bubblesort
中你甚至会做A[i] := a[j];
,对自己的大小写不敏感。