fortran

fortran学习

001.source-form_自由格式

作为本站第一篇文章,我原计划讲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_自由格式

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top