楼主
为了减少重复回答问题,特编此帖,并不定期添加和更新内容。 错误难免,欢迎讨论,仅供参考。
很多人问哪里可以找到 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