2012-08-01 23 views
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; 

上面你可以看到一個函數,它應該接收一個整數並給出存儲在數組中的字符串結果。從程序調用函數時,pascal非法限定符錯誤

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. 

螞蟻這是主程序,它調用「loadthis」過程。

我不知道什麼是錯的,但我得到這些錯誤:

  • 量的參數錯誤指定
  • 非法預選賽

這兩個錯誤都來自這條線: MyChar.clas := classes[i];。我真的不知道什麼是錯的,也許我不能從程序中調用函數?請幫忙。

回答

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; 
+0

哦,我的天哪,非常感謝!我不知道爲什麼我以前沒有想過這個。我沒有一個教練,自己學習。 – St0ne 2012-08-01 23:53:36