

C言語で以下のようなdllを作成しました。

[code]

    void example(int *a)
    {
    　for (int i = 0; i < 10; ++i) {
    　　a[i] += 1;
    　}
    }
    
[/code]

このdllに対し、rubyの配列 `hoge[0,0,0,0,0,0,0,0,0,0]` を渡し、処理された配列
`hoge'[1,1,1,1,1,1,1,1,1,1]` をruby側で受け取るにはどうすれば良いのでしょうか。

dllの呼び出しは、

[code]

    Win32API.new(DLL_NAME, 'example', 'p', 'v')
    
[/code]

を使用しております。

ご解答、宜しくお願い致します。


CC BY-SA 3.0
2016-02-20T09:45:55.890
22312
2016-06-07T08:17:51.943
2016-02-20T10:06:19.107
14482
14482
question
ruby c array
rubyの配列をdllに渡して、dllで処理された配列をrubyで受け取る方法について


windows が無いので、mac の情報で恐縮ですが、`ruby 2.2.0` だと下記で出来ました。

[code]

    # test.rb
    require "fiddle/import"
    module M
      extend Fiddle::Importer
      dlload "libtest.dylib"
      extern "void example(int *a)"
    end
    
    hoge = [0] * 10
    p hoge
    hoge = hoge.pack('i*')
    M.example(hoge)
    p hoge.unpack('i*')
    
[/code]

実行結果は下記です。

[code]

    $ ruby test.rb
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    
[/code]

ruby 2.2 からは fiddle を使うそうです。windows でも使えるのではないかと思います。

> library fiddle  
>  _.dllや_.soなど、ダイナミックリンクライブラリを扱うためのライブラリです。

<http://docs.ruby-lang.org/ja/2.1.0/library/fiddle.html>

配列をやりとりするには、文字列に変換する必要があるらしいので、pack, unpack を使っています。

> ○○の配列を関数に渡したい  
>  これを呼び出したい場合は以下のように Array#pack を使用します。

<http://docs.ruby-lang.org/ja/2.0.0/library/fiddle=2fimport.html>


CC BY-SA 3.0
2016-02-20T13:30:36.623
22318
2016-02-20T13:30:36.623
7471
22312
answer