fortran66のブログ

fortran について書きます。

【メモ帳】intel fortran の Fortran 2018 機能 その他

implied do loop の局所スコープの bug

    program F2018
        implicit none
        integer, allocatable :: m(:)
        
        m =  [(i, integer:: i = 1, 10)]
        print *, m
        
    end program F2018

この単純な形でコンパイル時の syntax error が出る。

loop.f90(5): error #6404: This name does not have a type, and must have an explicit type.   [I]

しかし、implicit none を外したり integer :: i の宣言を入れるとコンパイル通る。

    program F2018
!        implicit none
        integer, allocatable :: m(:)
        
        m =  [(i, integer:: i = 1, 10)]
        print *, m
        
    end program F2018
           1           2           3           4           5           6
           7           8           9          10

forall の時も同じことをやっているので Intel 進歩してない。多分チェックプログラムに implicit none を付けてないw implicit none の場合は integer(8) にすると変数 i はちゃんと 8 byte になるが、implicit none ; integer :: i で 4byte 変数として宣言してあると、implied do loop 中で 8byte 宣言しても 4byte 変数となって overflow するキチガイ挙動w

    program F2018
      !  implicit none

        integer(8), allocatable :: m(:)
        
        m =  [(i, integer(8):: i = 10_8**10, 10_8**10 + 10)]
        print *, m
        
    end program F2018
           10000000000           10000000001           10000000002
           10000000003           10000000004           10000000005
           10000000006           10000000007           10000000008
           10000000009           10000000010
    program F2018
      !  implicit none
        integer :: i
        integer(8), allocatable :: m(:)
        
        m =  [(i, integer(8):: i = 10_8**10, 10_8**10 + 10)]
        print *, m
        
    end program F2018
            1410065408            1410065409            1410065410
            1410065411            1410065412            1410065413
            1410065414            1410065415            1410065416
            1410065417            1410065418

大室家4巻

大室家4巻 特装版の付録はみさきち話で私的にイマイチ。小学生世代では、こころちゃんが好き。

なお公式略語も OMRK と先頭の母音以外は母音を抜いて子音を並べる FORTRAN の変数名づけのようで好ましい。

先生たちの方は、まだこれからか・・・

補足

Fortran 2018 とは関係なくて Fortran 2003 水準での話ですが、implied do loop そのままだと loop 変数の値が残るのに、これを配列構成子の中に置くと、loop 変数の終了値が残らないという不思議。gfortran でもそうなっているので規格上の挙動なのでしょうか・・・?規格を調べる気力が起きないです。

(配列構成子を (/.../) にすれば Fortran90 水準の話の気もします。そのうち調べたいです。)

[補足 R5.6.6] MFE 赤本 §23.9 に array constructor と data 文中の implied do loop は limited scope を持つが、入出力文中の implied do loop はそうではないと書いてありました。

program Hello
        i = 99
        print *, i
        print *, (i, i = 1, 10)
        print *, i

        i = 99
        print *, i
        print *, [(i, i = 1, 10)]
        print *, i
end program Hello

一個目は loop を抜けた後で i=11 になっているのに、二個目は loop を抜けても loop に入る前の値の i=99 を保っている。

$main
          99
           1           2           3           4           5           6           7           8           9          10
          11
          99
           1           2           3           4           5           6           7           8           9          10
          99