搜档网
当前位置:搜档网 › Fortran的主要版本及差别

Fortran的主要版本及差别

Fortran的主要版本及差别
Fortran的主要版本及差别

、Fortran的主要版本及差别

按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortr

an90。

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"程序。

program main !程序开始,main是program的名字,完全自定义write(*,*) "Hello" !主程序

stop !终止程序

end [program[main]] !end用于封装代码,表示代码编写完毕。

[ ]中的内容可省略,下同。

再看一段实用一些的程序,好有点感性认识。程序用于计算圆柱的表面积,要求输入底面

半径和

高。其中展示了Fortran的一些特色用法。程序摘自维基。其实是一个叫

的网上引

用的维基的网页。推荐去看看!能查到不少有意思的东西。

program cylinder !给主函数起个名字

! Calculate the area of a cylinder.

!

! Declare variables and constants.

! constants=pi

! variables=radius squared and height

implicit none ! Require all variables to be explicitly declared

!这个一般都是要写上的。下面会进一步说明。 integer :: ierr

character :: yn

real :: radius, height, area

real, parameter :: pi = !这是常量的声明方法

interactive_loop: do !do循环,Fortran中的循环可以加标签,如d

o前

!面的 interactive_loop就是标

! Prompt the user for radius and height

! and read them.

write (*,*) 'Enter radius and height.' !屏幕输出

read (*,*,iostat=ierr) radius,height !键盘输入。isotat的值用

于判断

!输入成功否。

! If radius and height could not be read from input,

! then cycle through the loop.

if (ierr /= 0) then

write(*,*) 'Error, invalid input.'

cycle interactive_loop !cycle 相当于C里的continue end if

! Compute area. The ** means "raise to a power."

area = 2 * pi * (radius**2 + radius*height) ! 指数运算比C方便

! Write the input variables (radius, height)

! and output (area) to the screen.

write (*,'(1x,a7,,5x,a7,,5x,a5,') & !"&"表示续行。这里

!还显示了格式化输出

'radius=',radius,'height=',height,'area=',area

yn = ' '

yn_loop: do !内嵌的另一个do循环

write(*,*) 'Perform another calculation y[n]'

read(*,'(a1)') yn

if (yn=='y' .or. yn=='Y') exit yn_loop

if (yn=='n' .or. yn=='N' .or. yn==' ') exit interactive_loop end do yn_loop !结束内嵌do循环

end do interactive_loop

end program cylinder

Fortran程序的主要结构就是这样了。一般还会有些module的部分在主函数前,函数在主函

数后。

三、数据类型及基本输入输出

1、数据类型,声明及赋初值

(1)integer:短整型kind=2, 长整型kind=4

integer([kind=]2) :: a=3

如果声明成integer:: a,则默认为长整型。

!"::" 在声明并同时赋初值时必须要写上;类型名后面有形容词时也必须有;其他情况可

略去

!所谓形容词,可以看一下这个。比如声明常数

real,parameter :: pi= 。parameter就是形容词。

(2)real:单精度kind=4(默认),双精度kind=8

real([kind=]8) :: a=

还有指数的形式,如1E10为单精度,1D10为双精度

(3)complex 单精度和双精度

complex([kind=]4) b

(4)character

character([len=]10) c !len为最大长度

(5)logical

logical*2 :: d=.ture. (等价于logical(2)::d=.ture.)

(6)自定义类型type:类似于C中的struct

Fortran 77中给变量赋初值常用DATA命令,可同时给多个变量赋初值

data a,b,string /1, , 'fortran'/

与C不同的是,Fortran中变量不声明也能使用,即有默认类型(跟implicit命令有关)。按

照默认的

规定,以i,j,k,l,m,n开头的变量被定义为integer,其余为real。取消该设置需在程序声明

部分之前

加implicit none。彭国伦建议一般都使用该语句。

另一点关于声明的不同是Fortran有"等价声明":

integer a,b

equivalence(a,b)

使得a,b使用同一块内存。这样可以节省内存;有时可精简代码。如:equivalence(很长名

字的变量

比如三维数组的某个元素,a),之后使用a来编写程序就简洁多了。

2、基本输入输出

输入:read(*,*) a !从键盘读入

输出:write(*,*) "text" !在屏幕上输出。Fortran 77用' text'。Fort

ran 90

!一般" "和' '都可

print *,"text" !只能屏幕输出

(*,*)完整写为(unit=*,fmt=*)。其中unit为输入/输出位置,如屏幕,文件等;fmt为

格式。如

果这两项都写成*,则按默认的方式进行,即上面描述的。print后面的*表示按默认格式输

出。

四、流程控制

1、运算符

(1)逻辑运算符

== /= > >= < <= !Fortran 90用法

.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77用法

