[ruby-list:50003] fiddleから構造体の値渡しをするには?
From:
birth ggd <gameovera@...>
Date:
2014-11-19 08:56:43 UTC
List:
ruby-list #50003
はじめましてbirthggdです。
標準ライブラリのfiddleをつかった構造体の値渡しの方法がわかりません。
とりあえずFiddle::Importer#externで指定するシグネチャを
参照渡しの時と同じ'void*'にして試したのですが構造体のサイズ(かメンバ数)
によって動作が異なります。
/* c_func.c */
#include <stdio.h>
struct Foo {
int x;
int y;
};
void __stdcall __declspec(dllexport) call_by_value(struct Foo foo)
{
printf("%d, %d\n", foo.x, foo.y);
}
$gcc -c c_func.c
$gcc -shared -o c_func.dll c_func.o
ビルドにつかったコンパイラはmingw-w64 gcc 4.9.1です。
# main.rb
require 'fiddle/import'
module A
extend Fiddle::Importer
dlload 'c_func.dll'
Foo = struct ['int x', 'int y']
extern 'void call_by_value(void*)'
end
foo = A::Foo.malloc
foo.x = 1
foo.y = 2
A.call_by_value(foo)
上記を実行すると以下のような結果になります(値は毎回かわります)。
$ruby main.rb
47388848, 0
しかし、C側の構造体にint zを足しリビルドすると結果は以下になります。
$ruby main.rb
1, 2
実行環境はWindows 7 64bitでrubyinstallerのRuby 2.1.5 (x64)です。
fiddleは構造体の値渡しをサポートしているのか、
している場合、正しい方法が知りたいです。