有一个网站介绍了fortran90中的一些常规bug
http://www.cs.rpi.edu/~szymansk/OOF90/bugs.html
整形变量
[s]n[_k]
s为正负号,n为十进制数,_下划线连接的k为种类参数
IMPLICIT NONE废除隐含约定
gfotran编译指令
gfortran helloworld.f90 -o helloworld
在声明同时给变量赋初值情况下,符号"::"不能省略
比如
REAL(8) ::b=2.0
符号常量只能在声明时通过PARAMETER数学设置其值
REAL,PARAMETER ::PI=3.1415926
输入输出语句用READ*和PRINT*语句表示
函数F(x)
F要声明类型,如果开头有implicit none 的话
C/C++函数用return语句返回值,fortran语句中通过将表达式的值赋给函数名实现
fortran参数传递默认为引用传递(地址传递),需添加INTENT属性改为值传递
CONTAINS包含的为内部例程
MODULE Mod IMPLICIT NONE INTERFACE SWAP !swap为调用的时候使用的例程名 MODULE PROCEDURE SWAPREALS,SWAPINTEGERS END INTERFACE CONTAINS SUBROUTINE SWAPREALS(X,Y) REAL,INTENT(INOUT)::X,Y REAL Temp Temp=X X=Y Y=Temp END SUBROUTINE SUBROUTINE SWAPINTEGERS(X,Y) INTEGER,INTENT(INOUT)::X,Y INTEGER Temp Temp=X X=Y Y=Temp END SUBROUTINE END MODULE PROGRAM Main USE Mod IMPLICIT NONE REAL ::A=1.0,B=2.0 INTEGER ::I=1,J=2 CALL SWAP(A,B) CALL SWAP(I,J) PRINT*,'A=',A,',B=',B PRINT*,'I=',I,',J=',J END PROGRAM
MODULE util REAL,PARAMETER ::PI=3.1415926 CONTAINS SUBROUTINE SWAP(X,Y) REAL TEMP,X,Y TEMP=X X=Y Y=TEMP END SUBROUTINE END MODULE PROGRAM Main USE util !使用模块 IMPLICIT NONE REAL ::A=PI,B=PI*2 CALL SWAP(A,B) PRINT*,A,B END
fortran不可以连续赋值
比如如下赋值方式在C++中是支持的
int i,j,k;
i=j=k=10;
在fortran中以下方式是非法的
integer ::i,j,k
i=j=k=1
fortran77中的implicit语句
摘自http://www.obliquity.com/computer/fortran/datatype.html
Although only INTEGER
and REAL
constants, variables and arrays have implicit types, it is possible to assign defaults for all data types through the use of the IMPLICIT
statement. The syntax for this statement is
IMPLICIT type1 (range1), type2 (range2), ..., typen (rangen)
A program that has only DOUBLE PRECISION variables might contain the statement
IMPLICIT DOUBLE PRECISION(A-Z)
Because of the declarations
implicit double precision(A-Z)
此语句代表以字母A与Z开头的变量都会自动当做double precision双精度
IMPLICIT COMPLEX(A-C),DOUBLE PRECISION(D),INTEGER(E-Z)
LOGICAL HELP
all variables beginning with the letters A through C are of type COMPLEX, all variables beginning with the letter D are of type DOUBLE PRECISION, and everything else is an INTEGER. The explicit type declaration that HELP is of type LOGICAL overrides the INTEGER default.
显示声明会覆盖隐式的默认声明
use statement
use语句
如果在module中定义的变量在当前程序中要使用另外的变量名可以用如下的形式
比如
use maths_module, gravity= > g
表面在当前程序中使用变量名gravity来代替模块maths_module中的变量名g
比如模块中有很多变量,但是只使用其中的某一个或某几个变量,可以使用use module_name,only :variable_list
例子如下
1 module test 2 implicit none 3 real,dimension(4) ::arr 4 end module 5 program main 6 use test,only :arr 7 implicit none 8 integer,dimension(6) ::cc 9 arr(1)=5 10 print*,arr(1) 11 end
forrtl: severe (174): SIGSEGV, segmentation fault occurred
编译器提示这个错误可能的原因:
比如数组索引是负的,执行过程中就有可能会报出这个错误
如下
index = -5
a(index)= 6
就可能会报出上述错误
如何判断某个数是不是NaN
以下文字引用自
http://gcc.gnu.org/onlinedocs/gfortran/ISNAN.html
ISNAN
— Test for a NaNISNAN
tests whether a floating-point value is an IEEE Not-a-Number (NaN).
ISNAN(X)
X | Variable of the type REAL . |
LOGICAL
. The returned value is
TRUE
if X is a NaN and
FALSE
otherwise.