(2)涉及相互关系的集合运算符

.AND. .OR. .NOT. .EQV. .NEQV.

! 仅.NOT.连接一个表达式,其余左右两边都要有表达式(可以是logical类型的变量)

!.EQV.:当两边逻辑运算值相同时为真, .NEQV.:当两边逻辑运算值不同时为真

2、IF

(1) 基本:

if(逻辑判断式) then

……

end if

如果then后面只有一句,可写为

if(逻辑判断式) …… !then和end if可省略

(2) 多重判断:

if(逻辑判断式) then

……

else if

……

else if

……

else

……

end if

(3) 嵌套:

if(逻辑判断式) then

if(逻辑判断式) then

if(逻辑判断式) then

else if(逻辑判断式) then

……

else

……

end if !没必要跟C语句多时用{}了,因为有end if

end if

end if

(4) 算术判断:

program example

implicit none

real c

write (*,*) "input a number"

read (*,*) c

if(c) 10,20,30 !10,20和30为行代码,根据c小于/等于/大于0,执行10/20/30行的程

10 write (*,*) "A"

goto 40 !goto可实现跳到任意前面或后面的行代码处,但用多了破坏程序结

20 write (*,*) "B"

goto 40

30 write (*,*) "C"

goto 40

40 stop

end

3、SELECT CASE

类似于C的switch语句

select case(变量)

case(数值1) ! 比如case(1:5)代表1<=变量<=5会执行该模块

…… !case(1,3,5)代表变量等于1或3或5会执行该模块

case(数值2) !括号中数值只能是integer,character或logical型常量,不能

是real型

……

case default

……

end case

4、PAUSE, CONTINUE

pause暂停程序执行,按enter可继续执行

continue貌似没什么用处,可用作封装程序的标志

五、循环

1、DO

do counter=初值, 终值, 增/减量 !counter的值从初值到终值按增/减量变

化,

…… !counter每取一个值对应着一次循环。增/减量不写则

默认为1

……

…… !循环主体也没有必要用{}

……

end do

Fortran 77中不是用end do来终止,而是下面这样子:

do 循环最后一行的行代码 counter=初值, 终值, 增/减量

……

行代码…… !这是do的最后一行

2、DO WHILE

do while(逻辑运算)

……

……

end do

类似于C中的while(逻辑运算) {……}。

一开始那个计算圆柱表面积的程序中,应该也算是这一类。不过它是通过内部的if语句来

控制循

环。看来也是可以的,不过在这本书上没看到这样写。其实应该也可以归于下面这种。

3、没看到和C里面的do{……}while(逻辑运算); 相对应的循环语句,不过可以这样,保证

至少做一

次循环:

do while(.ture.)

……

……

if(逻辑运算) exit !exit就好比C里面的break。C里的continue在Fortran 里是cy

cle

end do

4、Fortran的一个特色:带署名的循环

可以这样,不易出错:

outer: do i=1,3

inner: do j=1,3

……

end do inner

end do outer

还可以这样,很方便:

loop 1: do i=1,3

loop2: do j=1,3

if(i==3) exit loop1 !exit终止整个循环loop1

if(j==2) cycle loop2 !cycle跳出loop2的本次循环,进行loop2的下

一次循环

write(*,*) i,j

end do loop2

end do loop1

还有一些循环主要用于Fortran中的数组运算,为Fortran特有,很实用。

六、数组

1、数组的声明

和C不同的是,Fortran中的数组元素的索引值写在()内,且高维的也只用一个(),如

integer a(5) !声明一个整型一维数组

real :: b(3,6) !声明一个实型二维数组

类型可以是integer, real, character, logical或type。最高可以到7维。数组大小必须为常数。但是和C语言不同,Fortran也有办法使用大小可变的数组,方法如

下:

integer, allocatable :: a(:) !声明

大小可变经过某个途径得知所需数组大小size之后,用下面的语句:

allocate(a(size)) !配置内存空间

之后该数组和通过一般方法声明的数组完全相同。

与C不同,Fortran索引值默认为从1开始,而且可以在声明时改变该规则:integer a(-3:1) ! 索引值为-3,-2,-1,0,1

integer b(2:3,-1:3) !b(2~3,-1~3)为可使用的元素

2、数组在内存中的存放

和C不同,Fortran中的数组比如a(2,2)在内存中存放顺序为

a(1,1),a(2,1),a(1,2),a(2,2

)。原则是

先放低维的元素,再放高维的元素。此规则称为column major。

3、赋初值

(1)最普通的做法:

integer a(5)

data a /1,2,3,4,5/

或integer :: a(5)=(/1,2,3,4,5/)

若integer :: a(5)=5,则5个元素均为5

对于integer :: a(2,2)=(/1,2,3,4/)

