3
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 this 是主程序,它调用“loadthis”程序。

我不知道出了什么问题,但我收到了这些错误:

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

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

4

1 回答 1

1

您正在尝试将其作为数组索引进行访问,但它必须是函数调用:

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

您可能还应该添加一些范围检查。如果有人放入20文本文件会发生什么?您的数组只有索引1通过的项目7,因此当您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;
于 2012-08-01T23:42:29.323 回答