読者です 読者をやめる 読者になる 読者になる

fortran66のブログ

fortran について書きます。

Ruby から Fortran

メモ帳 Ruby全く知らないw

インストール

Ruby 64bit は何故かエラーが出て動かないので、32bit版で。DevKit もいれると GFortran が使える。

https://www.ruby-lang.org/ja/installation/#rubyinstaller

gem install ffi

で何とかなる。

Fortran

DLL を作る。デフォルトの呼び出し規約でいい模様。

gfortran --shared -o test.dll test.f90

subroutine test() bind(c, name = 'test')
  implicit none
  print *, 'test'
  return
end subroutine test

integer function aaa(i) bind(c, name = 'aaa')
  implicit none
  integer, value :: i
  aaa = i * i 
  return
end function aaa

subroutine bbb(i) bind(c, name = 'bbb')
  implicit none
  integer, intent(IN OUT) :: i
  i = 9999
  return
end subroutine bbb

!gfortran --shared -o test.dll test.f90

Ruby

require 'ffi'

module FooLib
  extend FFI::Library
  ffi_lib "test.dll"

  attach_function :test, [], :void
  attach_function :aaa, [:int], :int
  attach_function :bbb, [:pointer], :void
end




p FooLib.test()


p FooLib.aaa(10)



n_ptr = FFI::MemoryPointer.new :int 
p FooLib.bbb(n_ptr)
n = n_ptr.read_int
p n

Fortran 関数の返り値が値で返されているのか番地で返されているのか不明だが、とりあえず値型でおk?

参考ページ http://kazegusuri.hateblo.jp/entry/2014/03/02/192729