根据数组元素在内存中存放的方式,等价于赋值

a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4

(2)利用Fortran的特色:隐含式循环。看例子就明白了。

integer a(5)

integer i

data (a(i),i=2,4)/2,3,4/ !(a(i),i=2,4)表示i从2到4循环,增量为默认值1

还可以这样:

integer i

integer :: a(5)=(/1,(2,i=2,4),5/) !五个元素分别赋值为1,2,2,2,5 integer :: b(5)=(/i, i=1,5/) !五个元素分别赋值为1,2,3,4,

5

还可以嵌套

data ((a(i,j),i=1,2),j=1,2)=/1,2,3,4/ !a(1,1)=1,1(2,1)=2,a(1,2)=3,a(

2,2)=4

4、操作整个数组

设a,b为相同类型、维数和大小的数组

a=5 !所有元素赋值为5

a=(/1,2,3/) !这里假设a为一维,a(1)=1,a(2)=2,a(3)=3

a=b !对应元素赋值,要求a,b,c维数和大小相同,下同

a=b+c

a=b-c

a=b*c

a=b/c

a=sin(b) !内部函数都可以这样用

5、操作部分数组元素

a为一维数组

a(3:5)=(/3,4,5/) !a(3)=3,a(4)=4,a(5)=5

a(1:5:2)=3 !a(1)=3,a(3)=3,a(5)=3

a(3:)=5 !a(3)以及之后的所有元素赋值为5

a(1:3)=b(4:6) !类似于这种的要求左右数组元素个数相同

a(:)=b(:,2) !a(1)=b(1,2),a(2)=b(2,2),以此类推

6、WHERE

where形式上类似于if,但只用于设置数组。设有两个同样类型、维数和大小的数组a,b

[34m where(a<3)

b=a !a中小于3的元素赋值给b对应位置的元素

end where

再如:where(a(1:3)/=0) c=a !略去了end where,因为只跟了一行where可嵌

套,也

!可类似do循环有署名标签。

7、FORALL

有点像C中的for循环:

forall(triplet1[,triplet2 [,triplet3…]],mask)

其中triplet形如i=2:6:2,表示循环,最后一个数字省略则增量为1

例如:

forall(i=1:5,j=1:5,a(i,j)<10)

a(i,j)=1

end forall

又如: forall(i=1:5,j=1:5,a(i,j)/=0) a(i,j)=1/a(i,j)

forall也可以嵌套使用,好比C中for循环的嵌套。

七、函数

Fortran中函数分两类:子程序(subroutine)和自定义函数(function)。自定义函数本

质上就是

数学上的函数,一般要传递自变量给自定义函数,返回函数值。子程序不一定是这样,可

以没有返

回值。传递参数要注意类型的对应,这跟C是一样的。

fortran调试经验

FORTRAN调试程序的时候注意的问题 调试程序的时候注意的问题。 程序编好,能够直接运行而且完全正确,基本不可能,这就有调试程序的问题。主要有一下几个方面: 其一,在每个子程序被调用的时候留个心眼,写个输出语句,表示程序已经运行到了这里。这样一个小提示会给调试带来巨大的方便,如果程序运行出错,至少你可以知道它是在运行到哪里出的错,这样,直接去检查那个程序就可以了。不必重头开始检查。 其二,注意对中间计算结果的输出。有时候,而且是很多的时候,程序编译成功,运行也没有问题,就是结果不对,这肯定是计算原理有问题,此时,输入一些重要步骤的中间结果,往往可以检查出问题所在。同时,就算查出了问题所在,也可以不删除这段输出中间计算结果的代码,有可能后面还会有用处,此时,在每行输出语句前加一个感叹号,把代码变成注释的绿体字就可以了。等到再次需要输出的时候,直接删除一个“!”比再写一遍输出代码,当然要简单的多。 其三,对WATCH功能的应用,FORTRAN提供的这个功能很实用,可以查很多问题,尤其是程序中间计算值,这个和上述的中间结果的输出有点相似。但两者的不同是前者可以进行中间结果的输出控制,就是只有符合了某个条件的才能被输出,这样可以便捷程序的调试,同时对中间结果输出后可以直接用STOP停止程序的运行,这样对于大型程序来说,节省了很多后面继续计算的时间——因为前面的结果已经不对了,后面的算也是白算。 其四,对中间结算结果输出形式的控制,一般来说,FORTRAN计算结果可以输出到文件里面和计算界面两个地方。对较大的计算结果,可以输出到文件里面,反之较少的结果可以直接输出到屏幕上,为了增强数据的可读性,最好进行有格式的数据输出,以利于相同性质的数据的比较。输出到屏幕上的结果直接用WRITE(6,*)就可以(无格式),对于输出到文件里面的数据,可以省些事情,直接用WRITE(X,*)就可以,其中X是一个任意的正整数,最好大于10,也不用事先对这个X设备进行说明,程序会将结果输出到一个FORT.X的文件里面,例如10,就是FORT.10,此时,用NOTEPAD或者ULTRA-EDIT都可以把它打开——FORT.10实质上就是一个.DAT的文件,你可以把它重命名。 3.对数据计算时的误差控制。 以前觉得小数点后的误差不是那回事,没有太在意,可经过实战,终于明白了小小的误差完全可以改变整个计算的结果。因此,如果程序能够输入结果而不正确时,除了寻找算法的问题,不要忽略的误差。一般认为,FORTRAN的REAL变量小数点后8位数字误差定义已经足够,而事实上,这个精度可能在一些情况下不满足,这个时候,需要用更精确的变量类型——REAL(8),同理,当要判断两个数是否相等的时候,一定要慎用相等判断(.EQ.)这个比较运算符,因为任何数据,别看着在现实中它们一定相等,在程序中就不一定了。一旦经过了计算,就不可避免的产生了舍入误差,对于整数和有限几位循环的有理数都问题不大,可一旦是一个无理数或者无限循环的小数,只有在判断了小数点后的每一位都相等的时候,程序才判断为相等成立。这个相等的标准是非常苛刻的,所以一般情况下,可行的方法是将

FORTRAN程序设计复习题及答案

FORTRAN程序设计复习题 一、选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= B) .NOT. (A*B+C) C) A2+B2/(C+D) <= D) (A+B).NOT.A*B.GT.(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/ C) (3/5)*EXP(X+Y)D) EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.D) A.LT.B.LT.C.LT.D D(4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(正确描述:主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77表达式中,合法的是: A) .AND.. B) 10.0 C) D) 提示:A)相当于 .AND.(.NOT.()) D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列C) 第6列D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 提示:子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+"的值是 A) B) 1 C) D) 0 提示:2/4默认等于整型,=》 D (12)FORTRAN表达式"MOD,"的值是 A) B)0.0 C) D) A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符*

