C与FORTRAN的差别

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/c.htm

2. C语言和Fortran语言的差异

由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会:

C 最大的优点在于灵活,不但可以藉由 struct 来定义新的数据结构,同时 C 的pointer 更可以让我们自由而且有效率地处理大数据。而在 UNIX 系统中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的 C 函数库,直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为:

* 复数运算的速度

* 程序参数与字串

* 内存的动态管理

* 多维阵列的处理

* 函数调用与参数传递

2.1. 复数运算的速度

在进行复数运算的时候,C++ 可以定义复数的 class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用 inline function 的方式,但会遇到以

下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是 compiler做了很多工作,还是要付出相当的计算时间代价的。

至于 Fortran,最大的优点在于复数 (complex number) 的运算,复数是 Fortran 的基本数据类型之一,这正是 C 所缺乏的 (C 基本上只有实型与整型类型而已)。虽然C 也可以由 struct 的定义,达到复数四则运算的目的,但却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性。因此,在大量而且要求高速的复数运算场合, Fortran 实际上比 C 还要适合。

然而既然复数已是 Fortran 基本数据类型之一,则 Fortran compiler在设计上可以做到对复数特别的 optimization,例如如果遇到较短的复数运算式,它可以用“心算”直接得出 real_part 与 imag_part 的 expression,像这样:

real(a) =……;imag(a) = …….

如此只需两步就得到结果。直到遇到太长太复杂的算式,才去做拆解的动作。

这样使用 C 来做复数运算可能需要绕圈圈,而且绕出来的圈圈可能还不小。不过如果程序中需要复合的数据结构,如一个自定义的数据结构中既有浮点数、整数、还有字符串时, Fortran 只有举白旗投降了。当然, Fortran 如果要做还是可以做,只是不太方便,而且可能也需要绕圈圈。但如果使用 Fortran 90 则不成问题了,因为 Fortran 90 也有类似 C 的 struct 结构以定义复合的数据类型。

2.2. 程序参数与字串

C 程序可以有参数串列, Fortran 则没有。例如,当程序执行时,必须输入 a, b, c

三个参数,在 C 可以这样写:

int main(int argc, char **argv)

{

int a, b, c;

a = atoi(argv[1]);

b = atoi(argv[2]);

c = atoi(argv[3]); }

而程序执行时,参数就是这样传入: a.out 12 15 18

Fortran 却没有办法,要传入任何参数,只能透过对话的方式:

integer a, b, c

c ------------------------------------

write(*,*) ''please input integer a:''

read(*,*) a

write(*,*) ''please input integer b:''

read(*,*) b

write(*,*) ''please input integer c:''

read(*,*) c

c ------------------------------------

end

2.3. 内存的动态管理

C 可以动态分配存储空间给任何数据类型,而Fortran 却不行。

例如:

float *c_function(int cnt)

{

float *a;

a = malloc(sizeof(float) * cnt);

/*

* 操作 array a.

*/

return a;

}

而且如果在程序执行过程中,如果不再需要这个 array a 了,还可以随时释放a

所占用的存储空间。而 Fortran 在一般情况下是不行的,因此在一般的 Fortran 程序中,常见所有需要用的 array, 都是在 MAIN__里头就配置好记存储空间,再一个个传入subroutine 里头来用,例如:

program fout

c ----------------------------

integer cnt

parameter (cnt^P00)

real a(cnt)

call f_routine(cnt, a)

end

c ----------------------------

subroutine f_routine(cnt, a)

c ----------------------------

integer cnt

real a(cnt)

c

c 操作 array a.

c

end

这里的 parameter 是设定变数的固定值,其作用就相当于 C 的 const 一样,经设定后的参数就是一个无法改变其值的常数了。有的时候,在某个函数中我们临时需要一个暂存阵列,但等到计算完成离开函数后,该阵列就没有用了,这在 C 可以做的很划算,即进入函数时malloc() 一个阵列,离开前再 free() 掉它。但在 Fortran 中却别无选择,一定要在 MAIN__ 里头先将暂存阵列配置好,再一起传入 subroutine 中。

相关文档
最新文档