NOIP pascal使用技巧文档格式.docx

上传人:b****6 文档编号:18796315 上传时间:2023-01-01 格式:DOCX 页数:18 大小:28.54KB
下载 相关 举报
NOIP pascal使用技巧文档格式.docx_第1页
第1页 / 共18页
NOIP pascal使用技巧文档格式.docx_第2页
第2页 / 共18页
NOIP pascal使用技巧文档格式.docx_第3页
第3页 / 共18页
NOIP pascal使用技巧文档格式.docx_第4页
第4页 / 共18页
NOIP pascal使用技巧文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

NOIP pascal使用技巧文档格式.docx

《NOIP pascal使用技巧文档格式.docx》由会员分享,可在线阅读,更多相关《NOIP pascal使用技巧文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

NOIP pascal使用技巧文档格式.docx

TurboPascal默认在内存中编译和运行程序,这样当你在软盘上编写程序时就可以节省一些时间。

你可以在菜单Compile->

Destination中选择Disk,这样在编译和运行程序时就会生成相应的.exe文件了。

编译模式专题

什么是编译模式?

编译模式是指编译器对程序的编译方式,以不同的编译模式编译的程序将在不同的环境中运行,只有BorlandPascal7.0和FreePascal支持以不同的编译模式编译程序。

BorlandPascal7.0支持3种编译模式:

DOS实模式、DOS保护模式和Windows模式。

FreePascal目前支持6种编译模式:

DOS(GO32V1)、DOS(GO32V2)、Freebsd、Linux、OS/2和Win32。

DOS实模式是把程序编译为实模式应用程序的编译模式,它是默认的16位DOS程序编译方式,FreePascal不支持以DOS实模式编译程序。

实模式应用程序可以使用最大640KB的DOS常规内存,内存访问速度较快,可执行文件较小,可以单独运行,但无法在DOS实模式中使用动态链接库。

DOS保护模式是把程序编译为保护模式应用程序的编译模式。

保护模式应用程序可以访问计算机所有可利用的扩充内存(ExtendedMemory,简称XMS),它通过使用DPMI(DOSProtectedModeInterface)来在保护模式下运行。

在保护模式下应用程序只能访问自己持有的内存数据,而不允许访问非法的内存段,否则将会产生错误,其访问内存的速度会比在DOS实模式下稍慢一些,能够使用动态链接库。

如何使用DOS保护模式?

只有BorlandPascal7.0支持以DOS保护模式编译程序,你必须在菜单Compile->

Target中选择ProtectedmodeApplication后才能以DOS保护模式编译程序。

由于保护模式的实现比较复杂,BorlandPascal7.0无法调试保护模式应用程序。

你可以先在DOS实模式下调试程序,在确定程序正确后才转用DOS保护模式编译。

保护模式应用程序在启动时需要调用Rtm.exe来装载保护模式系统,因此你必须确保Rtm.exe存放在应用程序所在的目录下或者DOS的默认搜索路径下,你可以在BorlandPascal7.0的工作目录下找到该文件。

在比赛时,你最好预先询问一下出题者或工作人员是否允许使用保护模式,否则你的程序在测试时可能会因缺少文件Rtm.exe而无法执行。

保护模式应用程序不允许访问不由自己持有的内存段,否则将会产生216号错误。

如果你的程序在运行时出现216号错误,请检查你的程序是否在动态数据的分配和访问上出了问题。

这种内存违法访问的错误在DOS实模式下可能会被隐藏起来而无法发现,因此即使你的程序不需要使用保护模式,你也可以通过保护模式来检查它是否正确。

如果你需要访问ROMBIOS或视频内存,你可以使用System单元的变量Seg0040、SegA000、SegB000和SegB800来代替只在DOS实模式下可用的段地址$0040、$A000、$B000和$B800。

保护模式应用程序虽然在理论上可以利用所有的扩充内存,但实际上经常只能使用所有扩充内存的一部分。

例如,如果你的计算机上配有64MB的扩充内存,那么你的程序在保护模式下运行时有时可能只能用到32MB,此时再分配内存就会产生错误。

你可以通过调整System单元的变量HeapBlock和HeapLimit的值来改善扩充内存的利用情况。

我的许多次测试的结果表明,把HeapBlock和HeapLimit分别赋值为65528和16382,此时扩充内存的综合利用情况最好。

但要注意这两个变量只在保护模式下有效,在实模式下这两个变量并不存在。

编译指示专题