MATLAB 与C C + + 、FORTRAN语言混合编程

MATLAB 与C/ C + + 、FORTRAN语言混合编程摘要:对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用方法进行了介绍,分析了其实现方式和各自的利弊,并用实例对MEX 文件实现方式进行了较详细的论述. 关键词: MATLAB ; C/ C + + ; FORTRAN ; 混合编程 中图分类号: TP313 文献标识码: A 文章编号:16722948X(2004) 0620547205 1 混合编程的意义及其实现方式 1. 1 混合编程的意义 MATLAB 语言具有功能强大、开发效率高等诸 多优点, 已在工程实际中得到广泛应用, 但是与 FORTRAN、C/ C + + 等语言相比,其执行效率较低, 特别是当程序中含有大量循环语句(例如迭代计算) 时,MATLAB 就有些力不从心, 速度很慢, 而运用 FORTRAN 等擅长数值计算语言进行编程,其运行效 率高. 一方面,如果放弃MATLAB 强大功能和数量 众多的应用工具箱,无疑是资源的极大浪费. 另一方 面,针对工程实际,人们用FORTRAN、C/ C + + 语言 已编写了大量实用程序,如果将其重新改写成M 文 件移植到MATLAB 环境中,不仅要花费大量的时间 和精力,而且有时还降低了其运行效率. 可否将二者 优势互补呢? 混合编程就是其有效的解决途径. 1. 2 混合编程的实现 正是考虑到上面这些原由,MATLAB 系统提供 了其应用程序接口(Application Program Interface) 来 解决这些问题. API 主要包括3 部分:MEX 文件——— 外部程序调用接口,用来在MATLAB 环境下调用 FORTRAN、C/ C + + 语言编写的程序;MAT 文件应 用程序———数据输入输出接口,用于MATLAB 系统 与外部环境之间互传数据; 计算引擎函数库——— MATLAB 处于后台作为一个计算引擎,与其它应用 程序建立客户机/ 服务器关系,在其它应用程序中调 用[1 ,2 ] . 1. 2. 1 MEX 文件 MEX 文件是按照一定格式,用FORTRAN 或C/ C + + 语言编写的源程序,在MATLAB 下借助相应 的编译器,生成的动态链接函数的统称. 在Windows 操作系统下,是用MATLAB 附带的批处理mex. bat 来编译生成文件后缀名为. dll (Dynamic Link Li2 brary) 动态链接库文件,该文件可在MATLAB 环境 下,像命令函数一样直接运行和调用,使用起来极为 方便. 采取MEX 文件方式,是重复利用已有FOR2 TRAN、C/ C + + 程序,让MATLAB 和FORTRAN、

fortran常见问题解决

