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 に答える