编译指示是一种用来控制编译器特性的特殊语法的注释,它可以出现在普通注释允许出现的任何地方。

编译指示从“{$”或“(*$”开始,紧接着是一个指示名,然后你可以添上必要的参数和注释,最后以“}”或“*)”结束。

除了在程序的源代码中直接插入编译指示外,你也可以在IDE的菜单Options或命令行编译器中改变默认的指示。

当你在IDE中编写程序时,你可以通过按下Ctrl+OO来让IDE在你的程序源代码开头插入当前的指示设置。

编译指示分为开关编译指示、参数编译指示和条件编译指示三种。

开关编译指示用来打开或关闭某个编译器特性,你可以在指示字母后面加上“+”或“-”来控制编译器特性的开关,你还可以把多个开关指示以无空格的逗号分隔来组合成一个单独的编译指示注释,例如:

  {$R+}表示进行下标范围检查;

  {$D-,I-,S-}表示不产生调试信息,不检查I/O错误,不检查栈空间域是否溢出;

  {$ITypes.inc}表示在该编译指示所在位置把文件Types.inc的源代码嵌入正在编译的正文中;

  {$M65520,8192,655360}表示指定栈大小为65520字节,堆最小值和最大值分别为8192和655360字节。

常用开关编译指示表

字母

缺省值

实模式

保护模式

视窗模式

含义

A

A+

按字地址对齐

B

B-

布尔计值控制

D

D+

调试信息开关

F

F-

强制远程调用

G

G-

产生286代码

I

I+

I/O出错检查

N

N-

数字协处理器

P

P-

不定长字串参

Q

Q-

整数溢出检查

R

R-

下标范围检查

S

S+

栈空间域检查

T

T-

指针类型检查

V

V+

串长匹配检查

  在BorlandPascal7.0中,要使程序的可执行文件最小、可用功能最多并且运行速度最高,可使用开关编译指示:

{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-}。

在这种设置下,程序在编译和运行时不进行任何可选的错误检查,也不能进行调试。

要使程序进行运行时错误检查,可以使用编译指示:

{$I+,Q+,R+,S+}。

要使程序能够调试,可以使用编译指示:

{$D+,L+,Y+}。

另外,为了使程序的栈尺寸和可用堆尺寸最大,还应在主程序中添加编译指示:

{$M65520,0,655360}。

下面是一个简单的样例:

programNoname;

{$A+,B-,E-,F-,G+,N+,O-,P+,T-,V-,X+}

{$I-,Q-,R-,S-}

{$D-,L-,Y-}

{$M65520,0,655360}

begin

end.

在FreePascal中,最优的编译指示是:

{$I-,Q-,R-,S-,V-,X+}。

{$I+,Q+,R+,S+,V-,X+}。

但应该注意,FreePascal有许多编译选项是不能在源代码中以编译指示的方式设置的。

你可以在IDE的菜单Options->

Mode中选择编译方式:

Normal、Debug和Release。

在程序最后完成时,应使用Release方式编译程序。

另外,FreePascal提供了参数编译指示{$MODE兼容模式}用以设置编译时的兼容模式,即所用的语法,你可以根据你熟悉的语法进行选择:

Default、Delphi、TP、FPC、OBJFPC和GPC。

如果你只会TurboPascal语法,那么你应该选择TP,如果你熟悉Delphi的ObjectPascal语法,那么你也可以选择Delphi。

{$I-,Q-,R-,S-,V-,X+}

{$MODEDelphi}

如果你不能把全部的编译指示记住,或者你使用的是编译指示不完全的较低版本的TurboPascal,那么你可以在IDE中按下Ctrl+OO,IDE会在当前编辑文件的开头插入默认编译指示设置,你可以在其基础上进行修改。

虽然大部分的最优编译指示与默认的指示相同,但在源代码中使用编译指示显得更加安全,因为它不会受默认编译指示改变的影响。

内存分配专题

为何我的程序在递归调用子程序时会出现栈溢出错误?

调用子程序是需要分配一定的内存空间用以存放参数、函数返回值和局部变量等数据的。

Pascal提供了一个全局静态的栈结构的内存段用以存放这些数据,每次调用子程序都会把所需的数据压入栈中,子程序结束后就把数据从栈中取回。

由于栈的大小是在编译时设定的,不能在运行时再更改大小,因此当栈没有足够的剩余空间来存放调用子程序所需的数据时,就会出现栈溢出错误。