楼主为了减少重复回答问题,特编此帖,并不定期添加和更新内容。 错误难免,欢迎讨论,仅供参考。 很多人问哪里可以找到Fortran编译器,有不少热心学友提供网址,特汇集在这里。虽然俺检验过这些链接,但是它们不一定总有效。 Fortran编译器下载: CVF? FTN95(License:Freeforpersonaluse) 以下操作,如无特别说明,都是以为例。 1.如何加大Stacksize? 选Project=>Settings=>Link=>Category:Output=>? Stackallocations Reserve:这里填新值(默认为1M,若需要10M,则填) 2.如何用Fortran批量生成文件? 设要生成4000个文件,文件名为AA1-AA4000,如何写循环生成文件,而不用写4000次write 命令呢? 用内部文件: character(len=80)::filename,form integer::i doi=1,4000 selectcase(i) case(1:9) write(form,'(i1)')i case(10:99) write(form,'(i2)')i case(100:999) write(form,'(i3)')i case(1000:9999) write(form,'(i4)')i endselect write(filename,*)"AA",trim(form),".TXT" open(10,file=filename) write(10,*)i close(10)

enddo? stop end 3.如何用Fortran动态生成输出格式? 设有一个数组data(100),输出时,希望每行输出num个数,而num由用户输入,如何实现? 用内部文件: character(len=80)::form real::data(100) integer::i,num data=(/(i,i=1,100)/)/ read(*,*)num write(form,*)"(",num,"" write(*,form)data stop end 4.MS是不是很垃圾? 是垃圾,其中Bug太多,多到不可用的地步! 在这个主题里,换了CVF后问题就没了的人已有相当的数目。 如果你用,遇到莫名其妙的错误,建议换,这是一个比较成熟的编译器。 5.如何用F90/95生成随机数? 注意: 现在计算机产生的随机数都是伪随机数。 random_number(x)产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。用了random_seed()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。 programrandom implicitnone real::x callrandom_seed()!系统根据日期和时间随机地提供种子 callrandom_number(x)!每次的随机数就都不一样了 write(*,*)x stop endprogramrandom 6.函数/子程序超载的例子

C语言转换为fortran语言

