标题：FreePascal
简介
Free Pascal是个由国际组织开发的完全的win32的pascal语言编译器，类似delphi，可编写windows程序。它于GPL授权下发布。[1]
更改语言
  
当free pascal 此时的语言并不是你所希望的时，若需要更改语言可以在fp窗口最上面的标题栏上右键单击，在弹出的快捷菜单中选择“默认值”，接着会弹出属性窗口，在最下面的“默认代码页”的下拉菜单中选择“437（OEM-美国）”或其它语言。
原因
虽然Free Pascal尽量设计得和Turbo Pascal接近，但是由于以下的两个原因，两者之间还是有一些区别的：
⒈ Free Pascal是一个32位的编译器，而Turbo Pascal只是16位编译器；
⒉ Free Pascal是一个跨平台的编译器，可在linux系统应用，而Turbo Pascal只在windows上使用，信息竞赛中多用linux评测。
如果你的代码是遵守ANSI Pascal的，那么代码从Turbo Pascal移植到Free Pascal是没有问题的。
使用技巧
下面是在Turbo Pascal上可以使用，但是在Free Pascal就不能使用的一些语言特性：
⒈ 函数和过程在使用时，参数的类型必须和定义时完全一致。原因是在Free Pascal中添加了函数重载功能。
⒉ PROTECTED，PUBLIC，PUBLISHED，TRY，FINALLY，EXCEPT，RAISE成为了关键字，因此不能作为函数和过程的名字。
⒊ FAR，NEAR不再是关键字了。原因是Free Pascal是32位系统，不再需要这些关键字。
⒋ 布尔表达式不一定要全部进行计算。只要最终结果已经能够确定，就不再计算其它还没有计算的部分了。比如布尔表达式exp1 AND exp2 AND exp3，如果已知exp1的结果是false，那么怎么表达式的结果肯定是false，exp2和exp3就不用进行计算了。
⒌ 在Free Pascal中，集合中的元素都是4个字节长的。
⒍ 表达式执行的顺序是不确定的。比如对于表达式a:=g⑵+f⑶； 不保证g⑵一定在f⑶之前执行。
⒎ 如果用Rewrite打开文件，那么文件就只能被写入了。如果需要读取这个文件，要对文件执行Reset。
⒏ Free Pascal在程序结束之前一定要关闭输出文件，否则输出文件可能不能被正确的写入。
⒐ Free Pascal理论上可以使用4GB的内存，因此实际上几乎可以使用系统中的所有剩余内存（除非赛题中有内存限制）。这是Free Pascal由于32位的编译器。但是对于Turbo Pascal来说，由于是16位的编译器，因此不能定义大小超过64KB的数据类型和变量，并且在DOS实模式下可以使用的内存总数只有640KB。
扩充功能
下面是Free Pascal相对于Turbo Pascal扩充的一些功能：
⒈ 函数可以返回复杂的类型，比如记录和数组。
⒉ 在函数中，函数的返回值可以作为一个变量来处理。比如：
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;
{ this is the recursive call }
if a()>4 then
begin
{...}
end;
end;
⒊ exit可以接受一个参数作为函数的返回值。比如：
function a : longint;
begin
a:=12;
if a>4 then
begin
exit(a*67）； {函数的返回值就是a*67 }
end;
end;
⒋ 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;
⒌ Free Pascal容许运算符重载。比如，可以自己为矩阵运算定义一个“+”运算。
⒍ Free Pascal在windows 95及其以上的windows版本上支持长文件名。对于文件名，由于windows系统对大小写不敏感，因此在程序中，文件名的大小写是无关的。但是对于其它大小写敏感的系统，比如linux，程序中用到的文件名必须和系统中的文件名完全一致。但是由于信息学竞赛的评测系统一般是linux，因此要求程序中的文件名和系统中的文件名一样。
常见保留字
and array begin case const div do downto else end file for function goto if in label mod nil not of or packed procedure program record repeat set then to type until var while with
以上36个保留字是指被Pascal语言所使用，而且有专门的用途，不允许用于其它的用途（如定义标识符）。
标准数据类型
整数类型名称
标识符
大小
表示范围
短整型
shortint
1字节
-128~127
整型
integer
2字节
-32768~32767(-2^15~2^15-1）
长整型
longint
4字节
(-2^31~2^31-1）
64位长整形
int64
8字节
-2^63~2^63-1
字节型
byte
1字节
0~255
字型
word
2字节
0~65536
双字型
dword
4字节
四字型
qword
8字节
0~2^64-1
允许的计算符是+（加） -（减） *（乘） div（整除） mod（求余）and （与）or （或）xor（异或）实数类型名称
标识符
表示范围
单精度型
single
在内存中占4个字节， 7到8位有效数字
双精度型
double
在内存中占8个字节， 15到16位有效数字
扩展精度型
extended
在内存中占10个字节， 19到20位有效数字
*装配十进制型
comp
在内存中占8个字节， 19到20位有效数字
允许的计算符是+（加） -（减） *（乘） /（除）字符类型字符类型即为在两个单引号之间的PASCAL字符集（' '）。字符类型在PASCAL语言中使用类型标识符char来表示，它是有序的。
还有类型标识符string来表示字符串。  布尔类型布尔类型的数据只有2个：TRUE 和 FALSE。布尔类型在PASCAL语言中使用类型标识符boolean来表示，它是序列的，并且规定FALSE<TRUE。
布尔类型的运算符是not、and、or、xor，其运算规则如下表：
p
q
p and q
p or q
p xor q
true
true
true
true
false
true
false
false
true
true
false
true
false
true
true
false
false
false
false
false

错误列表
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初始化错误　　编译错误对照表下面列出在编译程序时可能出现的错误，在集成环境下，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