找不到数组声明有什么问题

时间:2019-03-23 13:00:53

标签: pascal

它说

  

致命:语法错误,预期为OF,但是[找到]变量“ lo”

但是我真的看不出有什么问题。
我试图更改变量名,但似乎不起作用。

procedure reg(     index, gen : char; 
                   fname, sname, loginname, passwords, pid : string; 
               var lo : array [1..26,1..1025] of bucket ; 
               var main : array[1..1025] of detail);
var
  convertedindex, i, j : integer;
  found, found2 : boolean;

应该没有错误,但是显示语法错误。

3 个答案:

答案 0 :(得分:3)

在声明过程(或函数)参数时,无法定义数组。您需要预先通过执行以下操作来定义数组类型:

program arraydecl;

type
  Bucket = integer;
  Detail = integer;

type
  BucketArray = array [1..26,1..1025] of Bucket;
  DetailArray = array[1..1025] of Detail;

procedure reg(index, gen : char; fname, sname, loginname, passwords, pid : string ; var lo :  BucketArray; var main : DetailArray);
begin
end; 

答案 1 :(得分:2)

该错误消息表明编译器期望使用关键字of,但是却找到了一个括号[

原因是(我猜)在过程声明中,您无法定义数组的边界。例如,您不能说main: array[1..2] of integer,只能说main: array of integer

您可以尝试定义数组类型,然后将该类型用作过程参数:

type TwoInts = array[1..2] of integer;

procedure PrintTwoInts(ti: TwoInts)
begin
  WriteLn(ti[1], ti[2])
end;

我很久没有用Pascal编程了,所以以上内容可能有效,也可能无效。我不记得ti是按值传递还是按引用传递,并且过程内的数组索引是否总是从0开始。这是您需要了解的一些事情。

答案 2 :(得分:2)

参数列表

某些 Pascal版本中,例如 FreePascal Delphi ,函数或过程的参数列表不能包含类型声明 >,仅输入规范

因此,要指定这样的数组作为参数,必须在函数/过程声明之前首先声明其类型:

type 
  // Type declarations
  Bucket = ... 
  Detail = ...
  TBuckets = array[1..26, 1..1025] of Bucket;
  TDetails = array[1..1025] of Detail;

procedure Reg(Index, Gen: Char; FName, SName, LoginName, Passwords, PID: string; 
  var Lo: TBuckets; var Main: TDetails);

请注意,即使在参数列表中,其他Pascal(包括ISO Pascal,如果我没记错的话)也确实允许这些即席声明。但是显然您的Pascal方言却没有。

打开数组参数

现在,如果看到诸如x: array of Integer之类的参数规范,则说明正在处理开放数组参数。这不是声明,也不指定一个单一类型,它接受该基本类型的所有一维数组。在我的文章Open array parameters and array of const中有更多相关内容。

这解释了错误消息:参数列表中只有of可以跟随array来指定开放数组参数。


其价值:如果您使用FreePascal或Delphi,则应该养成将字符串作为const传递的习惯,如果可能的话:const FName, SName, etc...: string