4

最近、C コードの便利なスニペットのために、Fortran から C 関数を呼び出したいという状況に遭遇しました。配列操作の便宜上、この関数を配列引数でも呼び出せるようにしたかったのですが、スカラー引数しか受け入れられませんでした。

Fortran では、もちろん、elementalこれを実現するために単純に手続きを宣言できます。また、C 手続きへのインターフェイスをbind(C). ただし、C には要素手続きの概念がないため、Fortran (2008) 標準はこの組み合わせを除外しています。

C1246 要素手続きは BIND 属性を持ってはならない.

では、この機能は Fortran で実現できますか?

4

1 に答える 1

7

いくつか検索した結果、Fortran 2003 とiso_c_binding組み込みモジュールを使用すると、これが可能であり、非常に簡単であることがわかりました。これをここに文書化する必要があると思いました。属性を持つインターフェースはbind引き続き.pureelemental

isnan以下は、引数が NaN の場合にゼロ以外の整数値を返すC99 マクロの短い例です。もちろん、これは、副作用のないユーザー定義の C/C++ 関数に対しても実行できます。

elemental function isnan(val)
  use, intrinsic :: iso_c_binding
  implicit none

  real(c_double), intent(in) :: val
  logical(c_bool) :: isnan

  interface
    pure function isnan_C(val) bind(C, name = 'isnan')
      import
      ! Pass the parameter by value:
      real(c_double), value, intent(in) :: val
      integer(c_int) :: isnan_C
    end function
  end interface

  isnan = isnan_C(val) /= 0_c_int
end function

いくつかの NaN 値を持つ配列を使用した出力例:

program main
  use, intrinsic :: iso_c_binding
  implicit none

  real(c_double) :: nan(2,2) = 0.
  nan(:,2) = nan(1,1)/0.

  write(*,'(4F6.2 / 4L6)') nan, isnan(nan) ! Output: 0.00 0.00  NaN  NaN
                                           !            F    F    T    T
end program
于 2012-12-07T13:31:17.747 に答える