fortran学习

有一个网站介绍了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 NaN

Description:
ISNAN tests whether a floating-point value is an IEEE Not-a-Number (NaN). 
Standard:
GNU extension 
Class:
Elemental function 
Syntax:
ISNAN(X) 
Arguments:
XVariable of the type REAL


Return value:
Returns a default-kind  LOGICAL. The returned value is  TRUE if  X is a NaN and  FALSE otherwise. 

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值