C/C++采用的是缺省调用约定是STDCALL约定.在C程序中,可以在函数原型的声明中使用_stdcall关键字来指明过程采用STDCALL调用约定。 Fortran过程采用的缺省标识符是,全部大写的过程名加上“_”前缀和“@n”后缀。在C程序中保留标识符的大小写。编译程序会给采用STDCALL约定的过程标识符加上“_”前缀和“@n”后缀。 Fortran过程缺省的参数传递方式是引用方式是。对于下面这个Fortarn过程:SUBROUTINE ForSub(ivar,rvar) INTEGER ivar REAL rvar WRITE(*,*) ivar,rvar END 在C语言程序中应给出过程的函数原型及调用方式为: void main() { extern void__stdcall FORSUB(int*I,float*f); int iCV AR=1; float rCV AR=2.0; FORSUB(&iCV AR,&rCV AR); } 在C++中调用Fortan的过程,在声明函数原型时需要用extern“C”语句,以避免C++编译程序对标识符的修饰;并且C++也可以通过引用方式传递参数。对于上面的Fortran过程,C++程序应给出的函数原型及调用方法是: void main() { extern “C”{void__stdcall FORSUB(int*I,float*f);} int iCV AR=1; float rCV AR=2.0; FORSUB(&iCV AR,&rCV AR); } 另外,也可以在Fortran中用!MS$ATTRIBUTES编译伪指令来改变Fortran子过程的调用约定,以便于被其他语言的程序调用。在下面的例子中,过程ForSub具有C语言的调用约定。 SUBROUTINE ForSub(ivar,rvar) !MS$ATTRIBUTES C::ForSub INTEGER ivar REAL rvar WRITE(*,*) ivar,rvar END 这样,这个过程使用的是C调用约定,并且参数传递方式也变为传值方式,过程的标识符变为全部小写且有_前缀而无后缀的方式。在C语言源程序中的函数原型及调用方法为:void main() { extern void FORSUB(int ivar,float rvar); int iVar=1;

Fortran95程序设计课后习题答案(word版方便)

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.p rogram main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

fortran课后习题答案

第一章 FORTRAN程序设计基础第15页 1、2 1.简述程序设计的步骤。 “程序设计”:反映了利用计算机解决问题的全过程,通常要经过以下四个基本步骤:(1)分析问题,确定数学模型或方法;(2)设计算法,画出流程图;(3)选择编程工具,编写程序;(4)调试程序,分析输出结果。 2. 什么是算法?它有何特征?如何描述算法? 解决问题的方法和步骤称为算法。 算法的五个特征:(1) 有穷性。 (2) 确定性。 (3) 有效性。 (4) 要有数据输入。(5) 要有结果输出。 算法的描述有许多方法,常用的有:自然语言、一般流程图、N-S图等。 第二章顺序结构程序设计 第29页 1、2、3、4、5、6、7、8、9 1.简述符号常量与变量的区别? 符号常量在程序运行过程中其值不能改变。变量在程序运行过程中其值可以改变。 2. 下列符号中为合法的FORTRAN 90标识符的有哪些? (1) A123B (2) M%10 (3) X_C2 (4) 5YZ (5) X+Y (6) F(X) (7) COS(X) (8) A.2 (9) ‘A’ONE (10) U.S.S.R. (11) min*2 (12) PRINT 3. 下列数据中哪一些是合法的FORTRAN常量? (1) 9,87 (2) .0 (3) 25.82(4) -356231 (5) 3.57*E2 (6) 3.57E2.1 (7) 3.57E+2(8) 3,57E-2 4. 已知A=2,B=3,C=5(REAL);且I=2,J=3(INTEGER),求下列表达式的值: (1) A*B+C 表达式的值: 11 (2) A*(B+C) 表达式的值: 16 (3) B/C*A 表达式的值: 1.2 (4) B/(C*A) 表达式的值: 0.3 (5) A/I/J 表达式的值: 0.33 (6) I/J/A 表达式的值: 0 (7) A*B**I/A**J*2 表达式的值: 4.5 (8) C+(B/A)**3/B*2. 表达式的值: 7.25 (9) A**B**I 表达式的值: 512 5. 将下列数学表达式写成相应的FORTRAN表达式: (1) 1E-2 (2)(-B+SQRT(B*B-4*A*C)/(2*A) (3) 1+X+X*X/2+X**3/2/3 (4) COS(ATAN((A**3+B**3)**(1.0/3)/(C*C+1))) (5) EXP(A*X**2+B*X+C) (6) COS(X*Y/SQRT(X*X+Y*Y))**3 6. 用FORTRAN语句完成下列操作: (1) 将变量I的值增加1。I=I+1 (2) I的立方加上J,并将结果保存到I中。 I=I**3+J (3) 将E和F中大者存储到G中。G=Max(E,F) (4) 将两位自然数N的个位与十位互换,得到一个新的数存储到M中(不考虑个位为0的情况) M=MOD(N,10)*10+N/10 第三章选择结构程序设计第43页 1、2、3、5、6、7、9 1.分析下列程序运行结果 (1) LOGICAL P INTEGER I,I1,I2,I3 P=.FALSE. READ*,I I1=MOD(I,10) I2=MOD(I/10,10) I3=I/100

C与C++与FORTRAN混合编程

C/C++/FORTRAN 混合编程 混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。 混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。 1 Windows平台 函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。( C/C++编译器使用Microsoft Visual C++ 6.0, Fortran编译器使用 Digital Visual Fortran 6.0)。 假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall CFunction(); #define cFunction CFUNCTION #ifdef __cplusplus } #endif 这样,在Fortran或者C++的程序里面就可以直接调用了。 假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义就可以了: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall ffunction(); #define ffunction FFUNCTION #ifdef __cplusplus } #endif 这样,就可以在C++的程序里面直接调用。由于C编译器里面,没有定义__cplusplus这个环境变量,因此,C文件里面,也可以直接使用这个头文件。如果是一个C++函数,如: void cPlusplusFunction();和c函数一样,进行下面的定义即可: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall cPlusplusFunction (); #define cPlusplusFunction CPLUSPLUSFUNCTION #ifdef __cplusplus }

fortran常见错误

FAQ之常见错误 2014-02-02 13:45:35 来源:Fcode研讨团队评论:2点击:4419 本文从编译错误,链接错误,运行时错误,计算结果错误等四个方面介绍了常见的错误及解决思路。适合初学者阅读。 首先应该明确:错误有哪几种?我们当前遇到的是何种错误? 阐述这些问题前,我们先讨论一下常规的应用程序开发的过程: 1>>编写代码,使用一个或多个源代码文件。 2>>对第一步的每一个源代码文件执行编译操作。得到一个或若干个目标代码。 3>>将目标代码,运行时库(Run-time Library)和其他使用到的函数库链接起来。得到一个可执行文件(EXE 或其他) 4>>编写程序的说明书,必要的(输入)数据文件 5>>将上述得到的结果发布给用户。(发布的方式可以是刻录成光盘,销售,放在网站上供别人下载,或者其他) 6>>用户得到程序后,运行,输入数据,得到计算结果。 对于很多 Fortran 程序员来说,可能用户就是自己,也可能仅仅是自己教研室的同事同学。所以第4,5,6步骤很多时候不明显。而如果使用集成开发环境(IDE)进行开发,第1,2,3步骤又可以一键完成。因此,很多初学者就认为,写程序就是:输入代码,运行,得到结果。这样的理解太狭义。 不管我们面对什么使用者来写代码,程序开发应该是上述的过程。我们的编译器,编译环境,也是为这个过程而设计的。 于是,我们将错误分为四种: 一. 编译错误(发生在第2步) 编译错误,一般是源代码书写格式不正确,不符合语法要求。 二. 链接错误(发生在第3步) 链接错误,一般是源代码结构不完整,运行时库或函数库使用不合理。 三. 运行时错误(发生在第6步) 运行时错误,一般是执行代码时,遇到了事先未料及的错误。比如内存不足了,磁盘空间不够了,输入文件格式不对了,输出文件写入失败了等等。 四. 计算结果不符合预期(程序代码不规范,或不符合你的设想) 计算结果不符合预期,可能性就很多了。语法与你的想法不一致,超出函数库的适用范围,执行流程控制不当等等。 这四种错误,其排查难度依次增大。也就是,编译错误最容易排查和修改,而计算结果不正确,最让人头疼。

计算机程序设计语言(FORTRAN语言)

计算机程序设计语言(FORTRAN语言) (总分:36.00,做题时间:90分钟) 一、 (总题数:36,分数:36.00) 1.编译程序能将高级语言编写的源程序转换成( )。 A.解释程序 B.汇编程序 C.映象程序 D.目标程序 (分数:1.00) A. B. C. D. √ 解析: 2.一个完整的FORTRAN源程序( )。 A.至少包括一个主程序 B.至少包括一个主程序和一个子程序 C.由一个主程序与一个以上的子程序组成 D.由一个主程序与一个子程序组成 (分数:1.00) A. √ B. C. D. 解析: 3.语句函数定义语句在程序内合法的位置是( )。 A.在程序块开头语句之后,END语句之前 B.在程序块开头语句之后,可执行语句之前 C.在说明语句之后,END语句之前 D.在说明语句之后,可执行语句之前 (分数:1.00) A. B. C. D. √ 解析: 4.下列关于函数子程序虚实参数的错误说法是( )。 A.可以没有形参数 B.虚实结合的数组长度可以不同 C.实参表与虚参表类型可以不同 D.函数名可以作为虚参

(分数:1.00) A. B. C. √ D. 解析: 5.下列叙述中正确的是( )。 A.FORTRAN程序块中,无名公用语句只能有一个B.FORTRAN子程序中,至少应有一个RETURN语句C.FORTRAN程序块中,最后一行必须是END语句D.FORTRAN程序块中,必须有变量说明语句 (分数:1.00) A. B. C. √ D. 解析: 6.运行下面的程序时得不到所需的结果,其主要原因是( )。INTEGER X(11) DATA X/9,8,7,6,5,4,3,2,1,0,-1/ DO 10 1=1,X(1) ,-1 WRITE(*,*)1.0/SQRT(25.0-REAL(X(1) )* * 2) 10 CONTINUE END A.没有给X(11) 赋初值 B.发生除以零的情况 C.发生负数开平方的情况 D.循环参数设置错误 (分数:1.00) A. B. C. D. √ 解析: 7.下列数据中,不符合FORTRAN常量表示法的是( )。 A.-25.6 B.2.758D3 C.'FOOT"=' D.TRUE (分数:1.00) A. B. C. D. √ 解析:

fortran中批处理实现

********************************************* fortran中批处理命令的实现函数: 利用systemqq命令(需要调用DFLIB 数据库) ********************************************* 例1: USE DFLIB character*100 CMD LOGICAL(4) res CMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut) res=SYSTEMQQ(CMD) 例2: USE DFLIB LOGICAL(4) result result = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt') !将e:\dir.txt 复制到e:\test\dir.txt文件中。!****************实例3:复制文件************************* 例3: programmain_pro USE DFLIB implicit none integer,parameter::sta_num=123 character(5),dimension(sta_num)::sta_ID character(500)::filein,fileout character(5000)::cmd logical(4)::judge

integer::status,is open(1,file='山东.txt',status='old',action='read',iostat=status) read(1,*) do is=1,sta_num read(1,*) sta_ID(is) filein='Z:\data\降水逐小时数据-戴至修\precip_data\'//sta_ID(is)//'_precip.txt' open(2,file= filein,status='old',action='read',iostat=status) if(status/=0) goto 1000 fileout='Z:\data\降水逐小时数据-戴至修\山东省-降水数据\'//sta_ID(is)//'_precip.txt' cmd='copy '//filein//' '//fileout judge=SYSTEMQQ( cmd) 1000 continue enddo end program

fortran语言内部函数

附录 FORTRAN 90标准函数 符号约定: ●I代表整型;R代表实型;C代表复型;CH代表字符型;S代表字符串;L代表逻辑型;A代表数组;P代表指针;T代表派生类型;AT为任意类型。 ●s:P表示s类型为P类型(任意kind值)。s:P(k)表示s类型为P类型(kind值=k)。 ●[…]表示可选参数。 ●*表示常用函数。 表1 数值和类型转换函数 函数名说明 ABS(x)*求x的绝对值∣x∣。x:I、R,结果类型同x; x:C,结果:R AIMAG(x)求x的实部。x:C,结果:R AINT(x[,kind])*对x取整,并转换为实数(kind)。x:R, kind:I,结果:R(kind) AMAX0(x1,x2,x3,…)*求x1,x2,x3,…中最大值。x I:I,结果:R AMIN0(x1,x2,x3,…)*求x1,x2,x3,…中最小值。x I:I,结果:R ANINT(x[,kind])*对x四舍五入取整,并转换为实数(kind)。x:R, kind:I,结果:R(kind) CEILING(x)*求大于等于x的最小整数。x:R,结果:I CMPLX(x[,y][,kind]))将参数转换为x、(x,0.0)或(x,y)。x:I、R、C, y:I、R,kind:I,结果:C(kind) CONJG(x)求x的共轭复数。x:C,结果:C DBLE(x)*将x转换为双精度实数。x:I、R、C,结果:R(8) DCMPLX(x[,y])将参数转换为x、(x,0.0)或(x,y)。x:I、R、C, y:I、R,结果:C(8) DFLOAT(x)将x转换为双精度实数。x:I,结果:R(8) DIM(x,y)*求x-y和0中最大值,即MAX(x-y,0)。x:I、R, y的类型同x,结果类型同x DPROD(x,y)求x和y的乘积,并转换为双精度实数。x:R, y:R,结果:R(8)