你可以通过参数编译指示$M来设置栈的大小,根据程序的需要来设置栈的大小是很重要的,因为栈太小则容易出现栈溢出错误,太大又会浪费内存。

注意Borland/TurboPascal编译器是16位的编译器,你最多只能设置65520字节的栈空间。

FreePascal编译器是32位的,因此基本上没有限制,栈大小设置在Linux下将会被忽略。

为何当我声明的全局变量的总尺寸超过64KB时会出现编译错误?

在Pascal中,一个主程序及其所有单元(包括System单元)的全局静态数据(包括全局变量、全局和局部类型常数、PChar常量和对象类型的虚拟方法表等)都被存放在一个单独的全局静态的数据段中。

由于Borland/TurboPascal编译器是16位的编译器,这个数据段的大小不能超过64KB,否则将无法编译。

解决的方法是尽可能少用全局静态变量,把一些比较大的全局静态数据改用动态方式存储,以减少全局静态空间的需求。

为何我不能定义大小超过64KB的数据类型和变量?

由于Borland/TurboPascal编译器是16位的编译器,它要求每个单独的数据类型和变量的大小都不能超过64KB,否则将无法编译。

解决的方法是把数据分拆,并用动态方式存储分拆后的数据。

例如,对于一个很大的一维数组,你可以把它拆为二维数组,然后用动态方式存储第二维数据。

下面是一些简单的样例:

分拆前的数据类型

 

分拆后的数据类型

type

TQueue=array[0..249999]ofByte;

->

TList=array[0..9999]ofByte;

TQueue=array[0..24]of^TList;

TRecord=record

A,B,C:

array[0..9999]ofLongint;

end;

TList=array[0..9999]ofLongint;

^TList;

我的程序可以申请多大的动态内存空间?

在Borland/TurboPascal中,如果你以DOS实模式编译程序,那么你的程序可以申请的最大动态内存空间为当前DOS常规内存剩余量和编译指示$M设置的最大堆空间这两个数的最小值,如果你以保护模式编译程序,那么的你的程序可以申请的最大动态内存空间就是扩充内存的剩余量。

在FreePascal中,要视具体环境的设置而定。

注意,在很多时候,你的程序实际上并不能使用到理论上可用的最大内存空间,因为由不完全的内存释放操作产生的大量剩余内存碎片会由于每块碎片过小而无法利用。

由于Borland/TurboPascal编译器是16位的编译器,因此它限定每次申请的内存空间的最大值为65528字节。

注意,申请大小在65529至65535之间的内存空间是不安全的。

输入输出专题

在进行文件输入输出操作时可否免去文件变量参数?

可以,方法是设置默认输入输出文件。

System单元提供了两个正文文件变量Input和Output,它们是默认的输入输出文件参数,在程序启动时,这两个变量会自动指向并打开默认的输入输出设备(如键盘和显示器),在程序结束后,这两个变量会自动关闭所指向的文件。

你可以通过改变这两个变量所指向的文件来自定义默认输入输出文件,下面是一个简单的样例:

var

S:

string;

procedureSetIOFiles(constInputName,OutputName:

string);

Close(Input);

Assign(Input,InputName);

Reset(Input);

Close(Output);

Assign(Output,OutputName);

Rewrite(Output);

end;

SetIOFiles('

Input.txt'

'

Output.txt'

);

Readln(S);

{inputsSfromtextfile"

Input.txt"

}

Writeln(S);

{outputsStotextfile"

Output.txt"

在DOS下,把文件名设为空串或者“con”可以指向默认的输入输出设备(如键盘和显示器)。

注意,在FreePascal中,正文文件变量Input和Output不会在程序结束时自动关闭所指向的文件,这可能会造成输出数据遗失,因此你需要在程序结束的地方明确地关闭它们。

函数SeekEoln、SeekEof和Eoln、Eof有什么区别?

SeekEoln和Eoln用于判断文件行结束,SeekEof和Eof用于判断文件结束,但它们之间还是有区别的。

Eoln和Eof只判断当前的所在位置是否位于行结束符上或者文件尾部,而SeekEoln和SeekEof会自动跳过所有连续的空格和制表符再进行判断,因此,在执行函数SeekEoln或SeekEof后,当前的所在位置不会是空格或者制表符。

为何我的程序结束后其输出文件无内容?

这可能是由于在输出数据后没有关闭输出文件所造成的,或许是你忘了在程序结束的地方关闭文件,也或许是在关闭文件前你的程序就在某个地方终止了。

Pascal在向正文文件输出数据时,不一定立即就写进磁盘里,只要剩余缓冲区足够,Pascal会先把数据复制到正文文件变量内置的缓冲区中去,直到缓冲区满或者关闭文件时才真正把缓冲区内的数据写进磁盘文件中。

但你可以在输出数据后调用System单元的过程Flush(varF:

Text)来强制把缓冲区内所有的数据立即写进磁盘文件中并清空缓冲区。

如何设置正文文件缓冲区的大小?

Pascal不提供直接设置缓冲区大小的功能,但提供设置缓冲区的功能。

在System单元中含有一个过程SetTextBuf(varF:

Text;

varBuf[;

Size:

Word]),使用它可以为正文文件自定义缓冲区,下面是一个简单的样例:

F:

Buf:

array[0..4095]ofByte;

Assign(F,'

SetTextBuf(F,Buf,SizeOf(Buf));

{orSetTextBuf(F,Buf);

Reset(F);

{orRewrite(F);

...

Close(F);

注意,SetTextBuf必须在对文件进行任何读写操作之前使用,否则将会造成数据遗失,至少要紧跟在Reset、Rewrite或Append的后面。

另外,由于Pascal为每个正文文件变量都内置了一个128字节的缓冲区,因此设置尺寸小于128字节的缓冲区是毫无意义的。

一般情况下,设置一个8KB或16KB左右的缓冲区就可以使正文文件读写的速度显著提高了。

语法专题

程序首部的参数Input和Output是什么意思?

它们代表默认输入输出设备,但它们只在老式的Pascal语言中有存在意义。

在Borland/TurboPascal和FreePascal中,程序首部不需要任何参数,但为了兼容旧式的Pascal程序,编译器会忽略程序首部的所有参数。

如何获得函数返回值的地址?

在Borland/TurboPascal中,只能通过函数名来设置函数返回值,编译器并不提供获取函数返回值地址的方法。

虽然也可以通过底层的方法来获得函数返回值的地址,但该方法不适合在信息学奥林匹克中使用。

在FreePascal中,如果使用TurboPascal语法,则和Borland/TurboPascal一样,如果使用ObjectPascal语法,则可以通过使用标识符Result来像变量一样访问函数返回值,@Result返回的就是函数返回值地址。

数值参数、变量参数和常量参数有什么区别?

数值参数、变量参数和常量参数代表三种不同传递方式的子程序参数类型,它们分别用于不同的场合,使用不同的参数类型会产生不同的子程序调用执行速度、栈空间占用量和传递效果。

子程序在调用时会在栈中为数值参数分配一块新的空间,并把实际参数的值赋给数值参数,然后数值参数就可以像局部变量一样使用。

子程序结束后,数值参数所占用的栈空间会自动释放,数值参数的值的改变不会影响到实际参数。

数值参数可接受的实际参数为:

常量、表达式和变量。

子程序在调用时会在栈中为变量参数分配四个字节的空间,并把实际参数的地址赋给这四个字节,对变量参数的访问就是通过该四个字节组成的指针来对实际参数进行访问,其访问速度比数值参数慢一些。

子程序结束后,这四个字节的空间就会自动释放,变量参数的值的改变等价于实际参数的值的改变。

变量参数可接受的实际参数为:

变量。

对于常量参数,子程序在调用时会根据其数据类型和大小来决定是分配一块新的空间来存放实际参数的值还是分配四个字节来存放实际参数的地址,其决定根据与实际参数是否变量无关。

常量参数的访问类似于常量,只能获取它的值而不能进行赋值,唯一的例外是可以使用@操作符来获得常量参数的地址。

常量参数可接受的实际参数为:

注意,由于文件类型比较特殊,文件类型的参数只能作为变量参数传递。

如何使两个子程序可以互相调用?

Pascal要求每个标识符在使用前必须预先定义,如果两个子程序要互相调用,那么就至少有一个子程序必须在其实现之前预先声明,即预定义子程序,这可以用保留字forward完成。

forward用于预定义子程序,把它放在子程序首部的后面,那么这个子程序首部就预定义了一个子程序,而其具体的实现部分可以在其它地方给出。

procedureProcA;

forward;

procedureProcB;

ProcA;

ProcB;

注意,forward不能用于预定义单元中已在接口部分声明的子程序。

数据类型专题

如何设置字符串的长度?

在Borl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1