C与FORTRAN的差别
fortran用法总结
我的Fortran基本用法小结周日, 10/14/2007 - 21:00 — gator一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。
只读到第九章,主要是3~9章,都是最基本的用法(原书共16章)。
这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。
希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。
要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九应该很快的,花一两天就行了。
觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。
外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没得及仔细想,只是按着作者的意思去理解。
所以这份笔记还处于纸上谈兵的层次。
如果有不妥的方,希望大家指正。
谢谢!文中蓝色的部分是程序代码,!后面的内容为注释。
二、概述1、名词解释Fortran=For mula Tran slator/Translation一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。
的确,从一开始,IBM设计的时候就是为了方便数值计算和科学数据处理。
设计强大的数组操作就是为了实现这一目标。
ortran奠定了高级语言发展的基础。
现在Fortran在科研和机械方面应用很广。
2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortran90。
ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看77程序。
以下是77和90的一些格式上的区别。
C与其他编程语言的比较优势与劣势分析
C与其他编程语言的比较优势与劣势分析在计算机编程领域,有众多的编程语言可供使用,每种编程语言都有其独特的特点和适用的领域。
而C语言作为一种广泛使用的编程语言,具有自身的优势和劣势。
本文将就C语言与其他编程语言进行比较,分析其优势与劣势。
一、C语言的优势1. 简洁高效:C语言注重底层,以及对计算机系统的直接控制,具有较高的执行效率和性能。
其语法简洁,能够进行底层的内存管理和操作,适用于开发底层系统和高性能应用。
2. 强大的指针操作能力:C语言拥有强大的指针操作能力,允许直接对内存进行操作,实现对底层系统和硬件的灵活控制。
这也为C语言提供了广泛的应用场景,如嵌入式系统开发等。
3. 与硬件接口紧密:C语言能够与硬件接口紧密结合,调用底层的汇编指令,实现对硬件设备的直接读写和控制。
这使得C语言成为开发驱动程序和嵌入式系统的首选语言。
4. 丰富的库支持:C语言拥有众多的开源和商业库,提供了丰富的函数和数据结构,便于开发者开发各种复杂的应用。
同时,C语言也具备良好的兼容性,可以方便地与其他语言进行接口调用和混合编程。
二、C语言的劣势1. 缺乏内置的面向对象机制:C语言是一种面向过程的编程语言,缺乏内置的面向对象机制。
虽然可以通过结构体和函数指针等方式来实现面向对象的编程思想,但相对于一些专门的面向对象语言,如Java和C++,使用起来不够便捷和直观。
2. 容易出现指针和内存管理错误:由于C语言对指针的灵活使用,容易出现指针相关的错误,如空指针引用、野指针等。
同时,C语言需要手动管理内存,容易出现内存泄漏和内存溢出等问题,需要开发者具备较高的内存管理能力。
三、C语言与其他编程语言的比较1. C语言与Java的比较:C语言注重底层操作和性能,适用于开发系统级和嵌入式应用,而Java更注重跨平台性和开发效率,适用于大型企业级应用。
此外,C语言需要手动管理内存,而Java具有自动垃圾回收机制,开发起来更加简单方便。
C_与Fortran混合编程技术
11
研究与探讨
C++ 编程语言的调用 ABDS软件是在AutoCAD R14图形平台上开发实
2 C++ 语言和 Fortran 语言的差异
FORTRAN 语言发展之初就被认为是科学计算的 专用语言 C最初出现是用作UNIX操作系统的记述 语言 发展之初一直作为 较低级语言 编写与硬 件关系密切的底层软件 由于 UNIX 的成功和广泛 使用 C 语言开始流行起来 并成为一种普遍使用 的程序设计语言
研究与探讨
C++ 与 Fortran 混合编程技术
王红林 刘岩 边保林 梁晓 中国建筑科学研究院计算中心
摘要 本文简要介绍了采用 C++ 与 Fortran 混合编程技术 分析表明 ABDS 采用混合编程技术 极大地保
护了已有的分析资源 同时又充分享受到 C++ 带来的方便和快捷 关键词 混合编程 面向对象 调用协议
ABDS 软件中 采用 Fortran语言编写结构计算 分析程序 采用 C++编写交互输入界面和图形处理 以及辅助设计部分 本文重点介绍ABDS软件中C++ 与 Fortran 混合编程技术
1 C++ 语言和 Fortran 语言的发展
在程序设计语言的发展过程中 FORTRAN 语言 被认为是科学计算的专用语言 后来推出的 FOR- TRAN 90 和 FORTRAN 95 版本也不例外 它们虽然 可以完全实现 C++ 语言同样的功能 然而其软件开 发环境和软件的集成性等方面都远不如 C++ 语言 近年来 随着计算机软硬件技术的发展 数据结构 数据库管理技术 可视化与计算机图形学 用户接 口 系统集成以及人工智能等领域的成果被逐渐应 用到结构分析软件中 结构分析软件的设计并不仅 仅局限于单一的科学计算 需要涉及众多的软件开 发领域 C++ 语言可以提供这类软件开发所需的功 能 而用 FORTRAN 90 却很难实现 另一方面 从 软件的编程环境来看 目前 FORTRAN 90 的编译器 极少 而 C++ 语言的编译系统相当普及 可以运行 在各种机型上 便于实现跨平台的软件系统集成
[转载]Fortran程序基本特点及不同版本之间的区别
[转载]Fortran程序基本特点及不同版本之间的区别原⽂地址:Fortran程序基本特点及不同版本之间的区别作者:caodanping_7141、F77和F90的区别名称:F77固定格式(fixed format),程序代码扩展名:.f或.for,F90⾃由格式(free format),扩展名:.f90格式:F77每⾏前六个字符不写程序代码,可以空着或者1-5字符使⽤数字来标注⾏代码(⽤作格式化输⼊出等),7-72为程序代码编写区,73⾏后被忽略,超过的话可以续⾏,F90每⾏可132字符注释:F77以C,c或*开头的⾏被当成注释;F90以"!"引导注释,也可放在⾏尾续⾏:F77所续⾏的第六个字符是"0"以外的字符,通过⽤+表⽰,F90以&续⾏,放在该⾏末或下⾏初均可变量名:F77⽀持6个字符长,F90⽀持31个字符长常数:F90中PARAMETER可以做形容词,和变量声明同时写在⼀起Real, parameter :: pi=3.1415926关系运算符:F90: == /= > >= < <= (更接近标准的数学符号)F77: .EQ. .NE. .GT. .GE. .LT. .LE.逻辑运算符:.AND. .OR. .NOT. .EQV. .NEQV.变量声明赋值:(1)integer: kind=1,2,4(长整型)F90: integer(kind=2) aInteger(kind=4)::a=15(加上两个冒号可以在定义时就直接赋值)F77: integer*2 b or integer(2) c⽤DATA命令单独赋值(属于声明),data b,c /1, 2.0/Fortran规定变量名以字母IJKLMN六个字母开头的即认为是整型变量(I-N规则),其他字母开头的为实型变量(2)real:kind=4,8(双精度)/real* 8=double precision(1.23E3/1.23D3)F90:real(kind=4) a, F77:real*4 a or real(4) a(3)complex kind=4,8(双精度)F90: complex(kind=4) a a=(3.1,2.5)(4)character len为最⼤长度(26个字母,数字0-9,专⽤字符13个:空格'$()+-*/,=.:)F90: character(len=10) c c=”Hello”, F77: c=’Hello’(5)logical kind=4,2(最少只需要1即可)F90: logical(kind=4) a a=.true.(6)⾃定义类型type:类似于C中的structF90: type::person ……引⽤时变量和元素直接以%区隔,visual fortran可以⽤.来表⽰全局变量全局变量:F77采⽤command来声明全局变量,编译器只提供内存共享⽽不去检查数据类型,使⽤时需要注意定义的是否⼀主程序和主程序中致,⽽F90则提供了module(不是函数,⽤于封装程序模块),可以把全局变量都声明在module中,这样主程序和主程序中就不需要编写重复的程序代码来声明全局变量就不需要编写重复的程序代码来声明全局变量了,函数在需要使⽤时只需要⽤use来调⽤该module_name即可:module module_name...end module还可以把功能上相关的函数放在同⼀个module模块中,程序想要调⽤时use该module才能调⽤,这样⽐较符合模块化的概念,在该module中⽤contains引导函数即可。
fortran c c++发展历史
一、Fortran的发展历史Fortran(Formula Translation)是一种编程语言,最初在1950年代由IBM开发。
它是世界上第一种广泛使用的高级编程语言,专门用于科学和工程计算。
Fortran的发展和演变可以追溯到上世纪50年代。
1. 1954年,IBM开发了Fortran 0的原型,并在1957年发布了Fortran I版本。
这是世界上第一种高级编程语言,为科学和工程计算提供了便利。
2. 1962年发布了Fortran II版本,引入了子程序(subroutines)和函数(functions)的概念。
这为程序员提供了更大的灵活性和模块化的能力。
3. 1966年发布了Fortran 66版本,这是第一个被ANSI(美国国家标准协会)认可的Fortran标准。
它引入了更多的数学函数、标准化输出和输入,以及更好的程序结构。
4. 1977年发布了Fortran 77版本,这个版本增加了对结构化编程的支持,引入了逻辑表达式、控制结构和一些新的内建函数。
5. 1990年发布了Fortran 90版本,这个版本是最重大的变革之一。
它引入了模块化的概念、动态内存分配、指针、以及其他一些现代编程语言所具备的特性。
6. 2004年发布了Fortran 2003版本,新增了一些新的特性,如对C 语言的互操作性、新的数组操作符等。
还引入了一些更为现代的编程特性,如异常处理、并行编程等。
7. 目前最新的版本是Fortran 2018,它在之前版本的基础上进一步完善和扩展了一些功能,使得Fortran更适合于现代科学和工程计算的需求。
二、C语言的发展历史C语言是一种通用的高级编程语言,由美国计算机科学家丹尼斯·里奇(Dennis Ritchie)于20世纪70年代初在贝尔实验室设计开发。
C 语言的设计目标是提供一种能以简洁方式编写系统软件的编程语言。
1. 1972年,贝尔实验室的丹尼斯·里奇开始设计C语言,并在1978年正式发布了第一个正式的C语言标准。
FORTRAN语言
⑤继续语句 continue ⑥call s(d1,d2,…,dn)
return (在end前)
(3) 输入、输出语句
read(u1,n1), write(u2,n2)
u1: 输入设备通道号:(1~7)
u2: 输出设备通道号:(1~7) 若u1,u2为“*”,则分别表示按键盘格式输入、屏幕表 列 输出。 n表示格式说明:
例3:有三个数x,y,z,要求打印出其中最大的数。 cha1-3.f: read(*,20)x,y,z 20 format(3F10.4) big=x if(y.gt.big)big=y if(z.gt.big)big=z write(*,*)’big=’,big end
④ 循环do语句
循环变量的初值 循环的终止值 循环增量值(省略则默认为1)
2. 语句书写的格式
第1列有字符C时(注释行),不参加编译和运行。 FORTRAN90普遍用!放在语句后,但该句参与 本行在它后面的所有均被定义为注释。 运行。 当第6列上有非零和非空格的字符时,表明此行 为上行的继续行。例如:&
语句在7~72列中;语句标号1~5列。
FORTRAN77扩展名为: *.f或*.for FORTRAN90无严格限制(以.f90为后缀)
②维数语句: dimension r(i)或r(i, j, k) real*8 a(i), complex*16 r(i) ③公用语句: common w1, w2 主程序与子程序w1,w2同变量 ④参数语句: parameter v1=c, v2=c
(2)format语句 (3)data语句(数据初值语句) • data v1/d1/,v2/d2/,…vn/dn/ • 或 data v1,v2,…,vn/d1,d2,…,dn/
[转载]Fortran 77, C, C++ 和 Fortran 90 的比较
[转载]Fortran 77, C, C++ 和 Fortran 90 的比较收藏发信人: quasar (飞贼克斯), 信区: Fortran标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载)发信站: 南京大学小百合站 (Tue Jun 1 10:59:14 2004)瀚海星云 -- 文章阅读 [讨论区: MathTools]发信人: HuiCai (老灰菜), 信区: SciComp标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载)发信站: 瀚海星云 (2002年12月19日10:40:38 星期四), 站内信件【以下文字转载自 Fortran 讨论区】【原文由 HuiCai 所发表】Fortran 77, C, C++ 和 Fortran 90 的比较/develop/article/16/16085.shtm三十年来, 从 Fortran 77 开始, Fortran 成为了计算科学的主要语言.在这段时间里, Fortran 的数值能力变得非常稳定而且优于其它计算机语言; 最大的改变来自于不断增长的各种可靠的数值过程库的种类. Fortran 联合(union), 它的使用技巧, 扩充的数值库为计算科学赋予了良好的基础.可是在过去十几年中, 动态数据结构(特别是动态数组)的重要性不窜上升, UNIX 工作站, 复杂的交互式可视化工具, 以及更近的并行体系结构--Fortran 77 都没有实现--刺激了其它语言作为计算语言的使用, 最明显的一个例子是C. 最近C++ 也已经引起人们的兴趣, Fortran 通过发展到 Fortran 90来弥补它在现代科学计算方面的不足. 这部分的一个通常的工作是比较四种语言对科学计算的适应性的, 这四种语言是两个C 的代表(C, C++) 和两个Fortran的代表(Fortran 77, Fortran 90). 下面的表格总结了这种比较, 后面的内容试图合理地解释这种等级排序, 从最好(1)到最差(4)..功能 ------------ F77 - C - C++ - F90数值健壮性 ---- 2 ---- 4 --- 3 ----- 1数据并行性 ---- 3 ---- 3 --- 3 ----- 1数据抽象 ------- 4 ---- 3 --- 2 ----- 1面向对象编程 - 4 ---- 3 --- 1 ----- 2函数型编程 ---- 4 ---- 3 --- 2 ----- 1平均等级 ------ 3.4 - 3.2 - 2.2 -- 1.21 数值健壮性Numeric Polymorphism(数值多态性)中是一个给定一个通用名称的几种版本的图形平滑过程的例子. 这里描述的通用能力是作为Fortran 90提供的一种额外的数值健壮性超过Fortran 77和C的特性. Fortran 77, Fortran 90 , 和 C 版本的SMOOTH子过程也在下面给出, 用于比较. (注意, Fortran 90版使用了第4部分描述的并行性)数值多态性, 加上实际类型的参数, 小数精度选择, 和数字环境变量检查等, 证明了Fortran 90排在这四种语言中的第一位. Fortran 77 列在第二为的原因在于它支持复杂变量, 这在很多计算科学应用中是很重要的. C ++ 把 C 挤出了第三位是由于它在通常领域多态性上的能力.2 数据并行化部分在这四种语言中, 只有Fortran 90具有对科学计算有价值的数据并行能力; 其它三种语言在这方面的特性基本上是一样的, 即全都没有. 这解释了四种语言在这个方面的排名.这里是完成高斯消去的一套Fortran 77 和 C 过程:****************************************************************** 编程决定正确的子过程处理过程: pivot.f , triang.f , 和 back.f. ** 子过程决定一系列同步方程的解*******************************************************************234567PROGRAM testgINTEGER IMAX, JMAXPARAMETER (IMAX = 3, JMAX = 4)REAL matrix(IMAX, JMAX)REAL matrix(IMAX)INTEGER i, j, nDATA ( ( matrix(i,j), j = 1, JMAX), i = 1, IMAX)+ /-1.0, 1.0, 2.0, 2.0, 3.0, -1.0, 1.0, 6.0,+ -1.0, 3.0, 4.0, 4.0/n = IMAXwrite(*,*) \"The original matrix,\",n,\"by\",n=1,\":\"call wrtmat(matrix, n, n +1)call pivot(matrix, n)write(*,*) \"The matrix after pivoting:\"call wrtmat(matrix, n, n +1)call triang(matrix, n)write(*,*) \"The matrix after lower triangulation:\"call wrtmat(matrix, n, n + 1)call back(solvec, matrix, n)write(*,*) \"The solution vector after back substitution:\"write(*,*) \"********************************************\"write(*,*) (solvec(i), i = 1, n)write(*,*) \"********************************************\"end******************************************************************** *子过程决定第一列系数矩阵的最大值, 把最大值所在的行和第一行交换, **处理器然后重复对其他的行和列做这种处理, 对于每一次叠代, 列的位置**和行的位置增加一(即, 第1行-第1列, 然后第2行-第2列, 然后第3行-第 **3列, 等 ********************************************************************* *234567SUBROUTINE pivot(matrix, n)INTEGER i, j, k, nREAL matrix(n, n + 1), maxval, tempvaldo 10, j = 1, nmaxval = matrix(j,j)do 20, i = j + 1, nif (maxval .lt. matrix(i,j)) thenmaxval = matrix(i,j)do 30, k = 1, n + 1tempval = matrix(i,k)matrix(i,k) = matrix(j, k)matrix(j,k) = tempval30continue20 continue10 continueend****************************************完成一个输入矩阵的低级分解的子过程 *****************************************234567SUBROUTINE triang(matrix, n)INTEGER i, j, k, nREAL matrix(n, n + 1), pivot, pcelemdo 10, j = 1, npivot = matrix(j,j)do 20, k = j + 1, n + 1matrix(j,k) = matrix(j,k) / pivot20 continuedo 30, i = j + 1, npcelem = matrix(i,j)do 40, k = j + 1, n + 1matrix(i,k) = matrix(i,k) - pcelem * matrix(j,k)40 continue30continueend********************************************************** * 子过程从一个已经经历了低级分解的参数矩阵计算一个解向量 *********************************************************** *234567SUBROUTINE back(solvec, matrix, n)REAL solvec(n), matrix(n, n + 1), sumsolvec(n) = matrix(n, n + 1)do 10, i = n -1, 1, -1sum = 0.0do 20, j = i + 1, nsum = sum + matrix(i, j) * solvec(j)20 continuesolvec(i) = matrix(i, n + 1) - sum10 continueend*********************************************************** * 测试子过程bisec.f的程序, bisec.f 决定一个方程(f.f中)的解** 可是这个函数确实假设函数-f由两个值支撑. 即在用户给定的终** 点之间的解不超过一个************************************************************ *234567PROGRAM testbsREAL xleft, xrightREAL fEXTERNAL fwrite(*,*) \"Please enter an initial left and right value:\"read(*,*) xleft, xrightcall bisec(f, xleft, xright)end这里是同一个算法的C 过程:/********************************************************* 决定三个函数(pivot.c, triang.c, back.c)正确处理的程序 ** 这些函数决定了一系列同步方程的解*********************************************************/#include <stdio.h>#define IMAX 3#define JMAX 4float matrix[IMAX][JMAX] = {{-1.0, 1.0, 2.0, 2.0 },{3.0, -1.0, 1.0, 6.0 },{-1.0, 3.0, 4.0, 4.0 }};float solvec[IMAX] = { 0.0, 0.0, 0.0 };main(){void wrt_output(void);void pivot(void);void triang(void);void back(void);void wrt_vector(void);(void)printf("The original matrix %d by %d :\n", IMAX, JMAX);(void)wrt_output();(void)pivot();(void)printf("The matrix after pivoting:\n");(void)wrt_output();(void)triang();(void)printf("The matrix after lower decomposition:\n");(void)wrt_output();(void)back();(void)printf("The solution vector after back substitution:\n");(void)wrt_vector();}/*********************************************************** * 决定参数矩阵中第一列的最大元素并移动第一列含有最大值的行 ** 到第一行. 然后重复对其他的行和列做这种处理, 对于每一次叠 ** 代, 列的位置和行的位置增加一(即, 第1行-第1列, 然后第2行- ** 第2列, 然后第3行-第3列, 等*************************************************************/ void pivot(){int i, j, k;float maxval, tempval;for(j = 1; j < IMAX; j++) {maxval = matrix[j][j];for ( i = (j + 1); i < IMAX; i++) {if ( maxval < matrix[i][j] ) {maxval = matrix[i][j];for( k = 0; k <= IMAX; k++) {tempval = matrix[i][k];matrix[i][k] = matrix[j][k];matrix[j][k] = tempval;}}}}}/************************************ 完成一个输入矩阵的低级分解的函数 *************************************/void triang(void){int i, j, k;float pivot, pcelem;for ( j = 0; j < IMAX; j++) {pivot = matrix[j][j];for ( k = ( j + 1 ); k <= IMAX; K++) {matrix[j][k] = matrix[j][k] / pivot;}for ( i = ( j + 1 ); i < IMAX; i++) {pcelem = matrix[i][j];for ( k = ( j + 1 ); k <= IMAX; k++) {matrix[i][k] = matrix[i][k] - ( pcelem * matrix[j][k] );}}}}/********************************************************* * 子过程从一个已经经历了低级分解的参数矩阵计算一个解向量 **********************************************************/ void back(void){int i, j;float sum;solvec[IMAX - 1] = matrix[IMAX - 1][JMAX -1];for ( i = (IMAX -1); i > -1; i--) {sum = 0.0;for ( j = (i + 1); j < IMAX; j++) {sum = sum + matrix[i][j] * solvec[j];}solvec[i] = matrix[i][IMAX] - sum;}}void wrt_output(void){int i, j;(void)printf("**************************************\n");for ( i = 0; i < IMAX; i++) {for ( j = 0; j < (JMAX - 1); j++) {(void)printf("%f", matrix[i][j]);}(void)printf("%f\n", matrix[i][JMAX - 1]);}(void)printf("****************************************\n"); }void wrt_vector(void);{(void)printf("*************************************\n");(void)printf("%f", solvec[0]);(void)printf(" %f", solvec[1]);(void)printg(" %f\n", solvec[2]);(void)printf("****************************************\n");}/************************************************************ 测试函数bisec.f的程序, bisec.f 决定一个方程(f中)的解** 可是这个函数确实假设函数-f由两个值支撑. 即在用户给定的终 ** 点之间的解不超过一个 *************************************************************/#include <stdio.h>#include <math.h>main(){void bisec(float init_left_val, float init_right_val);float f(float value):float xleft, xright;char line[100];(void)printf("Please enter an initial left and right value:");(void)fgets(line, sizeof(line), stdin);(void)sscanf(line, "%f %f", &xleft, &xright );(void)bisec(xleft, xright);return(0);}3 数据抽象Fortran 90有一个非常使用的,使用简单的数据抽象能力。
FORTRAN和C 对比
六、表达式
算术表 达式
fortran 1. ** 乘方 2. * 乘、/ 除 3. + 加、- 减
关系表 达式
逻辑表 达式
条件表 达式
1. <、<=、>、>= 2. ==、/= 1. .AND. 2. .OR. 3. .NOT. 4. .EQV. 5. .NEQV. 无
赋值表 1. = 达式
逗号表 无 达式
五、输入和输出语句
输入输 出
输入输 出格式
fortran 输出:write(unit,fmt) A,B,C
print fmt, A,B,C 输入:read(unit,fmt) A,B,C 1. 默认输出位置和不限定输入输出
格式 write(*,*) A,B,C 2. 格式化输入输出
1) 指定代码行对应格式输入输出 write (*,100) A 100 formt(I4)
Fortran90 与 C++的比较
一、程序结构、语句和注释
程序结 构
语句
注释
fortran
C++
Program main(自定义程序名) 主程序代码
预处理命令以“#”开头,包括宏定义命 令、文件包含命令和条件编译命令
Stop(程序结束,可省)
函数,有一个主函数和若干个函数组成,
End(主程序代码结束)
主函数为 main 函数。函数体由一对花括
号“{}”括起来
每行一般为一句语句,语句末不加“;” 书写格式自由灵活,语句末加“;”
1. 每行可写 132 个字符
1. 每一行可写一条或多条语句,一条语
2. 代码开头或结尾的“&”,连接下一 行或下一行代码
fortran转c语言规则
fortran转c语言规则
1.数据类型的转换:Fortran中的数据类型在C语言中有对应的数据类型,但是它们的存储方式和取值方式可能会有所不同。
在进行转换时需要注意数据类型的兼容性。
2. 数组的转换:Fortran中的数组是列主序的,而C语言中的
数组是行主序的,因此在进行转换时需要对数组的存储方式进行转换。
3. 函数的转换:Fortran中的函数和C语言中的函数有很大的
差异,因此在进行转换时需要对函数的名称、参数、返回值等进行转换。
4. 控制结构的转换:Fortran中的控制结构和C语言中的控制
结构有很大的差异,因此在进行转换时需要对控制结构的语法和用法进行转换。
5. 文件操作的转换:Fortran中的文件操作和C语言中的文件
操作有很大的差异,因此在进行转换时需要对文件的打开、关闭、读写等操作进行转换。
总之,在进行Fortran转C语言的转换时,需要根据两种语言的语法、语义和用法进行逐一对比,找出它们之间的差异,并进行相应的转换处理。
- 1 -。
fortran转c语言规则
fortran转c语言规则
1.Fortran中变量名必须以字母开头,且长度不超过6个字符;C语言中变量名可以以字母或下划线开头,且长度没有限制。
2. Fortran中的数组下标从1开始,而C语言中的数组下标从0开始。
3. Fortran中的字符串以单引号括起来,C语言中的字符串以双引号括起来。
4. Fortran中的函数调用时,参数传递采用按位置传递的方式,而C语言中的函数调用采用按值传递的方式。
5. Fortran中的函数名不区分大小写,而C语言中的函数名区分大小写。
6. Fortran中的逻辑运算符为 .AND.、.OR.、.NOT.,而C语言中的逻辑运算符为 &&、||、!。
7. Fortran中的循环语句为 DO,而C语言中的循环语句为 for、while、do-while。
8. Fortran中的文件操作采用 OPEN、CLOSE、READ、WRITE 等语句,而C语言中的文件操作采用 fopen、fclose、fread、fwrite 等函数。
9. Fortran中的程序入口为 PROGRAM,而C语言中的程序入口为 main 函数。
10. Fortran中的注释以 ! 开头,C语言中的注释以 // 或
/*...*/ 开头。
C语言与其他编程语言的对比和区别
C语言与其他编程语言的对比和区别编程语言是现代科技领域中的重要工具,不同的编程语言有不同的特点和用途。
本文将重点探讨C语言与其他编程语言的对比和区别。
一、历史与发展C语言是一种广泛应用的编程语言,由贝尔实验室的Dennis Ritchie于1972年开发。
它的设计目标是实现系统级编程,以便开发操作系统和其他底层软件。
C语言的出现填补了高级语言与机器语言之间的空白,为编程带来了革命性的变化。
而其他编程语言如Java、Python、C++等则在C语言的基础上发展而来,各自有着不同的特点和应用领域。
二、语法与特点C语言是一种面向过程的编程语言,其语法相对简洁。
它采用了C语法的基本结构,如变量定义、函数定义、循环和条件语句等。
与其他编程语言相比,C语言的语法较为底层,更接近机器语言,因此在性能方面有一定的优势。
同时,C语言也支持指针操作,这是其与其他编程语言的一个明显区别。
指针的使用可以提高程序的效率,但也增加了程序的复杂性。
其他编程语言如Java、Python等则更加注重开发效率和易用性。
它们提供了更高级的语法和丰富的库函数,可以更快速地开发出功能完善的应用程序。
与C语言不同,这些语言通常会自动管理内存,减少了程序员的工作量和出错的可能性。
此外,Java和Python等语言还支持面向对象的编程范式,使得程序的设计更加模块化和可维护。
三、应用领域由于C语言的底层特性和高性能,它在系统级编程和嵌入式开发方面有着广泛的应用。
许多操作系统和嵌入式设备的驱动程序都是用C语言编写的。
此外,C语言还被广泛应用于网络编程、游戏开发和科学计算等领域。
其他编程语言则在不同的领域有着各自的优势。
Java被广泛应用于企业级应用开发,它的跨平台特性和强大的库函数使得开发人员可以快速构建出安全可靠的大型应用程序。
Python则因其简洁易读的语法和丰富的第三方库而成为数据分析、人工智能等领域的首选语言。
四、学习和使用难度相对于其他编程语言而言,C语言的学习和使用难度较高。
C语言和Fortran语言的差异(3) - 编程入门网
C语言和Fortran语言的差异(3) - 编程入门网共4页:源自上一页12
3
4
下一页
上一篇:C编译器的设计 下一篇:C语言中实现动态分配二维数组
/Programming/C/200710/4979_3.htm[2011-9-2 22:26:42]
C语言和Fortran语言的差异(3) - 编程入门网
C语言和Fortran语言的差异(3)
时间: 2007-10-25 温睿
2.4. 多维阵列的处理 不论是在 C 或 Fortran, 所谓的多维阵列实际 上只是一个很长的一维连续存储空间,经过分割后当 做多维阵列使用。例如,一个 C 的二维阵列声明如 下:
double a[12][10];
则它在存储空间中的配置为: |<--- 10 ---><--- 10 ---> .... <--- 10 --->| |<<-------------- 共 12 组 --------------->>| 所以它实际上是一块 12*10*sizeof(double) bytes 的连续存储区块,而经由以上的声 明,compiler 便知道当使用到它时,要将分割成每单位元素为 sizeof(double),每 10 个单位一组,而 总共 12 组的一个二维阵列,则当我们使用阵列的 index 来存取阵列元素时, compiler 也会自动算好 该元素阵列在此存储区块的位置,因此就能很方便地使用。 Fortran 也是如此,但有一个很大的不同,它的存储区块分割配置的方式是与 C 反向的。例如声明 一个二维阵列如下:
double precision a(12,10)
则它在存储空间中的配置为: |<--- 12 ---><--- 12 ---> .... <--- 12 --->| |<<--------------- 共 10 组 -------------->>| 因此,如果我们要在 Fortran 中配置一个与上头那个 C 一模一样的二维阵列时,实际上应该要将其 index 反过来:double precision a(10,12) 除此之外, C 的阵列 index 一律是从 0 开始,对于一个有 N 个元素的阵列,其最后一个 index 是 N-1,且每个阵列元素的 index 值差 1。 Fortran 不一定,要看怎么声明了。例如声明一个阵列如 下:
Fortran的主要版本及差别
、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortran90。
Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看懂77程序。
以下是77和90的一些格式上的区别。
Fortran 77:固定格式(fixed format),程序代码扩展名:.f或.for (1)若某行以C,c或*开头,则该行被当成注释;(2)每行前六个字符不能写程序代码,可空着,或者1~5字符以数字表明行代码(用作格式化输入输出等);7~72为程序代码编写区;73往后被忽略;(3)太长的话可以续行,所续行的第六个字符必须是"0"以外的任何字符。
Fortran 90:自由格式(free format),扩展名:.f90(1)以"!"引导注释;(2)每行可132字符,行代码放在每行最前面;(3)以&续行,放在该行末或下行初。
以下都是讨论Fortran 90。
3、Fortran的一些特点,和C的一些不同其实很多,在下面涉及具体方面时可以看到。
这里只是大致提一些。
(1)不分大小写(2)每句末尾不必要写分号(3)程序代码命令间的空格没有意义(4)不像C,Fortran不使用{ }(5)数据类型多出了复数和逻辑判断类型。
比如复数类型complex :: a !声明复数的方法。
复数显然方便了科学计算,满足了工程方面的需求a=, ! a=1+i(6)多出了乘幂运算(**)。
乘幂除了整数还可以是实数形式。
如开方,开立方a=**,a=**。
(7)数组有一些整体操作的功能;可以方便的对部分元素进行操作(8)有些情况下可以声明大小待定的数组,很实用的功能4、Fortran的基本程序结构先看一看所谓的"Hello Fortran"程序。
C语言和Fortran语言的差异(4) - 编程入门网
其中 c_function1() 没有返回值,而 c_function2() 有返回值。而 C 函数的参数传入则有两种方 式,正如前面的例子,一个是 call-by-value, 即 (int a),另一个是call-by-reference, 即 (float *b),二者的差别在于:call-by-value 是将参数值复制一份副本到子函数的参数列中,让子函数使用, 就算子函数改变了副本的值,也只是改变了子函数中的副本,也不会影响到上层父函数的原参数 值。Call-by-refernce 则相反,它则是将参数所在的地址当做参数传给子函数中,子函数只知道此参数 的存储空间所在的地址,它要存取该参数时,必须由此地址去找到该参数。因此,子函数使用的,其实是 与父函数相同的一个参数,故如果子函数改变了此参数的值,则父函数的参数值也跟着改变了。 而Fortran又与 C 相反了。它的函数有两种,一为 subroutine,一为 function。subroutine不会 有传回值,但 function 有传回值,就以上 C 的例子, Fortran 的写法如下:
C语言和Fortran语言的差异(4) - 编程入门网
C语言和Fortran语言的差异(4)
时间: 2007-10-25 温睿
double precision a(11:110)
这还是一个一维阵列,共 100 个元素,但第一个元素的 index 是 11, 最后一个是110 。在这里我 们可以看到, (idx1:idx2) 这样的叙述在 Fortran 中就是用来指定一个阵列的范围。 2.5. 函数调用与参数传递 C 的函数调用就只有一种方式,函数可以传入参数,也可以返回值,例如:
voidcfunction1intintcfunction2intreturnintmainvoidcfunction1cfunction2其中cfunction1没有返回值而cfunction2函数的参数入则有两种方式正如前面的例子一个是callvalue是将参数值复制一份副本到子函数的参数列中让子函数使用就算子函数改变了副本的值也只是改变了子函数中的副本也不会影响到上层父函数的原参数值
14Fortran与C的混合语言编程.pdf
参数传递
值传递还是通过引用传递 等价数据类型和数据结构 传递变量的顺序
1
Fortran & C
Fortran INTEGER(1) INTEGER(2) INTEGER(4), INTEGER INTEGER(8) REAL(4), REAL REAL(8), DOUBLE PRECISION COMPLEX(8) CHARACTER CHARACTER(n) LOGICAL(1) LOGICAL(2) LOGICAL(4) LOGICAL(8) C signed char short int int long int float double 无对应类型,可定义结构 struct complex {float r, i; } char char x[n] char short int long int
Fortran调用C语言函数
参数的调用约定:Fortran缺省参数传递为引用传递,若 在外部例程中施加了C或STDCALL调用约定,则缺省的引 用传递改为值传递(数组参数除外)。为了消除调用约定 对参数传递的影响,可以在外部例程中添加具体的参数传 递属性(REFERENCE或VALUE)声明。需要注意,参数 属性声明优先于调用约定声明,即参数属性声明最终决定 参数的传递方式。
Fortran调用C语言函数
Fortran调用C语言函数时,要在接口块中加入!MS$ ATTRIBUTES编 译伪指令告知编译器调用C函数时使用的约定
INTERFACE 例程说明语句 !定义函数FUNCTION或子例程SUBROUTINE [!MS$ ATTRIBUTES例程选项] !规定例程的调用、命名和参数传递约定 [!MS$ ATTRIBUTES参数选项] !规定参数传递的方式 例程参数声明 END 例程名称 END INTERFACE
C语言和Fortran语言的比较
C语言和Fortran语言的差异本文详细介绍C语言和Fortran语言的差异1. C++语言和Fortran语言的发展背景在程序设计语言的发展过程中,FORTRAN 语言被认为是科学计算的专用语言。
后来推出的FORTRAN90 和FORTRAN 95 版本也不例外,它们虽然可以完全实现C++语言同样的功能,然而其软件开发环境和软件的集成性等方面都远不如C++ 语言。
近年来,随着计算机软硬件技术的发展,数据结构、数据库管理技术、可视化与计算机图形学、用户接口系统集成以及人工智能等领域的成果被逐渐应用到结构分析软件中,结构分析软件的设计并不仅仅局限于单一的科学计算需要涉及众多的软件开发领域。
C++ 语言可以提供这类软件开发所需的功能,而用FORTRAN 90 却很难实现,另一方面从软件的编程环境来看,目前FORTRAN 90 的编译器极少,而C++ 语言的编译系统相当普及,可以运行在各种机型上,便于实现跨平台的软件系统集成。
2. C语言和Fortran语言的差异由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会:C 最大的优点在于灵活,不但可以藉由struct 来定义新的数据结构,同时C的pointer 更可以让我们自由而且有效率地处理大数据。
而在UNIX 系统中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的C 函数库,直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。
而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为:* 复数运算的速度* 程序参数与字串* 内存的动态管理* 多维阵列的处理* 函数调用与参数传递2.1. 复数运算的速度在进行复数运算的时候,C++ 可以定义复数的class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。
但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用inline function 的方式,但会遇到以下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是compiler做了很多工作,还是要付出相当的计算时间代价的。
Fortran与C++的比较
C++ 1) 整型(分 int, unsigned int, signed int,
short int, long int 等) 2) 实型(分 float, double, long double) 3) 逻辑型(bool) 4) 字 符 型 (char, unsigned char, signed
字符 集2
变量 命名 规则
Fortran77
C++
1) 52 个英文字母(大小写);
1) 同 Fortran;
2) 10 个数字;
2) 同 Fortran;
3) 其 它 字 符 ( 共 13 个 ):( 空 3) 其 它 字 符 : ( 空
格)’$()+-*/,(逗号)=.(小数点):(冒
格)’=+-*/,():;”?_!#%&[]|{}^<>
2.Fortran77 与 C++的比较
以下将分别从以下方面比较 Fortran77 与标准 C++(很多地方对 C 也是类似的): z 注释与语句 z 字符集和变量命名规则 z 数据结构 z 表达式(算术表达式、关系表达式、逻辑表达式) z 选择结构 z 循环结构 z 输入/输出(包括标准终端和文件) z 函数和子程序 z 其它
char) 1)C++有多种复合数据类型; 2)数组定义:a[N] (变量范围 a[0]—a[n-1], 同样的 Fortran77 数组定义变量范围为 a[1]—a[N]一定要注意!) 3 ) C++ 中 多 维 数 组 是 按 行 存 放 的 ; Fortran77 的数组是按列存放的。
2.3.2 Fortran77 与 C++数据结构对比小结 1) Fortran77 中有“I-N 规则”:在程序中的变量名中,凡以字母 I、J、K、L、M、N 六个字母开头的,即认为该变量为整型变量;以其它字母开头的变量为实型变量。 2) Fortran77 中复数是基本数据类型;C++中 Complex 是 Complex.h 头文件中定义的类。 3) Fortan77 中的字符串用单引号(’ ’)包含,C++中用双引号(“ ”)包含,单个字符 才用单引号(‘’)。在 Fortran 字符串中包含’要用’’,C++包含很多特殊字符(\a, \n, \t, \v, \b, \r, \\, \”, \’, \ddd, \xhh 等)
Fortran与C++的比较
格)’$()+-*/,(逗号)=.(小数点):(冒
格)’=+-*/,():;”?_!#%&[]|{}^<>
号)
1) 第一个字符必须为字母;
1) 第一个字符必须是字母或下划线;
2) 第一个字母后面可以跟 1-5 位数 2) 长度随系统而定,一般不要超过 31
字或字母(如果选定的变量名超过
个字符,变量名中只能使用数字、字
2 Fortran其它字符多$(多用于续行);C多”?_!#%&[]|{}^<>(其中%表示求余) 3 C++关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while(以上为ANSI C的 32 个保留字)bool catch class delete friend inline new operator private protected public template this throw try virtual等,BC和VC对保留字的扩充不同。
1) if (condition1) { … } [else if (condition2) { }]
块1
选
[ELSE IF (逻辑表达式) THEN
择
块2 ]
[…] [else{ }] (可见 C++中将 Fortran77 中块 IF 语句和逻辑 IF 语句的功能
科学计算编程中的Fortran
科学计算编程中的 Fortran科学计算编程中的 Fortran 与 C++之争自从有了程序设计语言,“哪种编程语言好”就成为了亘古不变的话题。
这个问题一经提出,必然会招来一场巨大的口水仗。
作者曾经在某些论坛上提出了类似“Fortran 和C++那个用的多”之类的问题,回帖全部达几十个以上,各种意见针锋相对,犹如 Fortran 和 C++信徒之间的“圣战”一般好看。
有很多人曾经请 C++语言之父 Bjarne Stroustrup 做一个 C++与其它编程语言的比较,而 Stroustrup 明确的拒绝了。
他指出,从技术上讲,一个所谓的“公平”的比较将会涉及到大量的技术,这是一个工作量巨大的任务,绝对不是简单的用 C++和其它语言写同一段代码然后比较其运行时间就能完成的。
这种比较涉及到具体的应用领域和用户需求,所处理的信息类型,编译器的质量(不同语言的编译器开发的投入是有相当大差别的),程序员的水平与“偏好”,编程语言的标准(如究竟是 C++97 与 Fortran90 比较,还是应该C++0x 与 Fortran2019 比较?)等等。
他甚至认为,这种比较是“rarely meaningful”的[1]。
因此,今天作者也不打算为某种编程语言摇旗呐喊,而是仅就科学计算编程领域,特别是,限于作者专业即量子化学和分子模拟,来谈一谈两大“主流”编程语言: Fortran 和 C++的在理论化学界的应用历史,以及某些人(包括作者)对它们的看法。
1 Fortran 的美好时代毋庸置疑, 1957 年出现的 Fortran 是世界上第一个高级编程语言。
它的出现,大大降低了普通科研人员学习编程的门槛,而且增强了代码的可移植性。
在此之前,人们都是用机器语言直接书写程序,这种语言对于一般人而言难度太大了,而且是与运行机器相关,因此很难写出高效且具有可移植性的程序。
例如, Roothaan 在研究原子自洽场的计算时专门为 IBM 7030 数字计算机写了一些程序,这些程序用来优化 Slater 基组已经 10 多年了。
编程语言的性能比较
编程语言的性能比较编程语言的性能一直是开发者关注的重点之一。
在选择合适的编程语言时,了解它的性能特点和优势劣势对于项目的成功实施至关重要。
本文将对几种常见的编程语言进行性能比较,并探讨它们在不同情境下的适用性。
一、C语言C语言是一种广泛应用于系统开发和嵌入式设备的高级编程语言。
C语言以其高效的执行速度和低级别的硬件访问能力而闻名。
由于其直接操作内存的特性,C语言在对硬件进行控制和优化方面有着独特的优势。
它的代码执行效率高,适用于对性能要求较高的应用场景,如操作系统和游戏引擎开发。
二、C++语言C++语言是在C语言基础上发展而来的一种编程语言。
它保留了C语言的高效性能特点,并引入了面向对象的编程范式。
与C语言相比,C++语言提供了更多的抽象和封装方式,使得开发更加灵活和高效。
C++语言适用于各种应用场景,尤其在嵌入式系统和游戏开发中广泛应用。
三、Java语言Java语言是一种面向对象的编程语言,以其跨平台和易于开发的特点而被广泛采用。
与C和C++不同,Java语言通过虚拟机(JVM)来执行和管理代码。
虚拟机提供了自动内存管理和垃圾回收机制,这在一定程度上牺牲了执行速度,但提供了更大的便利性和安全性。
Java适用于开发企业应用和大规模分布式系统。
四、Python语言Python语言是一种解释性的高级编程语言,以其简洁的语法和强大的库支持而备受开发者青睐。
Python的执行速度相对较慢,这主要是由于解释器执行代码时的额外开销。
Python适用于各种领域的开发,尤其是数据分析、人工智能和Web开发。
五、Go语言Go语言是Google开发的一种编程语言,以其高效的执行速度和并发性能而受到关注。
Go语言的设计目标是简单、高效和易于并发开发。
它提供了丰富的并发原语和轻量级线程(Goroutine),适用于服务器开发和分布式系统。
六、性能比较在性能比较方面,C、C++和Go语言通常被认为是表现最好的选择。
它们的底层特性和对硬件的直接控制能力,使得它们在执行速度和内存利用方面具有明显的优势。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/c.htm2. 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 18Fortran 却没有办法,要传入任何参数,只能透过对话的方式:integer a, b, cc ------------------------------------write(*,*) ''please input integer a:''read(*,*) awrite(*,*) ''please input integer b:''read(*,*) bwrite(*,*) ''please input integer c:''read(*,*) cc ------------------------------------end2.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 foutc ----------------------------integer cntparameter (cnt^P00)real a(cnt)call f_routine(cnt, a)endc ----------------------------subroutine f_routine(cnt, a)c ----------------------------integer cntreal a(cnt)cc 操作 array a.cend这里的 parameter 是设定变数的固定值,其作用就相当于 C 的 const 一样,经设定后的参数就是一个无法改变其值的常数了。
有的时候,在某个函数中我们临时需要一个暂存阵列,但等到计算完成离开函数后,该阵列就没有用了,这在 C 可以做的很划算,即进入函数时malloc() 一个阵列,离开前再 free() 掉它。
但在 Fortran 中却别无选择,一定要在 MAIN__ 里头先将暂存阵列配置好,再一起传入 subroutine 中。
2.4. 多维阵列的处理不论是在 C 或 Fortran,所谓的多维阵列实际上只是一个很长的一维连续存储空间,经过分割后当做多维阵列使用。
例如,一个 C 的二维阵列声明如下:double a[12][10];则它在存储空间中的配置为:|<--- 10 ---><--- 10 ---> .... <--- 10 --->||<<-------------- 共 12 组 --------------->>|所以它实际上是一块 12*10*sizeof(double) bytes 的连续存储区块,而经由以上的声明,compiler 便知道当使用到它时,要将分割成每单位元素为 sizeof(double),每 10 个单位一组,而总共 12 组的一个二维阵列,则当我们使用阵列的 index 来存取阵列元素时, compiler 也会自动算好该元素阵列在此存储区块的位置,因此就能很方便地使用。
Fortran 也是如此,但有一个很大的不同,它的存储区块分割配置的方式是与 C 反向的。
例如声明一个二维阵列如下:double precision a(12,10)则它在存储空间中的配置为:|<--- 12 ---><--- 12 ---> .... <--- 12 --->||<<--------------- 共 10 组 -------------->>|因此,如果我们要在 Fortran 中配置一个与上头那个 C 一模一样的二维阵列时,实际上应该要将其 index 反过来:double precision a(10,12)除此之外, C 的阵列 index 一律是从 0 开始,对于一个有 N 个元素的阵列,其最后一个 index 是 N-1,且每个阵列元素的 index 值差 1。
Fortran 不一定,要看怎么声明了。
例如声明一个阵列如下:double precision a(100)则此阵列 index 是从 1 开始,最后一个是 100, 每个的值差 1。
不仅如此,Fortran 还可以这样声明:double precision a(11:110)这还是一个一维阵列,共 100 个元素,但第一个元素的 index 是 11, 最后一个是110 。
在这里我们可以看到, (idx1:idx2) 这样的叙述在 Fortran 中就是用来指定一个阵列的范围。
2.5. 函数调用与参数传递C 的函数调用就只有一种方式,函数可以传入参数,也可以返回值,例如:void c_function1(int a, float *b){........}int c_function2(int a, float *b){int r;........return r;}int main(void){int a, r;float b;c_function1(a, &b);r = c_function2(a, &b);}其中 c_function1() 没有返回值,而 c_function2() 有返回值。
而 C 函数的参数传入则有两种方式,正如前面的例子,一个是 call-by-value, 即 (int a),另一个是call-by-reference, 即 (float *b),二者的差别在于:call-by-value 是将参数值复制一份副本到子函数的参数列中,让子函数使用,就算子函数改变了副本的值,也只是改变了子函数中的副本,也不会影响到上层父函数的原参数值。
Call-by-refernce 则相反,它则是将参数所在的地址当做参数传给子函数中,子函数只知道此参数的存储空间所在的地址,它要存取该参数时,必须由此地址去找到该参数。
因此,子函数使用的,其实是与父函数相同的一个参数,故如果子函数改变了此参数的值,则父函数的参数值也跟着改变了。
而Fortran又与 C 相反了。
它的函数有两种,一为 subroutine,一为 function。
subroutine不会有传回值,但 function 有传回值,就以上 C 的例子, Fortran 的写法如下:subroutine f_function1(a, b)integer areal b........endinteger function f_function2(a, b)integer areal b........f_function2 = ....endprogram foutinteger a, r, f_function2real bc -----------------------------------call f_function(a, b)r = f_function2(a, b)end若从 C 的观点来看, subroutine 其实就相当于 C 的无返回值函数,而 function 就相当于 C 的有返回值函数。