fortran问题

imsl7.0中用use linear_operators这句话是会出错的,当时intel论坛上也有人问,后来intel 给出了个X64 imsl的补丁,但是32位的没有。 要使用包含在linear_operators这个库中的函数时,要用use+原函数 例如:上面那个例子把use linear_operators改成use operation_xt即可 另外,imsl7.0引用函数和以前版本不一样的 补充一点: linear_operators这个文件是这样子的(一看就知道原因了): modulelinear_operators usecond_int usedet_int usediag_int usediagonals_int usefft_int useifft_int useeye_int uselin_eig_self_int uselin_sol_self_int usenorm_int useoperation_i useoperation_ix useoperation_t useoperation_h useoperation_tx useoperation_hx useoperation_x useoperation_xi useoperation_xt useoperation_xh useorth_int userand_int userank_int usesvd_int useunit_int useeig_int usechol_int useisnan_int end module 1. 如何加大Stack size? 选Project => Settings => Link => Category: Output =>

Fortran 运行中给出的系统错误及解决方法

. Fortran 运行中给出的系统错误及解决方法 以下均为linker tools errors and warnings Linker Tools Error LNK1000 unknown error; consult documentation for technical support options Note the circumstances of the error, try to isolate the problem and create a reproducible test case, then contact technical support. Linker Tools Error LNK1101 incorrect MSPDBxx.DLL version; recheck installation of this product The version of MSPDBxx.DLL available on your system does not match the version required by this tool. Linker Tools Error LNK1102 out of memory There was not enough memory for the tool to run. Probably the paging file exceeded available disk space. If a shortage of disk space is not the cause, note the circumstances of the error, try to isolate the problem and create a reproducible test case, then request technical support. Linker Tools Error LNK1103 debugging information corrupt; recompile module Probably the compilation was terminated before a valid object file was created.Recompile the given object file. If recompiling does not correct the problem,note the circumstances of the error, try to isolate the problem and create a reproducible test case, then consult technical support. Linker Tools Error LNK1104 cannot open file "filename" The tool could not open the given file. One of the following may be a cause: l There was not enough disk space. l The file does not exist. l The filename or its path was incorrectly specified. l The specified drive is invalid. l The file does not have the appropriate permissions. l The path for filename expands to more than 260 characters. l If the given file is named LNKn, which is a filename generated by the linker for a temporary file, then the directory specified in the TMP environment variable may not exist, or more than one directory is specified for the TMP environment variable. (Only one directory path should be specified for the TMP environment variable.) l If the error occurs on the executable filename, an earlier version of the executable may still be running. You will need to terminate the executable before linking it. In Windows NT (including Windows 2000) or Windows 95,you can use the utility PVIEW to look for and kill instances of the application. l If the error message occurs for a library name, and you recently ported the .MAK file from a previous Microsoft Visual C++ development

[转载]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 的比较 https://www.sodocs.net/doc/fa10559719.html,/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.2

相关主题