作为本站第一篇文章,我原计划讲fortran语言的发展历史与应用,然改了几稿都不满意,主要是在编译器方面,日后会补,也欢迎投稿。其实我还想写计算机基础与开源社区,因为大部分使用者都是学物理的,靠大计基不足以满足阅读、开发、使用fortran。所以本文打fortran的入门开始写起,确保原创。其中不乏有偏颇错误,还望大家斧正。
fortran90-自由格式
本文代码
program sourceFormDemo
implicit none
integer :: waterMoleculeCount
integer :: hydrogenAtomCount , oxygenAtomCount
integer :: totalAtomCount
character(len=*), parameter :: tips = "自由格式&
可如此书写代码。"
waterMoleculeCount = 6
hydrogenAtomCount = 2 * waterMoleculeCount
oxygenAtomCount = 1 * waterMoleculeCount
totalAtomCount = hydrogenAtomCount + oxygenA&
tomCount
print *, trim(tips)
print *, "waterMoleculeCount =", waterMoleculeCount
end program sourceFormDemo
目前无需理解implicit none、(len=*)、trim,本篇的核心在于自由格式,所谓自由格式即现代fortran通用标准格式,通常使用.f90文件后缀,但fortran90≠自由格式;fortran77≠固定格式。更准确的表达是“fortran90引入且推广使用自由格式;fortran77主要使用固定格式,一般文件后缀为.f/.for”。
其实for里也可以写自由格式,只是一般编译器如gfortran会默认把.for当做fixed格式来编译。
(base) hong@hongdeMacBook-Pro 001.source-form % gfortran practiceSourceForm.for
practiceSourceForm.for:3:2:
3 | program sourceFormDemo
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:4:4:
4 | implicit none
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:6:4:
6 | integer :: waterMoleculeCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:7:4:
7 | integer :: hydrogenAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:8:4:
8 | integer :: oxygenAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:9:4:
9 | integer :: totalAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:10:4:
10 | character(len=*), parameter :: noteText = "This is free form " // &
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:11:43:
11 | "Fortran source."
| 1
Error: Invalid character in name at (1)
practiceSourceForm.for:13:4:
13 | waterMoleculeCount = 6
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:14:4:
14 | hydrogenAtomCount = 2 * waterMoleculeCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:15:4:
15 | oxygenAtomCount = 1 * waterMoleculeCount ! 自由格式允许自然缩进,也允许行尾注释。
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:16:4:
16 | totalAtomCount = hydrogenAtomCount + oxygenAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:18:4:
18 | print *, trim(noteText)
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:19:4:
19 | print *, "waterMoleculeCount =", waterMoleculeCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:20:4:
20 | print *, "hydrogenAtomCount =", hydrogenAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:21:4:
21 | print *, "oxygenAtomCount =", oxygenAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:22:4:
22 | print *, "totalAtomCount =", totalAtomCount
| 1
Error: Non-numeric character in statement label at (1)
practiceSourceForm.for:23:2:
23 | end program sourceFormDemo
| 1
Error: Non-numeric character in statement label at (1)
f951: Error: Unexpected end of file in 'practiceSourceForm.for'
(base) hong@hongdeMacBook-Pro 001.source-form %
(base) hong@hongdeMacBook-Pro 001.source-form % gfortran practiceSourceForm.for -ffree-form && echo "正确编译"
正确编译
| 自由格式 | 固定格式 | |
| 常见后缀 | .f90/.f95 | .f/.for/.f77 |
| 业内俗成表达(非标准且不严谨) | f90格式 | f77格式 |
| 代码起始位置 | 无限制 | 通常从第7列开始写语句 |
| 第1-5列 | 无特殊含义 | 通常用于语句标签 |
| 第6列 | 无特殊含义 | 非空表示续行 |
| 续行方式 | 行末使用 & | 在6列写入非空字符 |
| 注释方式 | 行注释、行间注释 | 列1开头使用c/C/*,不允许行间注释 |
| 行长度 | 通常为132字符 | 有效代码至72列 |
| 缩进风格 | 自由缩进,可读性较强 | 缩进不自然,受列号约束 |
写成fortran77-固定格式:
program sourceFixedDemo
implicit none
integer waterMoleculeCount
integer hydrogenAtomCount, oxygenAtomCount
integer totalAtomCount
character(len=*), parameter :: tips = "自由格式" //
& "可如此书写代码。"
waterMoleculeCount = 6
hydrogenAtomCount = 2 * waterMoleculeCount
oxygenAtomCount = 1 * waterMoleculeCount
totalAtomCount = hydrogenAtomCount + oxygenAtomCount
print *, trim(tips)
print *, "waterMoleculeCount =", waterMoleculeCount
end
001.source-form_自由格式