一、二部分 暫缺
三、TP和 FP的功能區別
1.Free Pascal理論上可以使用4GB(2^32byte)的記憶體,因此實際上幾乎可以使用系統中的所有剩餘記憶體(除非賽題中有記憶體限制),這是因為Free Pascal使用的是32位的編譯器。
但是對於Turbo Pascal來說,由於是16位的編譯器,因此不能定義大小超過64KB(2^16byte)的資料類型和變數,並且在DOS實模式下可以使用的記憶體總數只有640KB。
但這並不是說,你可以隨意定義很大的數組了,因為光讀入200MB的資料就會讓你的程式逾時了(因為現在的7200轉硬碟和133的系統匯流排速度決定了讀取資料的速度也就100MB/秒)。
2.在Free Pascal中,如果用assign給標準輸入輸出檔案變數input和output指定了檔案,在程式結束之前一定要用close關閉input和output,否則輸出檔案可能不能被正確的寫入。
這個問題是近幾年NOIP競賽和省隊訓練、選拔中選手常犯的錯誤。尤其是程式非正常結束之前(如halt)會忘記。
3.如果用Rewrite開啟檔案,那麼檔案就只能被寫入了。如果需要讀取這個檔案,要對檔案執行Reset。所以,在Free Pascal中最好不要對一個檔案同時進行讀寫操作。
4.在Free Pascal中,集合中的元素都是4個位元組長的。
5.運算式執行的順序是不確定的。比如對於運算式a:=g(2)+f(3); 不保證g(2)一定在f(3)之前執行。
6.函數和過程在使用時,參數的類型必須和定義時完全一致。原因是在Free Pascal中添加了函數重載功能。
7.PROTECTED,PUBLIC,PUBLISHED,TRY,FINALLY,EXCEPT,RAISE成為了關鍵字,因此不能作為函數和過程的名字;而FAR,NEAR不再是關鍵字了,原因是Free Pascal是32位系統,不再需要這些關鍵字。
四、FP的新增功能
1. 函數可以返回複雜的類型,比如記錄和數組。
如:
type arrtype=array[1..100] of longint;{必須要先定義數組基底類型,否則紅色部分不合法}
var i,j,k,n:longint;
a:arrtype;
function sort(a:arrtype;n:longint):arrtype;
var i,j,k:longint;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a>a[j] then
begin
k:=a;
a:=a[j];
a[j]:=k;
end;
sort:=a;
end;
begin
read(n);
for i:=1 to n do read(a);
a:=sort(a,n);
for i:=1 to n do write(a,' ');
writeln;
end.
2.在函數中,函數的傳回值可以作為一個變數來處理。
比如:
function a : longint;
begin
a:=12;
while a>4 do
begin
{...}
end;
end;
這個例子在Turbo Pascal中,a>4會被認為是函數的遞迴調用,但是在Free Pascal中會認為a只是一個變數。如果想在Free Pascal中實現遞迴調用,就要寫成下面的形式:
function a : longint;
begin
a:=12;
if a()>4 then { 遞迴調用 }
begin
{...}
end;
end;
3.exit可以接受一個參數作為函數的傳回值。
比如:
function a : longint;
begin
a:=12;
if a>4 then
begin
exit(a*67); { 函數的傳回值就是a*67 }
end;
end;
4.Free Pascal支援函數重載。可以用相同的名字定義不同的函數,只要這些函數的參數不同,就是不同的函數。
比如:
procedure DoSomething (a : longint);
begin
{...}
end;
procedure DoSomething (a : real);
begin
{...}
end;
可以使用不同的參數類型longint或者real來調用不同的DoSomething過程。
由於這個功能,函數的提前聲明必須有完整的參數聲明:
procedure x (v : longint); forward;
{...}
procedure x; {這裡已定義流程x重載了前面聲明的過程x。因此的兩個x是不同的}
begin
{...}
end;
5.Free Pascal容許運算子多載。比如,可以自己為矩陣運算定義一個“+”運算。
格式: operator 運算子 (運算數) 結果
例: operator +(x:datatype; y:datatype) z:datatype;
begin
{……}
end;
6. Turbo Pascal中定義了十六進位數的表示方法,即在十六進位數前添加符號$,
如:
X:=$F0A;
Writeln(‘X=’,x);
輸出結果是X=3850。
這種進位數的表述給編程者帶來很多便捷,而Free Pascal擴容了此優點,除十六進位數外,位元也有類似的表述(添加符號%)
如:
X:=%101;
Writeln(‘X=’,x);
輸出結果是X=5。
7.Turbo Pascal中注釋部分可用(*comment*)或者{comment}表示,
如:
Var I:integer;
Begin
(*for I:=1 to 100 do
write(i);*)
writeln(‘$’);
End.
或者:
Var I:integer;
Begin
{for I:=1 to 100 do
write(i)}
writeln(‘$’);
End.
Free Pascal除前面兩種表述方法外,//comment也可以,但其中comment必須在同一行內,
如:
將3、4行都括為注釋部分:
Var I:integer;
Begin
//for I:=1 to 100 do
// write(i);
writeln(‘$’);
End.
只將第3行括為注釋部分:
Var I:integer;
Begin
//for I:=1 to 100 do
write(i);
writeln(‘$’);
End.
8.在Free Pascal中,編譯時間使用 Fpc –Op3 *.pas (針對 PⅡ以上的處理器進行了最佳化)。但實際比賽一般沒有什麼用(區別不大)。
9.利用指標實現動態開闢數組
var a:^longint;
n,i:longint;
begin
readln(n);
getmem(a,sizeof(longint)*n);
for I:=1 to n do a:=I;
freemem(a);
end.
實際很少用,因為一般NOIP的比賽對空間沒有限制,在程式開始時總是把數組定義的足夠大。
10.強制類型轉換
格式:資料類型(資料)
例如:
var
m:longint;
n:extended;
begin
m:=123456;
n:=extended(m);
writeln(n:0:6);
end.
注意:並不是任意兩個基礎資料型別 (Elementary Data Type)之間都能進行強制轉換。一般來說,fp允許兩個整型之間的強制轉換(實際意義不大,因為在賦值時fp會自動進行整型之間的類型轉換),但需注意資料範圍,例如,把p定義為integer,語句p:=integer(123456)雖然編譯可以通過,但執行過程中p會溢出。fp也允許整型轉換為實型,但有可能帶來精度誤差。至於實型轉整型,需要滿足整型所佔位元組數不小於實型,如double佔8個位元組,因此只能轉換為int64。但實型轉換為整型後,結果往往是錯誤的。把字元轉換成整型,得到的是字元的Ascii碼值,例如,writeln(longint('a'))輸出的結果是97。
11.乘方x^y可以表示成x**y。
注意:
A、在x是實數但y是整數的時候是不能這樣表示,其他都可以,但精度可能不符合要求。
B、x**y的結果如果是整型,不能超過longint的範圍;如果是實型,不能超過extended的範圍。
一般還是用換底公式(exp(y*ln(x)))來計算x^y。
12.布林運算式不一定要全部進行計算。只要最終結果已經能夠確定,FP就不再計算其它還沒有計算的部分。
比如布林運算式exp1 AND exp2 AND exp3,如果已知exp1的結果是false,那麼整個運算式的結果肯定是false,FP對exp2和exp3就不會再進行計算。
五、FP新增資料類型
1.整型
名稱 類型 表示範圍 佔用位元組
Int64 整數類型 -9223372036854775808 ~ 9223372036854775807=2 -1 8
Qword Int64的不帶正負號的整數類型 0 ~ 18446744073709551615=2 -1 8
Cardinal Longint(-2147483648~2147483647)的無符號長整型 0 ~ 4294967295=2 -1 4
Smallint 幾乎等同於類型Integer(-32768~32767) -32768 ~ 32767=2 -1 2
注意:int64不是有序類型,所以不能作為for迴圈的迴圈變數,如:
var i:int64;
begin
for I:=1 to 100 do writeln(i);
end.
編譯不能通過,但word類型(integer類型的不帶正負號的整數類型,0~65535)可以。
另外,直接給一個int64類型的變數賦值一個超過longint範圍的整數是不合法的,例如:定義a為int64類型,有如下語句:a:=8000000000; 編譯就通不過。類似的,以下三條語句也通不過編譯:
a:=2*4000000000;
a:=800000*10000;
a:=a*8000000000;
這是因為fp在運算式的計算過程中用來儲存整數的最大預設類型為longint,而不是int64。
當運算式的中間值超過longint時,fp會用實型來儲存中間值,而實型是不能直接賦給整型的。
解決方案:
分成兩步賦值,先執行 a:=1;然後執行a:=a*800000*10000;
需要強調的是,第二步賦值中一定要把8000000000拆成若干個不超過longint型的整數的和或乘積。
如嫌上述方法麻煩,還可以利用截尾函數trunc,代碼如下:
var
tmp:double;
a:int64;
begin
tmp:=8000000000;
a:=trunc(tmp);
end.
2.實型
FP中的雙精確度實數類型Double,比TP中的Real精確度更高。
名稱 類型 表示範圍 佔用位元組 精度
Real 實數類型 3.4e38 處理器是16位的,則佔4個位元組,即Single類型;如果是32位的處理器,則佔8個位元組,此時範圍和精度都與double一樣 7-8位有效數字
Double 實數類型 1.7e308 8 15-16位有效數字
extended 實數類型 1.1e4932 10 19-20位有效數字
3.允許使用者按以下方式定義枚舉類型:
Type
EnumerateType=(Int,Long,Double:=100,Bool,……);
這是類似於C的定義方式,定義使得Double的值是100,而並非2;Bool的值為101,而並非3……以此類推。但Int和Long的值仍為0和1。
六、FP新增單元和函數
1、過程和函數
①過程fillbyte
聲明部分:Procedure FillByte(var X;Count:longint;Value:byte);
作用:用來給頭地址為X的一段連續記憶體空間賦值,共附Count次,每次賦一個單位元組無符號整型數Value。通常用fillbyte來給元素類型為byte的數組賦初值。例如:
var
a:array[1..10] of byte;
i:longint;
begin
fillbyte(a,sizeof(a),255);
for i:=1 to 10 do write(a,' ');
writeln;
end.
輸出:255 255 255 255 255 255 255 255 255 255
其中,函數sizeof(a)可以求出a數組佔用的位元組數。
②過程fillchar
聲明部分:Procedure Fillchar (Var X;Count : Longint;Value : char or byte);
作用:和fillbyte功能相同。
③過程fillword
聲明部分:Procedure Fillword (Var X;Count : Longint;Value : Word);
作用:和fillbyte相仿,也是給頭地址為X的一段連續空間賦值,附Count次,但每次賦的是一個值為Value的雙位元組不帶正負號的整數(word類型),所以每2個位元組賦一次值,而fillbyte是每一個位元組就賦一次值。
例:
Var
a:array[1..10] of word;
i:longint;
Begin
fillword(a,sizeof(a) div 2,32767);
for i:=1 to 10 do write(a,' ');
writeln;
End.
④過程filldword
聲明部分:Procedure FillDWord (Var X;Count : Longint;Value : DWord);
作用:與fillbyte相仿。Dword意思是佔用4個位元組的整型,具體來講可以是常用的longint類型。
例:
Var
a:array[1..10] of longint;
i:longint;
Begin
filldword(a,sizeof(a) div 4,2147483647);
for i:=1 to 10 do write(a,' ');
writeln;
End.
⑤數組比較函數comparebyte ;
函式宣告:function CompareByte(var buf1,buf2;len:longint):longint;
逐位元組地比較兩段連續空間的前len個資料,兩段空間首地址分別為buf1和buf2。如果都相同,就返回0。如果在第k個資料上首次出現不同,則返回buf1中第k個資料減去buf2中第k個資料的差。通常用來比較兩個數組。類似地,comparechar是逐字元地比較,compareword是兩個位元組兩個位元組地比較,comparedword是4個位元組4個位元組地比較。注意慎用comparedword,它取數比較時只取每4位元組的後2位元組,因此當數組中存在大於65535的整數時,返回結果有可能出錯。例如a[1]=65537,b[1]=1,因為65537和1的二進位後16位是一樣的,所以comparedword(a,b,1)會返回0。
2、新增單元:sysutils,以下功能要用到此單元。
① 掐時:在NOIP競賽中,禁止使用meml掐時,可以用其它方法,如以下是學生以前的掐時方法:
var
t0,t1:real;
begin
t0:=meml[$40:$6c];
……
t1:=meml[$40:$6c];
if (t1-t0)/18.2>3 then {時限3秒}
begin
……
break;
end;
end.
改成:
uses sysutils;
var
t1:tdatetime;
i,j,k:longint;
begin
t1:=now;
while true do
begin
if (now-t1)*86400>3 then
begin
……
break;
end;
end;
end.
② 知道年月日,求星期。
uses sysutils;
function getday(year,month,day:word):word;
var t:tdatetime;
begin
T:=encodedate(year,month,day);
Getday:=dayofweek(t);
End;
begin
writeln(getday(2005,4,20));
end.
其中year表示年號,month表示月份,day表示日期。輸出1表示Sunday,2表示Monday,以此類推。
② 擷取今天的日期
uses sysutils;
var year,month,day:word;
procedure getdate(var year,month,day:word);
var t:tdatetime;
begin
t:=now;
decodedate(t,year,month,day);
end;
begin
getdate(year,month,day);
writeln(year,' ',month,' ',day);
end.
其中year表示年號,month表示月份,day表示日期。
③ 判斷是否是潤年
uses sysutils;
var year:word;
begin
year:=2005;
if isleapyear(year) then writeln('Yes')
else writeln('No');
end.
其中year表示年號。
④ 將一個十進位整數轉換成十六進位
uses sysutils;
var
x:int64;
s:string;
begin
x:=100;
s:=IntToHex(x,5);
writeln(s);
end.
其中x是十進位數,s是存十六進位數的字串。IntToHex的第二個參數是返回的16進位數的位元,如果此參數大於實際總位元,則在高位補'0'。
⑤ 將一個整數轉換成字串
uses sysutils;
var
x:int64;
s:string;
begin
x:=987654321;
s:=IntToStr(x);
writeln(s);
end.
其中x是十進位數,s是字串。
⑥ 將一個浮點小數轉換成字串
uses sysutils;
var
s:string;
x:extended;
begin
x:=12034.05678;
s:=FloatToStr(x);
writeln(s);
end.
其中x是浮點小數,s是字串。
3、新增單元:math,以下功能要用到此單元。
① 求K
uses math;
var
k,x:extended;
n:longint;
begin
k:=5;n:=10;
x:=Ldexp(k,n);
writeln(x:0:3);
end.
② 求一個整數數組中的最大值
var a:array[1..Maxint]of longint;
begin
Max:=MaxIntValue(a);
end.
③ 求一個整數數組中的最小值
var a:array[1..Maxint]of longint;
begin
Min:=MinIntValue(a);
end.
④ 求一個實數數組中的最大值
var a:array[1..Maxint]of extended;
begin
Max:=MaxValue(a);
end.
⑤ 求一個實數數組中的最小值
var a:array[1..Maxint]of extended;
begin
Min:=MinValue(a);
end.
⑥ 反餘弦 angle:=arcos(x);
反正弦 angle:=arcsin(x);
反正切 angle:=arctan(x);
其中x是餘弦(正弦、正切),angle是弧度制的角度。
⑦ 返回不超過實數x且最接近x的整數
n:=floor(x);
⑧ 計算直角三角形的斜邊
c:=hypot(a,b);
⑨ 計算
k:=logn(n,x);
七、在FP環境下偵錯工具的注意事項
1. 調試前的幾點注意事項
(1) 增加程式本身的穩定性
a) 靜態查錯
為了減少無謂的調試,這一步很重要。往往一個TP中很容易查出的錯誤,FP卻要花費慘重的代價。
b) 很小的資料可以手工運算
就好比分區聯賽初賽中的閱讀程式寫運行結果一樣,一些低級錯誤盡量不要依靠調試來檢查。
(2) 檢查數組和資料的範圍
FP中有些錯誤同TP一樣,會提前報告,如:
錯誤類型 舉例 報告資訊
數組賦值越界 var a:array[1..10]of integer;begin a[0]:=0;end; Range check error while evaluating constants
資料賦值越界 Var x:integer;Begin x:=2147483647;End. Range check error while evaluating constants
但有些錯誤不會提前報錯,如:Var a:array[x..y] of 基底類型;下標p出現小於x或大於y的情況,如下:
var a:array[1..100] of integer;
i:integer;
begin
fillchar(a,sizeof(a),0);
i:=100;
while a=0 do i:=i-1;
write(a);
readln
end.
這個程式在TP下運行沒有問題,但在FP下就會出現201錯誤。原因是while迴圈結束後的i值是0,輸出a[0]的值。
再比如,下面的這個求1~N的全排列的回溯法程式:
program p17a;
var
stack:array[1..20] of integer;
s:set of 0..20;
j,top,k,n:integer;
begin
readln(n);
s:=[ ];
top:=0;k:=0;
while top>=0 do
begin
k:=k+1;
if k>n then begin k:=stack[top];s:=s-[k];top:=top-1;end{回溯}
else if not(k in s) then begin
top:=top+1;
stack[top]:=k;
s:=s+[k];
k:=0;
if top=n then
begin
for j:=1 to top do write(stack[j]);
writeln;
end
end
end
end.
運行後輸出結果正確,但會報201錯誤,只要把stack[1..20]改成[0..20]就OK了。
下面列出一些常見的蘊涵錯誤,大家必須當心:
錯誤類型 舉例 造成影響
資料迴圈越界 Var x:integer;Begin For x:=1 to 32769 do Write(x);End. x既不是由1迴圈至32769,也不是由1迴圈到32767,而是由1迴圈至2。所以輸出結果為:12
數組下標迴圈越界 Var i:integer; a,b:array[1..5]of integer;Begin For i:=1 to 5 do b:=i; For i:=1 to 6 do a:=i;End. 會不定性的出現兩種情況:情況1:程式運行到a[6]:=6是出錯中止,出現“000070E7 SYSTEM$$_HANDLEERRORADDRFRAME$LONG INT$LONG INT$LONGINT( )”等資訊;情況2:a[6]:=6語句的出現會修改其它變數比如b[1]的值。這一點比較像Delphi5。
字串長度越界 Var i:integer; S:string;Begin S:=’’; For i:=1 to 256 doS:=S+chr(i mod 10+48); Writeln(length(S)); Writeln(S);End. 對於超出長度範圍上界的字串部分,所有操作一律無效。輸出結果為:2551234567890………………6789012345
集合範圍越界 Var i:integer; S:set of 1..128;Begin S:=[1..10]; For i:=0 to 128 do If i in s then writeln(i);End. 雖然單獨寫入s:=[1..10]的語句,FP無任何不良反應,但程式運行到“if 0 in s then writeln(0)“時會出錯終止,哪怕程式第3行寫入的是語句s:=[0..10]也同樣不能做if 0 in s的判斷。還必須把集合的定義改成S:set of 0..128;
空間溢出 Var a:array[1..100000000]of longint;Begin ……End. FP不會提前報錯,但一運行程式,就會因空間溢出而出錯中止。
對於不會報告的錯誤,倘若是空間溢出等,雖然在調試過程中會出現掛機、莫名退出程式、跟蹤光條消失種種問題,讓人甚為惱火,但相比之下,資料迴圈越界、數組下標越界等FP自以為“相容”的問題,卻更加可怕。它們很隱形潛藏起來,如果不加註意,只關心演算法本身的正確性,會耗費很多偵錯工具的時間,這是不值得的。
(3) 把數組開小一點
若不然,FP會出現莫名其妙退出的現象,哪怕程式毫無錯誤。
(4) 編程過後要存檔。
存檔是當然,不然FP會報告"Can't compile unsaved file!"資訊,以防止程式意外丟失。
2. 調試時的幾點注意事項
(1) 模組調試
這種分治策略,針對FP IDE速度慢,而且Bug多的特點,降低了調試難度。
(2) 避免使用F7
F7經常失效,它往往拒絕進入子程式展開進一步的跟蹤。這時,F4可以代替F7完成工作。切記這一點,不然在跳過子程式後再重頭調試是很麻煩的。
(3) 減少F8的使用頻率
雖然F8不象F7那樣不聽指揮,但也時常失效,尤其是在程式運行出錯以後。
(4) 盡量使用F4
很多時候,F8會在程式出錯再調試時出現一些隨機給出的錯誤,比如說藍條會消失,FPcx莫名退出,甚至死機。F4相對穩定一些,只不過當遇到類似If 、Case 語句時,最好看清楚了,程式會執行哪一步。
(5) ALT+F7會失效
對於這一點,似乎沒有很好的補救措施,只能開啟Run菜單,點擊Parameter。
(6) 集合類型不能察看怎麼辦
這裡有兩條應對措施:
a) 簡單的試題保證集合類型使用正確;
b) 繁瑣的試題避免使用集合類型;
(7) 詭異的多維陣列跟蹤
在程式體中用a[i,j]和a[j]來訪問數組都是正確的,但在watches中跟蹤二維數組的一個單元時,就只能用a[j]來查看了。例如二維數組a[3,4]=10,在watches中跟蹤a[3,4]看到的不是10,只有跟蹤a[3][4],顯示出來的才是10。
3. 出錯後的幾點應對措施
(1) 發現錯誤,想結束調試。
千萬不要在修改測序後接著使用F8,因為FP不會理睬你對程式的修改,不會像TP 和Dlephi一樣出現類似“Source hs been modified. Rebuild? Yes? No? Cancle”的對話方塊,還可能導致藍條的消失。所以,使用快速鍵CTRL+F2終止調試,然後使用快速鍵ALT+F9進行編譯,當然存檔不要忘記。
(2) 程式運行出錯
使用ALT+F5察看黑屏上有無出錯資訊。
當你再次調試時,有時一切運行良好,但有時會出現一些問題:
a) 如果F8不工作了,那麼再次存檔並使用Build編譯;
b) 如果F8仍然不工作,那麼嘗試使用F4;
c) 如果藍條消失,也可以嘗試使用F4;
d) 如果F4也不工作,那麼關閉其它視窗的程式,再嘗試一次;
e) 如果F4仍然不工作,那麼ALT+X關掉所有可以關閉的程式,並退出失控的FP, 然後重新進入。
4、其他
① Free Pascal在windows 95及其以上的windows版本上支援長檔名。對於檔案名稱,由於windows系統對大小寫不敏感,因此在程式中,檔案名稱的大小寫是無關的。但是對於其它大小寫敏感的系統,比如linux,程式中用到的檔案名稱必須和系統中的檔案名稱完全一致。
由於資訊學競賽的評測系統一般是linux,因此要求程式中的檔案名稱和系統中的檔案名稱一樣。即:比賽中涉及的所有檔案名稱(包括來源程式名、輸入檔案名稱、輸出檔案名、回應檔案名),都必須嚴格按照題目要求命名,嚴格區分大小寫。例如:題目要求輸入檔案名稱為game.in,則程式中必須按照該名字開啟檔案,不能使用Game.in、GAME.IN等名字;
② 在NOIP比賽中,程式中不得使用題目規定外的其他任何庫(unit),一般在試機時確認;
③ 在NOIP比賽中,原始碼中不得使用編譯選項(開關);
④在NOIP比賽中,禁止使用meml進行掐時。
八、Free Pascal錯誤一覽表
1、 Run Time Errors 運行錯誤
(A) DOS 錯誤碼:
1:無效DoS功能號
2:檔案末找到
3:路徑未找到
4:開啟檔案過多
5:禁止檔案存取
6:無效檔案控制代碼
12:無效檔案存取代碼
15:無效磁碟機代號
16:不能刪除當前日錄
17:不能跨磁碟機改檔案名稱
(B) I/O錯誤
100:磁碟讀錯誤
101:磁碟寫錯誤
102:檔案變數末賦值
103:檔案未開啟
104:檔案未用輸入方式開啟
105:檔案末用輸出方式開啟
106:無效數字格式
(C) 嚴重錯誤
150:磁碟防寫保護
15l:未知單元
152:磁碟機未準備好
153:未知命令
154:資料CRC校正錯
155:磁碟機請求的結構長度錯
156:磁碟定位錯
157:未知媒介類型
158:扇區末找到
159:印表機缺紙
160:裝置寫失敗
161:裝置讀失敗
162:硬體故障
(D) 致命錯誤
200:被零除
20l:範圍檢查錯
202:堆疊溢位錯
203:堆溢出錯
204:無效指標操作
205:浮點上溢出
206:浮點下溢出
207:無效浮點運算
208:未安裝覆蓋管理程式
209:覆蓋檔案讀錯
210:對象未初始化
2ll:調用抽象方法
212:流登計錯
213:集合下標越界
214:集合溢出
215:算術上溢錯誤
216:存取非法
217:控制-C
218:授權指令
219:無效的TYPECAST
220:無效的變體TYPECAST
221:無效的變體操作
222:沒有變體方法調用DISPATCHER
223:不能建立變體數組
224:變體不包含數組
225:變體數組邊界錯誤
226:TLS初始化錯誤
2、 編譯錯誤對照表
下面列出在編譯器時可能出現的錯誤,在Integration Environment下,Pascal將自動載入來源程式並定位於出錯處。
1:記憶體溢出
2:缺標識符
3:標識符未定義
4:標識符重定義
5:語法錯誤
6:實型常量錯
7:整型常量錯
8:字串常量跨行
9:檔案嵌套過多
10:非正常檔案結束
11:行過長
12:缺類型標識符
13:開啟檔案過多
14:無效檔案名稱
15:檔案未找到
16:磁碟滿
17:無效編譯指示
18:檔案過多
19:指標定義中未定義類型
20:缺變數標識符
21:類型錯誤
22:結構過長
24:檔案分量不能為檔案
25:無效字串長度
26:類型不符
27:無效子界基底類型
28:下界大於上界
29:缺有序類型
30:缺整型常數
31:缺常數
32:缺整型或實型常數
33:缺指標類型標識符
34:無效的函數結果類型
35:缺標號標識符
36:缺BEGIN
37:缺END
38:缺整型運算式
39:缺有序運算式
40:缺布林運算式
41:運算元類型與操作符不匹配
42:運算式錯
43:非法賦值
44:缺欄位標識符
45:目標檔案過長
46:未定義外部標識符
47:無效*.OBJ檔案記錄
48:程式碼片段過長
49:資料區段過長
50:缺DO
51:無效PUBLIC定義
52:無效EXTRN定義
53:EXTRN定義過多
54:缺0F
55:缺INTERFACE
56:無效重定位引用
57:缺THEN
58:缺T0或DOWNTO
59:未定義的向前引用
60:過程過多
61:無效類型轉換
62:被零除D
63:無效檔案類型
64:不能讀寫該類型的變數
65:缺指標變數
66:缺字串變數
67:缺字串運算式
68:單元循環參考
69:單元名不匹配
70:單元版本不匹配
71:單元重名
72:單元檔案格式錯誤
73:缺IMPLEMENTATl0N
74:常數與CASE類型不相匹配
75:缺記錄變數
76:常數越界
77:缺檔案變數
78:缺指標變數
79:缺整型或實型運算式
80:標號不在當前塊中
81:標號已定義
82:標號未定義
83:無效參數
84:缺UNIT
85:缺“;”
86:缺“:”
87:缺“,”
88:缺“(”
89:缺“)”
90:缺“=”
91:缺“:=”
92:缺“[”或“(.”
93:缺“]”或“.)”
94:缺“.”
96:變數過多
97:無效FOR控制變數
98:缺整型變數
99:此處不允許用檔案和
100:字串長度不匹配
101:無效字順序
102:缺字串常數
103:缺整型或實型變數
104:缺有序變數
105:INLINE錯
106:缺字元運算式
107:重定位項過多
112:CASE常量越界
113:語句錯
114:不能調用中斷過程
116:必須在8087方式下編譯
117:末找到目標地址
118:此處不允許包含檔案
120:缺NIL
121:無效限定符
122:無效變數引用
123:符號過多
124:語句部分過長
126:檔案必須為變數參數
127:條件符號過多
128:條件指令錯位
130:初始條件定義錯
13l:過程和函數頭與前面定義的不匹酉
132:嚴重磁碟錯誤
133:不能計算該運算式
134:運算式錯誤結束
l35:無效格式說明符
136:無效間接引用
137:此處不允許結構變數
138:無SYSTEM單元不能計算
l39:不能存取該符號
140:無效浮點運算
141:不能將覆蓋編譯至記憶體
142:缺過程和函數變數
143:無效過程或函數引用
144:不能覆蓋該單元
147:缺物件類型
148:不允許局部物件類型
149:缺VIRTUAL
150:缺方法標識符
151:不允許虛擬構造方法
152:缺構造方法標識符
153:缺釋放方法標識符
154:FAIL只允許在構造方法內使用
155:無效的操作符和運算元組合
156:缺記憶體引用
l57:不能加減可重定位器號
158:無效寄存器組合
159:未啟用286/287指令
160:無效符號引用
161:代碼產生錯
162:缺ASM