当前位置:文档之家› fortran常见问题解决

fortran常见问题解决

fortran常见问题解决
fortran常见问题解决

楼主

为了减少重复回答问题,特编此帖,并不定期添加和更新内容。 错误难免,欢迎讨论,仅供参考。

很多人问哪里可以找到 Fortran 编译器, 有不少热心学友提供网址, 检验过这些链接,但是它们不一定总有效。

Fortran 编译器下载: CVF

FTN95 (License: Free for personal

以下操作,如无特别说明,都是以为例。

1. 如何加大 Stack size 选 Project => Settings => Link Stack allocations Reserve: 这里填新值(默认为 1M 若需要 => => Category: Output =>

10M 则填) 2. 如何用 Fortran 批量生成文件 文件名为AA1-AA4000,如何写循环生成文件 设要生成 4000 个文件, 命令呢 , 而不用写 4000 次 write

用内部文件: character(len=80) integer filename,form

i=1,4000

select

case (i)

case (1:9)

write(form,'(i1)')

case (10:99)

write(form,'(i2)')

case (100:999)

write(form,'(i3)')

case (1000:9999)

write(form,'(i4)')

end select

do write(filename,*) "AA",trim(form),".TXT" open(10,file=filename) write(10,*) i close(10)

特汇集在这里。 虽然俺

use)

stop end 4.

MS 是不是很垃圾 是垃圾,其中 Bug 太多,多到不可用的地步! 在这个主题里,换了 CVF 后问题就没了

的人已有相当的数目。 如果你用,遇到莫名其妙的错误,建议换,这是一个比较成熟的编译器。

5. 如何用 F90/95 生成随机数 注意: 现在计算机产生的随机数都是伪随机数。 random_number(x) 数。

用了 random_seed

6. 函数 /子程序超载的例子

设要编一个两个变量值互换的子程序 swap(a,b) ,哑元 a,b 可能是实型数,整型数,数组,

end do stop end 3. 如何用 Fortran 动态生成输出格式 设有一个数组 data(100) ,输出时,希望每行输出 num 个数,而num 由用户输入,如何实现 用内部文件: character(len=80) real integer data(100) i,num form data = read(*,*) write(form,*)

write(*,form ) (/ (i,i=1,100) num "(",num,"" data

/)/

产生一个 0到 1 之间的随机数( x 可以是向量),但是每次总是那几个

() 后,系统根据日期和时间随机地提供种子,使得随机数更随机了。

program random implicit

real :: call call write(*,*) stop end program random none

:: x random_seed () random_number (x)

x

! 系统根据日期和时间随机地提供种子 每次的

随机数就都不一样了

。。。

return

end subroutine r_swap

end do

return

矩阵,字符串,派生类型等等。但是希望只用一个子程序接口 用类属接口来实现这种子程序超载:

swap(a,b) 来实现。 F90 可以

module Utilities

implicit private public

none

I_Swap,R_Swap,RVec_Swap,RMat_Swap,Type_Swap :: Swap

interface

module procedure I_Swap,R_Swap,RVec_Swap,RMat_Swap,Type_Swap end interface

Swap

contains

subroutine i_swap (a,b)

(ikind),intent (in (ikind) integer

integer

整型置换

out)

a,b

end subroutine

i_swap

subroutine

real real

r_swap (a,b) (rkind), intent(in (rkind)

实型置换

out)

a,b

subroutine real integer do i=1,

call

RVec_swap (a,b) (rkind),

intent(in (ikind) size(a)

R_Swap (a(i),b(i))

! 实型向量置换

out) :

a(:),b(:)

end subroutine

RVec_swap

subroutine RMat_swap (a,b)

。。。

实型矩阵置换

! 略

end subroutine RMat_swap subroutine Type_swap (a,b)

派生类型置换

! 略

end subroutine Type_swap

“不得用” 的语言特性:

- allocatable 、intent 、pointer 属性形式代替。 )

- external 语句形式。 ( 用显式的接口代替。 )

- assign 、赋值 go to 、交错 return 、 continue 、entry 、和计算 go to 语句。 - include 文件。 (用模块代替。 )

- data 和 block data 。(在类型声明语句中进行初始化或赋值。 )

