从过程调用函数时出现pascal非法限定符错误

时间:2012-08-01 23:35:00

标签: arrays function pascal procedure

function classes(o:integer): String;
var allclasses : array[1..7] of String;
begin
    allclasses[1]:= 'class1';
    allclasses[2]:= 'class2';
    allclasses[3]:= 'class3';
    allclasses[4]:= 'class4';
    allclasses[5]:= 'class5';
    allclasses[6]:= 'class6';
    allclasses[7]:= 'class7';
    classes := allclasses[o];
end;

上面你可以看到一个函数,它应该接收一个整数并给出存储在数组中的字符串结果。

procedure loadthis(chosen : string);
var f: text;
    i : integer;
begin
    Assign(f, 'files\'+chosen+'.txt');
    Reset(f);
    ReadLn(f, i);
    MyChar.clas := classes[i];
end;

调用此过程时,它会调用“类”函数。请注意,Mychar是一个全局变量。

begin
    loadthis(FileName);
    ReadLn;
    Readln
end.

Ant这是主程序,它调用“loadthis”程序。

我不知道什么是错的,但我收到了这些错误:

  • 指定的参数数量错误
  • 非法限定词

这两个错误来自这一行:     MyChar.clas := classes[i];。我真的不知道出了什么问题,也许我无法通过程序调用函数?请帮忙。

1 个答案:

答案 0 :(得分:1)

您尝试将其作为数组索引访问,但它需要是一个函数调用:

MyChar.clas := classes(i);  { note () instead of [] }

您也应该添加一些范围检查。如果有人将20放入文本文件,会发生什么?您的数组只包含索引17的项目,因此当您使用超出范围值调用classes(20)时,您将收到运行时错误。

(您可能会使用allclasses的常量数组来减少您的代码,但您的教师可能还没有那么远。)

鉴于你对没有教练的评论,这里有一个关于更好的方法来处理这个功能的建议:

function classes(o:integer): String;
const
  allclasses: array[1..7] of string = ('class1', 
                                       'class2',
                                       'class3',
                                       'class4',
                                       'class5',
                                       'class6',
                                       'class7');
begin
  {
    Low() returns the lowest index of the array, and
    High() returns the highest. The if statement makes sure
    that o is between them. It is the range check I mentioned.
  }
  if (o >= Low(allclasses)) and (o <= High(allclasses)) then
    classes := allclasses[o]
  else
    classes := '';
end;