⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 关于fp的一些非常详细的资料.txt

📁 关于FreePascal的一些非常详细的资料 包含 1.易错Tips 以及注意事项 2.出错信息 希望对你的编程带来帮助
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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、 编译错误对照表 
下面列出在编译程序时可能出现的错误,在集成环境下,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 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -