Kyan Pascal:编译器错误“a[t] 右括号上的索引过多”[已关闭]

问题描述 投票:0回答:1

在 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”的开头。

compiler-errors pascal c64
1个回答
-1
投票

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];
,对自己的大小写不敏感。
    

© www.soinside.com 2019 - 2024. All rights reserved.