发新话题
打印

Free Pascal和Turbo Pascal的区别(转)

Free Pascal和Turbo Pascal的区别(转)

Free Pascal和Turbo Pascal的区别
. i# ^. ]3 Y( V+ z& l: y+ c  l8 h$ [9 j+ i
# k0 Y7 R1 d  U2 W
虽然Free Pascal尽量设计得和Turbo Pascal接近,但是由于以下的两个原因,两者之间还是有一些区别的:
& G6 v3 R5 ]  R8 q, L: m3 I9 k% s" {  [1 K, k
1.Free Pascal是一个32位的编译器,而Turbo Pascal只是16位编译器;
) O  Z, Q# t/ J& j# m) \0 }- b4 q
+ p0 g: {5 v- S+ D3 Z0 s2.Free Pascal是一个跨平台的编译器,而Turbo Pascal只在windows上使用。 ; p. ~7 g' U: U& ^- g

# L$ }* g# f' i0 H9 |3 g& h  {如果你的代码是遵守ANSI Pascal的,那么代码从Turbo Pascal移植到Free Pascal是没有问题的。 5 y' ]" V* W2 h) R

. h+ c0 J# D: q; C下面是在Turbo Pascal上可以使用,但是在Free Pascal就不能使用的一些语言特性:
. t. {  j0 E; i; W& f' d1 L2 x4 P3 B% j
1.函数和过程在使用时,参数的类型必须和定义时完全一致。原因是在Free Pascal中添加了函数重载功能。
+ a# ~% w6 q# l- h# @* v8 ^( V" g( |7 P! |( ~: g' J& b# W% p% D
2.PROTECTED,PUBLIC,PUBLISHED,TRY,FINALLY,EXCEPT,RAISE成为了关键字,因此不能作为函数和过程的名字。
9 k0 X+ v' _- A
+ c3 {0 E2 a/ N+ c3 u- ~# O0 I1 U3.FAR,NEAR不再是关键字了。原因是Free Pascal是32位系统,不再需要这些关键字。 ; S0 o) n+ A/ [' y

+ e! ^) E# D, e" F4.布尔表达式不一定要全部进行计算。只要最终结果已经能够确定,就不再计算其它还没有计算的部分了。比如布尔表达式exp1 AND exp2 AND exp3,如果已知exp1的结果是false,那么怎么表达式的结果肯定是false,exp2和exp3就不用进行计算了。 9 |1 ~3 o' R$ j% J* V# B
. }/ B& S0 A7 c; N6 v
5.在Free Pascal中,集合中的元素都是4个字节长的。 % l, k# p+ w9 I
' z" o- R7 G. n* R
6.表达式执行的顺序是不确定的。比如对于表达式a:=g(2)+f(3); 不保证g(2)一定在f(3)之前执行。 6 \* |5 n2 {( U& Z$ z7 M) b
$ j1 P) p! f2 R: I$ U& |  G9 z. T
7.如果用Rewrite打开文件,那么文件就只能被写入了。如果需要读取这个文件,要对文件执行Reset。
7 e3 I6 M2 o9 h4 v0 b, m1 `) p% y7 o0 J, h
8.Free Pascal在程序结束之前一定要关闭输出文件,否则输出文件可能不能被正确的写入。
7 ~1 f5 ?; l/ t- L
9 |- U: @' P# F. a/ W9.Free Pascal理论上可以使用4GB的内存,因此实际上几乎可以使用系统中的所有剩余内存(除非程序有内存限制)。这是Free Pascal由于32位的编译器。但是对于Turbo Pascal来说,由于是16位的编译器,因此不能定义大小超过64KB的数据类型和变量,并且在DOS实模式下可以使用的内存总数只有640KB。 9 h6 b/ X, W. a) ~0 A0 B: i
, {0 I# ]1 g" k' R) Q. C
下面是Free Pascal相对于Turbo Pascal扩充的一些功能: 8 f4 A. W* e& W! ]
/ M; t, S% D; q3 t$ f. ^' P' u
1.函数可以返回复杂的类型,比如记录和数组。 $ x4 x0 c3 t" P$ p% `

! [1 F- b0 B. Z2.在函数中,函数的返回值可以作为一个变量来处理。比如: 6 T* C. E& \( Y" ]: e, p

, C; ?- I* I7 }function a : longint;
! r4 c1 D9 C: S6 X& a/ z; B" }
8 K3 z6 D+ U! b4 e8 U4 m) Nbegin
( ~* R0 ~: v2 h" L, ?4 ?; t; B5 }" n7 `8 w- }3 ]
a:=12;
& y2 ]- q# v7 z; f, U6 Y) Q2 y4 G4 F  Q8 L5 T4 d$ e) Q! X. x$ l
while a>4 do
$ r2 e* z! h- o6 \$ G. `  n0 Y$ A
5 u5 u1 u6 l. N$ S+ wbegin
/ ~/ [% @$ Q! g8 c, Y: ^) N+ I
9 j& g& ?9 w# t5 m' K{...}
" }$ j3 B- w- q9 q/ S
; Y6 K- D, J* v6 ?4 l" \+ }end;
# E4 G+ S: ]4 \6 J7 C6 U
4 M5 y& j4 _5 b1 a2 D1 l8 a7 Vend; # Z5 g) M4 W  S4 {

4 p0 m8 Y6 X4 R& g5 A0 G这个例子在Turbo Pascal中,a>4会被认为是函数的递归调用,但是在Free Pascal中会认为a只是一个变量。如果想在Free Pascal中实现递归调用,就要写成下面的形式:
, w; V/ M' `6 H1 ~' ?& X
; ]$ M& X6 v7 Bfunction a : longint; 7 _) X! U$ v2 H( v6 J  {

: f2 d+ q  ~  r! cbegin
' ^' m' n* {9 n; M3 _0 _. e2 _) L0 l
9 D5 Y7 C2 v  Y  ]4 ~a:=12; * @9 F; ~( |) H! ~5 k
3 t. Z: L+ V% \0 H8 r, ^5 Z: x
{ this is the recursive call }
8 ^* E, |) q) c8 z/ ?' `- V
. S( l, {3 F# o0 G: c+ @5 h" _0 Jif a()>4 then
' ]0 U! A) s2 f/ o  m4 e0 C* k2 A6 N- A- y+ E6 N
begin
# J6 Y  T5 S! h* O" f# V0 W
- S4 j. N! ]& Q( {{...}
: G8 }& Q8 C( [) H
8 n% O- f3 t3 O+ T' q- w$ mend;
0 P% ]4 U  ~5 _: I
. f; G% R- _& c+ U! O( c+ jend;
" n1 g3 p, t' ~8 {4 ?0 Y7 E  B/ i4 R; D* N3 W+ ]/ z5 W
3.exit可以接受一个参数作为函数的返回值。比如: . T" v; m) ^' o3 m- x# l/ i

. d- b) X. T, Z7 Sfunction a : longint; % Z# \5 \# v: S* T6 {! Q/ k7 l. f) T4 x
7 v$ F7 p9 z3 v2 l$ {8 W- J) Z
begin , X9 N- }- M: H+ A- Z7 F$ v7 I

# @+ z( t" z* U" X- E  H. Wa:=12; $ m8 F& K' ~3 m

4 ~/ ~, Q" J/ k+ Hif a>4 then
5 Y$ J7 e, ]- `1 [' s
  c" a# z* c" a) m0 {. rbegin
; g5 G/ S2 h( K4 O# ^+ O+ A: C0 t' Y" H' h0 j6 r! M' E! [9 d* l3 o
exit(a*67); {函数的返回值就是a*67 }   |3 ?' g# ]% m' \0 Y2 Q( S
9 O2 Q; ^* N# n$ l' \
end; - X% V9 o  I: m

0 l% x# M9 E/ q+ ^; P, [* bend;
$ k2 z) d! M) H# U$ }4 B- _$ q$ I0 \# L9 Q/ `
4.Free Pascal支持函数重载。可以用相同的名字定义不同的函数,只要这些函数的参数不同,就是不同的函数。比如: . c% U- S! W: `0 f. l6 ^
. N7 a, h, `/ d! s* g/ ~
procedure DoSomething (a : longint); ( V0 Y4 M# {0 W3 t* h

4 [% N6 g* S2 c! @( k% V: g1 \4 {. Qbegin & ]3 J  M7 T! l2 \
7 q6 [* b! b& P! e- T8 ]8 c) H
{...} , c7 A* v2 [7 Z9 I  q. J
( J2 Z, e& M7 ?1 I- u, n3 c* Q! w
end; 6 L$ E7 n- V5 E6 X& K# Y' w! ^$ x
7 H1 H, p* h; ?# d* B" ^8 A3 |( i& y
procedure DoSomething (a : real); * j$ @+ X4 B: w
8 T8 s6 o! \# P9 A5 l
begin
4 O! Q5 f, |) ~* }! l- T
" L$ W0 C' R- u; A{...}
# n4 A$ M$ I  j; j  L* L, J: i' b
! R3 c$ U) `$ K2 lend; * }$ C8 U5 [5 m( o+ [+ O3 X& |2 m; j+ s( e
, S! H! d( G! _& i) M+ @
可以使用不同的参数类型longint或者real来调用不同的DoSomething过程。 - _6 I; a3 H$ e" i5 @0 ?

5 G9 F% _6 b# j' s7 T; v, o6 a8 [2 ]由于这个功能,函数的提前声明必须有完整的参数声明:
  u( }" l6 ]- O/ s, ?" b* @, ], @* R" v
procedure x (v : longint); forward; $ N2 }, |, K; o( N8 P; Y# {

" [- j( P+ F- W) |! y7 `7 B{...}
) _& E% y. s& F8 p3 S/ S
! m* m. ?) v. u1 D4 w  x7 f3 r; Jprocedure x;{ 这里定义的过程x重载了前面声明的过程x。因此这里的两个x是不同的}
+ [, Y$ k$ G% t* }- H+ p) d
% J# S+ C  N0 e6 Abegin ; U3 N; }' \7 r" f: Z0 M& {, i

