Fortran90(type)

Fortran続きです。なんとFortranでも構造体が使えるんですね。ということで使ってみます。
typeとend typeの間にメンバ変数を定義します。

takk@deb9:~$ cat type.f90
      program main
        type test
          integer i
          character*10 name
        end type test

        type(test) a
        a = test(1,'aaaa')

        write(*,*) a%name
        write(*,*) a%i
        stop
      end
takk@deb9:~$ gfortran type.f90
takk@deb9:~$ ./a.out
 aaaa
           1
takk@deb9:~$

構造体の変数名%メンバ名でアクセスできます。
当然ですが構造体は型なので、量産できます。

takk@deb9:~$ cat type.f90
      program main
        type test
          integer i
          character*10 name
        end type test

        type(test) a,b,c
        a = test(1,'aaaa')
        b = test(10,'bbbb')
        c = test(100,'cccc')

        write(*,*) a%name
        write(*,*) a%i
        write(*,*) b%name
        write(*,*) b%i
        write(*,*) c%name
        write(*,*) c%i
        stop
      end
takk@deb9:~$ gfortran type.f90
takk@deb9:~$ ./a.out
 aaaa
           1
 bbbb
          10
 cccc
         100
takk@deb9:~$

構造体変数の定義は、途中で追加するのはエラーになるようです。

takk@deb9:~$ cat type2.f90
      program main
        type test
          integer i
          character*10 name
        end type test

        type(test) a
        a = test(1,'aaaa')

        write(*,*) a%name
        write(*,*) a%i

        type(test) b,c
        b = test(10,'bbbb')
        c = test(100,'cccc')

        write(*,*) b%name
        write(*,*) b%i
        write(*,*) c%name
        write(*,*) c%i
        stop
      end
takk@deb9:~$ gfortran type2.f90
type2.f90:13:22:

         type(test) b,c
                      1
Error: Unexpected data declaration statement at (1)
type2.f90:17:21:

         write(*,*) b%name
                     1
Error: Symbol ‘b’ at (1) has no IMPLICIT type
type2.f90:18:21:

         write(*,*) b%i
                     1
Error: Symbol ‘b’ at (1) has no IMPLICIT type
type2.f90:19:21:

         write(*,*) c%name
                     1
Error: Symbol ‘c’ at (1) has no IMPLICIT type
type2.f90:20:21:

         write(*,*) c%i
                     1
Error: Symbol ‘c’ at (1) has no IMPLICIT type
type2.f90:14:12:

         b = test(10,'bbbb')
            1
Error: Can't convert TYPE(test) to REAL(4) at (1)
type2.f90:15:12:

         c = test(100,'cccc')
            1
Error: Can't convert TYPE(test) to REAL(4) at (1)
takk@deb9:~$

まあこれは構造体に限ったことではなく、変数の宣言が最初にないといけないのと同じですね。

takk@deb9:~$ cat var.f90
      program main
        integer i
        i = 1
        write(*,*) i

        integer j
        j = 2
        write(*,*) j
        stop
      end
takk@deb9:~$ gfortran var.f90
var.f90:6:17:

         integer j
                 1
Error: Unexpected data declaration statement at (1)
takk@deb9:~$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA