1

fortran インターフェイスをスタンドアロン ライブラリとしてパッケージ化したいと考えています。これは、c/c++ のヘッド ファイルに似たものです。これが私のコードです。問題は、「hello」サブルーチンを実行するために「hello」サブルーチンを呼び出したいことです。誰でも私を助けることができますか?

Interface と set_callback,invoke_callback をスタンドアロンのモジュール ファイルとして配置したいと考えています。

MODULE DEMO
  INTERFACE
    SUBROUTINE callback_prototype(callbackID)
        CHARACTER(*) :: callbackID
    END SUBROUTINE callback_prototype
  END INTERFACE

  PROCEDURE( callback_prototype ), POINTER :: f_ptr => NULL()

  CONTAINS
  SUBROUTINE set_callback(func)
     IMPLICIT NONE
     EXTERNAL :: func

      f_ptr => func
      call HELLO
  END SUBROUTINE

  SUBROUTINE invoke_callback(callbackID)
      CHARACTER(*) :: callbackID
      if (associated(f_ptr)) call f_ptr(callbackID)
  END SUBROUTINE

  SUBROUTINE HELLO

  IMPLICIT NONE

  Dosomething

  END SUBROUTINE
END MODULE
4

1 に答える 1

1

これはサブモジュールで簡単に可能ですが、残念ながらそれらは広く利用可能ではありません. したがって、現在の解決策は、「hello」を暗黙的なインターフェースを持つ外部関数として使用し、それを別のファイルに入れることだと思います。

更新:コードに基づくいくつかの例。

subroutine HELLO
  implicit none

  write(*,*) 'HELLO'

end subroutine HELLO

module demo
  implicit none

  interface
    subroutine callback_prototype(callbackID)
      character(*) :: callbackID
    end subroutine callback_prototype
  end interface

  procedure(callback_prototype), pointer :: f_ptr => NULL()

contains

  subroutine set_callback(func)
    procedure(callback_prototype) :: func
    external :: HELLO

    f_ptr => func
    call HELLO()
  end subroutine set_callback

  subroutine invoke_callback(callbackID)
    character(*) :: callbackID
    if (associated(f_ptr)) call f_ptr(callbackID)
  end subroutine invoke_callback

end module demo

program test_demo
  use demo

  implicit none

  write(*,*) 'small program'
end program test_demo

これをファイル test.f90 に入れて、「gfortran test.f90」を実行すると、実行可能ファイルが生成されます。もちろん、それらを分離したい場合は、各部分を別々のファイルに入れることをお勧めします。次に、「hello」を含むオブジェクト ファイルがリンク時に含まれていることを確認する必要があります。また、Vladimir_F で指摘されているように、インターフェイス宣言を使用して、ルーチンを呼び出している明示的なインターフェイスをルーチンに装備できます。

2 回目の更新:

これらを3つの異なるファイルに入れると

  • こんにちは.f90
  • demo.f90
  • test.f90

次のように、それらから実行可能ファイルをコンパイルできるはずです。

gfortran -c demo.f90 hello.f90 test.f90
gfortran *.o

1 行目でオブジェクト ファイルを作成し、2 行目でそれらをリンクします。順序が重要であることに注意してください。demo.f90 のモジュール情報は、test.f90 をコンパイルする前に利用可能である必要があります。

于 2013-11-01T21:42:59.747 に答える