Fortran/debug – Syntax error, found END-OF-STATEMENT when expecting one of: (

コンパイルエラーあるある.初歩的ではありますが,気を付けましょう

チェック項目

  1. かっこがちゃんと閉じているかをチェックする(シンタックスハイライトしてくれるエディターを使ったほうがわかりやすいです)

VSコードだとこんな感じ(左からOKな場合,右側かっこが余分なとき,右側かっこが足りないとき)

        2. Fortran77で固定形式(拡張子が.f, .for, .ftnの時)の時はプログラムは7~72カラムめに収まっているかをチェックする

例:以下のプログラムは固定形式だとコンパイルエラーになる

program test 

        implicit none

        integer :: i
        double precision :: val

        do i = 1,40,1 
            val = i**2 + (i+1)**2 + (i+2)**2 + (i+3)**2 + (i+4)**2 + (i+5)**2
            write(*,*) '>>> val = ',val,' (i = ',i, ')'
        enddo

      end program test

結果:intelでもgfortranでもエラーに

$ ifort  test.f
test.f(10): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: ( <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> <INTEGER_CONSTANT> ...
            val = i**2 + (i+1)**2 + (i+2)**2 + (i+3)**2 + (i+4)**2 + (i+5)**2
-----------------------------------------------------------------------------^
compilation aborted for test.f (code 1)
$ gfortran test.f
test.f:10:72:

   10 |             val = i**2 + (i+1)**2 + (i+2)**2 + (i+3)**2 + (i+4)**2 + (i+5)**2
      |                                                                        1
Error: Syntax error in expression at (1)

対処法:&を用いて改行

program test 

        implicit none

        integer :: i
        double precision :: val

        do i = 1,40,1 
            val = i**2 + (i+1)**2 + (i+2)**2 
     &          + (i+3)**2 + (i+4)**2 + (i+5)**2 ! &を用いて改行する
            write(*,*) '>>> val = ',val,' (i = ',i, ')'
        enddo

      end program test

結果:intelでもgfortranでもコンパイルできました

ちなみに実行すると

>>> val =    91.0000000000000       (i =            1 )
 >>> val =    139.000000000000       (i =            2 )
 >>> val =    199.000000000000       (i =            3 )
 >>> val =    271.000000000000       (i =            4 )
 >>> val =    355.000000000000       (i =            5 )
 >>> val =    451.000000000000       (i =            6 )
 >>> val =    559.000000000000       (i =            7 )
 >>> val =    679.000000000000       (i =            8 )
 >>> val =    811.000000000000       (i =            9 )
 >>> val =    955.000000000000       (i =           10 )
 >>> val =    1111.00000000000       (i =           11 )
 >>> val =    1279.00000000000       (i =           12 )
 >>> val =    1459.00000000000       (i =           13 )
 >>> val =    1651.00000000000       (i =           14 )
 >>> val =    1855.00000000000       (i =           15 )
 >>> val =    2071.00000000000       (i =           16 )
 >>> val =    2299.00000000000       (i =           17 )
 >>> val =    2539.00000000000       (i =           18 )
 >>> val =    2791.00000000000       (i =           19 )
 >>> val =    3055.00000000000       (i =           20 )
 >>> val =    3331.00000000000       (i =           21 )
 >>> val =    3619.00000000000       (i =           22 )
 >>> val =    3919.00000000000       (i =           23 )
 >>> val =    4231.00000000000       (i =           24 )
 >>> val =    4555.00000000000       (i =           25 )
 >>> val =    4891.00000000000       (i =           26 )
 >>> val =    5239.00000000000       (i =           27 )
 >>> val =    5599.00000000000       (i =           28 )
 >>> val =    5971.00000000000       (i =           29 )
 >>> val =    6355.00000000000       (i =           30 )
 >>> val =    6751.00000000000       (i =           31 )
 >>> val =    7159.00000000000       (i =           32 )
 >>> val =    7579.00000000000       (i =           33 )
 >>> val =    8011.00000000000       (i =           34 )
 >>> val =    8455.00000000000       (i =           35 )
 >>> val =    8911.00000000000       (i =           36 )
 >>> val =    9379.00000000000       (i =           37 )
 >>> val =    9859.00000000000       (i =           38 )
 >>> val =    10351.0000000000       (i =           39 )
 >>> val =    10855.0000000000       (i =           40 )