[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は構造体の値渡しをサポートしているのか、
している場合、正しい方法が知りたいです。 		 	   		  

In This Thread

Prev Next