

次のCの関数をFortranから呼び出すFFIを書く必要があります

[code]

    typedef struct {
      int x, y;
    } int2;
    
    int2 f(int2 a) {
      int2 b;
      b.x = 2 * a.x;
      b.y = 2 * a.y;
      return b;
    }
    
[/code]

この関数を呼び出すためのFFIを次のように書いてみました(test.f03)

[code]

    module mymod
      type :: int2
        integer :: x, y
      end type
      interface
        function f(a) result(b)
          type(int2) :: a, b
        end function
      end interface
    end module
    
[/code]

しかし以下のようなコンパイルエラーとなります

[code]

    test.f03:8:16:
    
           type(int2) :: a, b
                    1
    Error: Derived type ‘int2’ at (1) is being used before it is defined
    
[/code]

エラーメッセージは定義前に`int2`型を使用していると読めますが、どのようにすれば（どこで定義すれば）interface内でint2を使うことが出来ますか？

使用したコンパイラ：

[code]

    $ gfortran --version
    GNU Fortran (GCC) 8.2.1 20181127
    Copyright (C) 2018 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
[/code]


CC BY-SA 4.0
2019-05-27T19:20:53.220
55297
2019-05-28T06:00:13.647
9572
question
fortran
Fortranでinterfaceを書く際の型の定義


リンクを頂いたので自己回答しておきます  
<https://stackoverflow.com/a/13858145>

[code]

    module mymod
      type :: int2
        integer :: x, y
      end type
      interface
        function f(a) result(b)
          import :: int2         ! import explicitly
          type(int2) :: a, b
        end function
      end interface
    end module
    
[/code]

のように明示的に`import`を行うことで解決できます。  
これはFortran2003で追加された機能で、例えば以下に解説があります  
<http://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_8_6.html>


CC BY-SA 4.0
2019-05-28T06:00:13.647
55310
2019-05-28T06:00:13.647
9572
55297
answer