' m' s- s8 ?: h{...}
; c: D8 P# d6 n8 M
+ t; u* H! }' f6 mend; ) \8 X# l! Q5 Y# ?

. R  U7 o6 q& G- U% G- _6 G& o5.Free Pascal容许运算符重载。比如,可以自己为矩阵运算定义一个“+”运算。 + `8 K8 H0 P& [( ]& c0 K0 ]: p

! Z4 G4 J8 }4 x6 x' O+ E6.Free Pascal在windows 95及其以上的windows版本上支持长文件名。对于文件名,由于windows系统对大小写不敏感,因此在程序中,文件名的大小写是无关的。但是对于其它大小写敏感的系统,比如linux,程序中用到的文件名必须和系统中的文件名完全一致。但是由于信息学竞赛的评测系统一般是linux,因此要求程序中的文件名和系统中的文件名一样。

TOP

不知该说些什么

不知该说些什么。。。。。。就是谢谢" t# k# b3 ?$ p1 U( c% n/ W$ |3 z( ^

# T) d2 r- W, W' u: Q) ^2 d( f-------------------------
* f% ^  p! C. C$ I6 D, j& NWe provide all WoW Gold services. You can buy  WoW Gold Cheap WoW Gold here!( \  ~/ ^; W% T
Welcome to our website for you World of Warcraft Gold,WoW Gold,Cheap World of Warcraft Gold,buy cheap WoW Gold,real WoW Gold,sell WoW Gold,
网络游民

TOP

发新话题