-common 块。(将全局数据放在模块中,用模块代替。

- equivalence 。 (被认为是许多难以查找的编程错误的来源。

- double precision 语句。 ( 用 real 语句声明双精度的实型数。 )

-

语句函数。 ( 用内部函数代替。 )

-

专用固有函数。 (用类属函数代替。 )

end module Utilities

7. 见:

如何在CVF 中为多行代码加注释

推荐好的代码风格

8. 根据F90子集语言ELF90和F 的要求整理(部分)。 “强迫用” 的语言特性:

F90 的自由格式的源代码。 implicit none 。

子过程的哑元都要有 intent 函数子程序的哑元必须指定为

所有子程序和函数都放在模块

+ 中。

+ 属性。 intent (in ) 。

(module )中,然后引用(use )该模块;或者放在program

数组哑元要求是假定形状的,或者有固定的维数和大小。字符哑元要求是假定长度的。 对于

recursive function (递归函数)语句,必须有 result 在所有派生类型( type )的定义语句中,必须用双冒号分隔符( 主程序要求有 program 语句。

在程序单元的 end 语句中要求后跟程序单元的类型和名称。 在 end type 语句中要求后跟类型的名称。 end program 前必须有 stop 语句以表示停止执行。 子过程中必须有 return 语句,

subroutine s ( ) 并且 call

以表示返回。

s ( ) ,即必须有括号。

子句。

:: )。

、save 、dimension 、parameter 和 target 语句形式。 ( 用 ( 用假定形状数组代替。 )

n 为语句标号)。 ( 用 do 和 end do 代替。 ) 非

整数 do 变量和表达式。 同一行上多条语句。

-假定大小数组。-do n (其中

逻辑型 case 表达式。

从 if 块外面分支到 end if 。

where 语句形式。 ( 用 where 结构形式。 ) 在 open 和 inquire 语句中的 blank= 说明符。 双字关键词

之间要求有空格: in out , go to 。不能写为 inout , goto 。

9. 将字符串改为大写的子程序

subroutine UpCase (str) !========================== !

change to upper

case !==========================

ar('A')

10. CVF 中源代码信息浏览

默认情况下,代码信息浏览是失效的( Go to Definition/Reference 都不起作用),你 可以将其启用:

1. 2. 3. 4. 5. 言,去除 Case sensitive 的选中。点击 OK 。

6. 现在可以用Browse 对话框来浏览函数调用关系以及变量声明和引用关系。

7.

光标置于一个变量名或函数名中,鼠标右键: Go to Definition 使光标跳到该变量 声明或函数定义语句;

Go to Reference 使光标跳到该变量的引用或函数引用语句。

注: (Addison 提供 )

IVF 中现在不适用,因为此技术是属于 MS 的,不是INTEL 的,所以,in tel 正在与MS 就有

关问题进行磋商,目前的进展比较顺利,可能要在以后的版本中支持,目前还没有时间表。

character(len=*),intent(in integer(4)

integer(4),parameter out) str

diff

icha,LL,icval

ichar('a') - ich

LL do = len_trim(str) icha=1,LL icval

if

end

end

do = ichar(str(icha:icha)) (icval>=ichar('a') .and.

str(icha:icha) = char(icval-diff) if

icval<=ichar('z')) then

return

end subroutine

UpCase

Project/Settings/Fortran, 选中 Generate Source Browse Information 。

选 BrowseInfo 卡页,选中 Build Browse info file ,点击 OK 。 Build 程序。代码浏览器仅当成功 Build 程序后才可应用。 Tools/Source Browser 。

在 Browse 对话框底部,找到 Case sensitive 复选框。 Fortran 是大小写不敏感的语

11. 如何在CVF 中检验代码是否符合 F90/95标准 为了检验你的代码是否符合 F90或F95标准,在CVF 中选:

Project/Settings...

选 Fortran 页卡

Category 下拉框选: Compilation Diagnostics Fortran Standard Checking 下拉框选: Fortran 90 或

也就是说按照 F90/95 标准, type 中不允许用 allocatable 。

臭石头雪球提供:

VS2005 + 组合的方法差不多:

项目属性, Fortran , Diagnostics , Warn For Non-standard 选择为

Fortran 90 或 Fortran 95 12.

如何输出 tab 字符 char(9) 。

13.如何在CVF 中设置把Tab 转为空格

Tab 字符不在Fortran 标准中,在不同环境下会有不同的显示,不推荐使用。 采用下列方法,可将 Tab 键转为 3

个空格: 依次选菜单 Tools/Option , 选 Tab 卡项,

File type 选 Fortran ,

选 Insert spaces ,

Tab size 选 3, Indent size 选 3。

14. 如何实现“代码自动补全”

在CVF 中: 在 IVF 中: 问题

Fortran 95

这样,凡是

CVF 自家扩展的语法就都会有提示了。

例:

type end test integer, integer,

type test

allocatable pointer

a(:) :: b(:)

若选了标准检验,会提示:

Warning:

Allocatable

fields of derived types are non-standard [A]

Fortran

相关主题
文本预览
相关文档 最新文档